用opencv绘制图形(使用qt和opencv绘制旋转的太极图)(1)

太极八卦阵简介:

太极八卦阵,是中国传统武术中的一种战术阵法,也被称作“八卦大阵”、“太极大阵”等。太极八卦阵最早出现在《易经》中,是由八个卦象组成的阵法,每个卦象代表着一种不同的自然元素或方位,通过不同的排列组合形成阵法,以达到控制、牵制、包围敌人的目的。

太极八卦阵中的八个卦象分别为乾、坤、震、巽、坎、离、艮、兑,这八个卦象分别代表着天、地、雷、风、水、火、山、泽八个自然元素。在太极八卦阵中,这八个卦象会按照特定的排列组合,形成不同的阵法,如四方八卦阵、三才八卦阵、九宫八卦阵等。

太极八卦阵的使用需要严格的组织和指挥,阵中武者需按照特定的位置和角色进行布置。阵中有主将、副将、掌旗官、护卫、前锋、后卫等不同的角色,各自负责不同的任务。太极八卦阵的使用需要充分考虑敌方的情况,根据敌方的数量、兵种、阵型等因素进行灵活调整,以达到最好的效果。

太极八卦阵在中国历史上曾多次被应用于战争中,如三国时期的赤壁之战、明朝的平西王之乱等,都有太极八卦阵的身影。同时,太极八卦阵也被广泛应用于中国传统武术中,如太极拳、八卦掌等,成为了这些武术的核心内容之一。

总之,太极八卦阵是中国传统文化中的重要组成部分,它不仅是一种战术阵法,更是一种哲学思想的体现。在今天,太极八卦阵的应用已经不仅限于武术和战争,还被广泛应用于团队建设、管理等领域,成为了一种独特的文化符号。

使用C 代码实现:

mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTimer> #include <opencv2/opencv.hpp> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_spinBox_valueChanged(int arg1); void on_spinBox_2_valueChanged(int arg1); private slots: void updateImage(); private: Ui::MainWindow *ui; cv::Mat _img; int _angle; double _speed; QTimer _timer; }; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h" #include "./ui_mainwindow.h" #include <QDebug> #include <opencv2/opencv.hpp> using namespace cv; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 创建一个黑色的图像 _img = Mat::zeros(512, 512, CV_8UC3); // 在图像中央绘制一个白色的圆形 circle(_img, Point(256, 256), 200, Scalar(255, 255, 255), -1); // 在图像左侧绘制一个黑色的半圆形 ellipse(_img, Point(256, 256), Size(200, 200), 0, 90, 270, Scalar(0, 0, 0), -1); // 在图像右侧绘制一个白色的半圆形 ellipse(_img, Point(256, 256), Size(200, 200), 0, -90, 90, Scalar(255, 255, 255), -1); // 在图像中心绘制两个小圆点,一个黑色、一个白色 circle(_img, Point(256, 156), 100, Scalar(0, 0, 0), -1); circle(_img, Point(256, 356), 100, Scalar(255, 255, 255), -1); // 绘制两个小圆 circle(_img, Point(256, 156), 50, Scalar(255, 255, 255), -1); circle(_img, Point(256, 356), 50, Scalar(0, 0, 0), -1); // 初始化旋转角度和速度 _angle = 0; _speed = ui->spinBox_2->value(); // 设置定时器 connect(&_timer, SIGNAL(timeout()), this, SLOT(updateImage())); _timer.start(10); // 每10毫秒更新一次图像 } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_spinBox_valueChanged(int arg1) { qDebug() << "speed:" << arg1; _speed = arg1 / 1.0f; } void MainWindow::on_spinBox_2_valueChanged(int arg1) { qDebug() << "timer:" << arg1; _timer.setInterval(arg1); // 修改定时器间隔 // _timer.start(); } void MainWindow::updateImage() { // 计算旋转角度 _angle = fmod(_angle _speed, 360); // 旋转图像 Mat rot = getRotationMatrix2D(Point(256, 256), _angle, 1.0); Mat rotated; warpAffine(_img, rotated, rot, _img.size()); // 显示旋转后的图像 QImage q_img(rotated.data, rotated.cols, rotated.rows, rotated.step, QImage::Format_RGB888); ui->label->setPixmap(QPixmap::fromImage(q_img)); }

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QSpinBox" name="spinBox_2"> <property name="maximum"> <number>10000</number> </property> </widget> </item> <item> <widget class="QSpinBox" name="spinBox"> <property name="maximum"> <number>10000</number> </property> </widget> </item> </layout> </item> </layout> </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>23</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui>

在Qt Designer中创建一个主窗口,添加一个QLabel控件用于显示图像,添加两个QSpinBox控件用于控制旋转速度和定时器间隔,然后在MainWindow类的构造函数中初始化这些控件。

运行后,可以通过修改QSpinBox控件的值来控制旋转速度和定时器间隔,从而实现旋转功能。

,