├── OpencvDevelop.pro ├── OpencvDevelop.pro.user ├── README.md ├── codewidget.cpp ├── codewidget.h ├── codewidget.ui ├── histogtamdlg.cpp ├── histogtamdlg.h ├── histogtamdlg.ui ├── imagelook.cpp ├── imagelook.h ├── imagelook.ui ├── images ├── Chart_128.png ├── Chart_128gray.png ├── Chart_32.png ├── Chart_32gray.png ├── Chart_64gray.png ├── Chart_64t.png ├── Gray_24px.png ├── Mirror_Horizontally_32.png ├── Mirror_Vertically_32.png ├── editcopy.png ├── editcut.png ├── editpaste.png ├── editredo.png ├── editundo.png ├── eye_24px.png ├── eye_32px.png ├── eye_64px.png ├── eye_72px.png ├── filenew.png ├── fileopen.png ├── fileprint.png ├── filesave.png ├── fushi.png ├── textbold.png ├── textcenter.png ├── textitalic.png ├── textjustify.png ├── textleft.png ├── textright.png └── textunder.png ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui ├── myimagelist.cpp ├── myimagelist.h ├── myimagelist.ui ├── mypixitem.cpp ├── mypixitem.h ├── rc.qrc ├── showhistogtamresult.cpp ├── showhistogtamresult.h ├── showhistogtamresult.ui ├── variatedialog.cpp └── variatedialog.h /OpencvDevelop.pro: -------------------------------------------------------------------------------- 1 | #------------------------------------------------- 2 | # 3 | # Project created by QtCreator 2017-06-23T18:59:40 4 | # 5 | #------------------------------------------------- 6 | 7 | QT += core gui 8 | 9 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 10 | 11 | TARGET = OpencvDevelop 12 | TEMPLATE = app 13 | 14 | # The following define makes your compiler emit warnings if you use 15 | # any feature of Qt which as been marked as deprecated (the exact warnings 16 | # depend on your compiler). Please consult the documentation of the 17 | # deprecated API in order to know how to port your code away from it. 18 | DEFINES += QT_DEPRECATED_WARNINGS 19 | 20 | # You can also make your code fail to compile if you use deprecated APIs. 21 | # In order to do so, uncomment the following line. 22 | # You can also select to disable deprecated APIs only up to a certain version of Qt. 23 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 24 | 25 | 26 | 27 | 28 | #INCLUDEPATH+=D:/opencv/build/include 29 | #INCLUDEPATH+=D:/opencv/build/include/opencv 30 | #INCLUDEPATH+=D:/opencv/build/include/opencv2 31 | 32 | #win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../opencv/build/x64/vc14/lib/ -lopencv_world320 33 | #else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../opencv/build/x64/vc14/lib/ -lopencv_world320d 34 | #else:unix: LIBS += -L$$PWD/../../opencv/build/x64/vc14/lib/ -lopencv_world320 35 | 36 | #INCLUDEPATH += $$PWD/../../opencv/build/x64/vc14 37 | #DEPENDPATH += $$PWD/../../opencv/build/x64/vc14 38 | 39 | 40 | 41 | 42 | 43 | INCLUDEPATH+=C:/opencv/include 44 | INCLUDEPATH+=C:/opencv/include/opencv 45 | INCLUDEPATH+=C:/opencv/include/opencv2 46 | 47 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_aruco320d 48 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_bgsegm320d 49 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_bioinspired320d 50 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_calib3d320d 51 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_ccalib320d 52 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_core320d 53 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_datasets320d 54 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_dnn320d 55 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_dpm320d 56 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_face320d 57 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_features2d320d 58 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_flann320d 59 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_fuzzy320d 60 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_highgui320d 61 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_imgcodecs320d 62 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_imgproc320d 63 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_line_descriptor320d 64 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_ml320d 65 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_objdetect320d 66 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_optflow320d 67 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_phase_unwrapping320d 68 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_photo320d 69 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_plot320d 70 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_reg320d 71 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_rgbd320d 72 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_saliency320d 73 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_shape320d 74 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_stereo320d 75 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_stitching320d 76 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_structured_light320d 77 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_superres320d 78 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_surface_matching320d 79 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_text320d 80 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_tracking320d 81 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_video320d 82 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_videoio320d 83 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_videostab320d 84 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_xfeatures2d320d 85 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_ximgproc320d 86 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_xobjdetect320d 87 | unix|win32: LIBS += -LC:/opencv/x64/vc14/lib/ -lopencv_xphoto320d 88 | 89 | INCLUDEPATH += C:/opencv/x64/vc14 90 | DEPENDPATH += C:/opencv/x64/vc14 91 | 92 | 93 | SOURCES += main.cpp\ 94 | mainwindow.cpp \ 95 | imagelook.cpp \ 96 | mypixitem.cpp \ 97 | myimagelist.cpp \ 98 | codewidget.cpp \ 99 | variatedialog.cpp \ 100 | histogtamdlg.cpp \ 101 | showhistogtamresult.cpp 102 | 103 | HEADERS += mainwindow.h \ 104 | imagelook.h \ 105 | mypixitem.h \ 106 | myimagelist.h \ 107 | codewidget.h \ 108 | variatedialog.h \ 109 | histogtamdlg.h \ 110 | showhistogtamresult.h 111 | 112 | FORMS += mainwindow.ui \ 113 | imagelook.ui \ 114 | myimagelist.ui \ 115 | codewidget.ui \ 116 | histogtamdlg.ui \ 117 | showhistogtamresult.ui 118 | 119 | RESOURCES += \ 120 | rc.qrc 121 | -------------------------------------------------------------------------------- /OpencvDevelop.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {013529c3-804e-419a-913d-1a68f5b9bafb} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | true 41 | false 42 | 0 43 | true 44 | true 45 | 0 46 | 8 47 | true 48 | 0 49 | true 50 | true 51 | true 52 | false 53 | 54 | 55 | 56 | ProjectExplorer.Project.PluginSettings 57 | 58 | 59 | -fno-delayed-template-parsing 60 | 61 | true 62 | 63 | 64 | 65 | ProjectExplorer.Project.Target.0 66 | 67 | Desktop Qt 5.12.0 MSVC2015 64bit 68 | Desktop Qt 5.12.0 MSVC2015 64bit 69 | qt.qt5.5120.win64_msvc2015_64_kit 70 | 0 71 | 0 72 | 0 73 | 74 | D:/code/QtLearning/build-OpencvDevelop-Desktop_Qt_5_12_0_MSVC2015_64bit-Debug 75 | 76 | 77 | true 78 | qmake 79 | 80 | QtProjectManager.QMakeBuildStep 81 | true 82 | 83 | false 84 | false 85 | false 86 | 87 | 88 | true 89 | Make 90 | 91 | Qt4ProjectManager.MakeStep 92 | 93 | false 94 | 95 | 96 | false 97 | 98 | 2 99 | Build 100 | 101 | ProjectExplorer.BuildSteps.Build 102 | 103 | 104 | 105 | true 106 | Make 107 | 108 | Qt4ProjectManager.MakeStep 109 | 110 | true 111 | clean 112 | 113 | false 114 | 115 | 1 116 | Clean 117 | 118 | ProjectExplorer.BuildSteps.Clean 119 | 120 | 2 121 | false 122 | 123 | Debug 124 | Debug 125 | Qt4ProjectManager.Qt4BuildConfiguration 126 | 2 127 | true 128 | 129 | 130 | D:/code/QtLearning/build-OpencvDevelop-Desktop_Qt_5_12_0_MSVC2015_64bit-Release 131 | 132 | 133 | true 134 | qmake 135 | 136 | QtProjectManager.QMakeBuildStep 137 | false 138 | 139 | false 140 | false 141 | true 142 | 143 | 144 | true 145 | Make 146 | 147 | Qt4ProjectManager.MakeStep 148 | 149 | false 150 | 151 | 152 | false 153 | 154 | 2 155 | Build 156 | 157 | ProjectExplorer.BuildSteps.Build 158 | 159 | 160 | 161 | true 162 | Make 163 | 164 | Qt4ProjectManager.MakeStep 165 | 166 | true 167 | clean 168 | 169 | false 170 | 171 | 1 172 | Clean 173 | 174 | ProjectExplorer.BuildSteps.Clean 175 | 176 | 2 177 | false 178 | 179 | Release 180 | Release 181 | Qt4ProjectManager.Qt4BuildConfiguration 182 | 0 183 | true 184 | 185 | 186 | D:/code/QtLearning/build-OpencvDevelop-Desktop_Qt_5_12_0_MSVC2015_64bit-Profile 187 | 188 | 189 | true 190 | qmake 191 | 192 | QtProjectManager.QMakeBuildStep 193 | true 194 | 195 | false 196 | true 197 | true 198 | 199 | 200 | true 201 | Make 202 | 203 | Qt4ProjectManager.MakeStep 204 | 205 | false 206 | 207 | 208 | false 209 | 210 | 2 211 | Build 212 | 213 | ProjectExplorer.BuildSteps.Build 214 | 215 | 216 | 217 | true 218 | Make 219 | 220 | Qt4ProjectManager.MakeStep 221 | 222 | true 223 | clean 224 | 225 | false 226 | 227 | 1 228 | Clean 229 | 230 | ProjectExplorer.BuildSteps.Clean 231 | 232 | 2 233 | false 234 | 235 | Profile 236 | Profile 237 | Qt4ProjectManager.Qt4BuildConfiguration 238 | 0 239 | true 240 | 241 | 3 242 | 243 | 244 | 0 245 | 部署 246 | 247 | ProjectExplorer.BuildSteps.Deploy 248 | 249 | 1 250 | Deploy Configuration 251 | 252 | ProjectExplorer.DefaultDeployConfiguration 253 | 254 | 1 255 | 256 | 257 | false 258 | false 259 | 1000 260 | 261 | true 262 | 263 | false 264 | false 265 | false 266 | false 267 | true 268 | 0.01 269 | 10 270 | true 271 | 1 272 | 25 273 | 274 | 1 275 | true 276 | false 277 | true 278 | valgrind 279 | 280 | 0 281 | 1 282 | 2 283 | 3 284 | 4 285 | 5 286 | 6 287 | 7 288 | 8 289 | 9 290 | 10 291 | 11 292 | 12 293 | 13 294 | 14 295 | 296 | 2 297 | 298 | OpencvDevelop 299 | 300 | Qt4ProjectManager.Qt4RunConfiguration:D:/code/QtLearning/OpencvDevelop/OpencvDevelop.pro 301 | OpencvDevelop.pro 302 | 303 | 3768 304 | false 305 | true 306 | true 307 | false 308 | false 309 | true 310 | 311 | D:/code/QtLearning/build-OpencvDevelop-Desktop_Qt_5_12_0_MSVC2015_64bit-Debug 312 | 313 | 1 314 | 315 | 316 | 317 | ProjectExplorer.Project.TargetCount 318 | 1 319 | 320 | 321 | ProjectExplorer.Project.Updater.FileVersion 322 | 20 323 | 324 | 325 | Version 326 | 20 327 | 328 | 329 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/README.md -------------------------------------------------------------------------------- /codewidget.cpp: -------------------------------------------------------------------------------- 1 | #include "codewidget.h" 2 | #include "ui_codewidget.h" 3 | 4 | codeWidget::codeWidget(QWidget *parent) : 5 | QWidget(parent), 6 | ui(new Ui::codeWidget) 7 | { 8 | ui->setupUi(this); 9 | fontsize=10; 10 | } 11 | 12 | codeWidget::~codeWidget() 13 | { 14 | delete ui; 15 | } 16 | 17 | void codeWidget::receiveStr(int rows, QString codes) 18 | { 19 | if(rows==0) 20 | { 21 | ui->textEdit->clear(); 22 | } 23 | ui->textEdit->moveCursor(QTextCursor::End); 24 | ui->textEdit->insertPlainText(codes);//setText(codes); 25 | ui->textEdit->setFont(QFont("Timers" , fontsize , QFont::Bold)); 26 | //insertPlainText("456"); 27 | } 28 | 29 | void codeWidget::on_spinBox_valueChanged(int arg1) 30 | { 31 | 32 | fontsize=arg1; 33 | ui->textEdit->setFont(QFont("Timers" , fontsize , QFont::Bold)); 34 | } 35 | -------------------------------------------------------------------------------- /codewidget.h: -------------------------------------------------------------------------------- 1 | #ifndef CODEWIDGET_H 2 | #define CODEWIDGET_H 3 | 4 | #include 5 | 6 | namespace Ui { 7 | class codeWidget; 8 | } 9 | 10 | class codeWidget : public QWidget 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | explicit codeWidget(QWidget *parent = 0); 16 | ~codeWidget(); 17 | 18 | private slots: 19 | void receiveStr(int,QString); 20 | 21 | void on_spinBox_valueChanged(int arg1); 22 | 23 | private: 24 | Ui::codeWidget *ui; 25 | 26 | int fontsize; 27 | }; 28 | 29 | #endif // CODEWIDGET_H 30 | -------------------------------------------------------------------------------- /codewidget.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | codeWidget 4 | 5 | 6 | 7 | 0 8 | 0 9 | 500 10 | 380 11 | 12 | 13 | 14 | 程序流程窗口 15 | 16 | 17 | 18 | 1 19 | 20 | 21 | 1 22 | 23 | 24 | 1 25 | 26 | 27 | 1 28 | 29 | 30 | 1 31 | 32 | 33 | 34 | 35 | 36 | 37 | Qt::Horizontal 38 | 39 | 40 | 41 | 40 42 | 20 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 算子: 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 字体大小: 61 | 62 | 63 | 64 | 65 | 66 | 67 | 1 68 | 69 | 70 | 28 71 | 72 | 73 | 10 74 | 75 | 76 | 77 | 78 | 79 | 80 | Qt::Horizontal 81 | 82 | 83 | 84 | 40 85 | 20 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | QTextEdit::NoWrap 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /histogtamdlg.cpp: -------------------------------------------------------------------------------- 1 | #include "histogtamdlg.h" 2 | #include "ui_histogtamdlg.h" 3 | #include 4 | #include 5 | 6 | #pragma execution_character_set("utf-8") 7 | 8 | 9 | HistogtamDlg::HistogtamDlg(QWidget *parent) : 10 | QWidget(parent), 11 | ui(new Ui::HistogtamDlg) 12 | { 13 | ui->setupUi(this); 14 | 15 | Mat matImage; 16 | for (int i=0;i<10;++i){ 17 | matImage = Mat(Size(2200, 2200), CV_8UC3);//大小2200*2200像素图片大了会报错 18 | m_listMat_glob<left_spinBox,SIGNAL(valueChanged(int)), 25 | ui->left_horizontalSlider,SLOT(setValue(int)));//spinBox值与滑条对应 26 | 27 | QObject::connect(ui->left_horizontalSlider,SIGNAL(valueChanged(int)), 28 | ui->left_spinBox,SLOT(setValue(int)));//滑条与spinBox值对应 29 | 30 | 31 | QObject::connect(ui->right_spinBox,SIGNAL(valueChanged(int)), 32 | ui->right_horizontalSlider,SLOT(setValue(int)));//spinBox值与滑条对应 33 | 34 | QObject::connect(ui->right_horizontalSlider,SIGNAL(valueChanged(int)), 35 | ui->right_spinBox,SLOT(setValue(int)));//滑条与spinBox值对应 36 | 37 | // QObject::connect(ui->left_spinBox,SIGNAL(valueChanged(int)), 38 | // this,SLOT(Threshold_SetValue(int)));//spinBox值对应对应刷新 39 | 40 | // QObject::connect(ui->right_spinBox,SIGNAL(valueChanged(int)), 41 | // this,SLOT(Threshold_SetValue2(int)));//spinBox值对应刷新 42 | 43 | // ui->histogtam_label->setScaledContents(true);//自动调整为Qlabel大小。 44 | 45 | connect(ui->left_horizontalSlider,SIGNAL(sliderReleased()),this,SLOT(setLeftValue())); 46 | connect(ui->right_horizontalSlider,SIGNAL(sliderReleased()),this,SLOT(setRightValue())); 47 | connect(ui->left_spinBox,SIGNAL(valueChanged(int)),this,SLOT(setHistogtamRe(int))); 48 | connect(ui->right_spinBox,SIGNAL(valueChanged(int)),this,SLOT(setHistogtamRe(int))); 49 | 50 | } 51 | 52 | 53 | HistogtamDlg::~HistogtamDlg() 54 | { 55 | delete ui; 56 | } 57 | 58 | 59 | 60 | 61 | void HistogtamDlg::receiveDataForHistogtamdlg(QList m_listVatiate,QList m_listMat) 62 | { 63 | for(int i=0;icomboBox->addItem(stri); 67 | } 68 | 69 | if(m_listVatiate.size()>9) 70 | { 71 | Mat matImage = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 72 | m_listMat_glob.append(matImage); 73 | } 74 | m_listMat_glob=m_listMat;//list全局,对应的mat组 75 | m_listVatiate_glob=m_listVatiate; //lisr全局存储,对应的变量名字 76 | // createHistogtam(m_listMat_glob.at(0)); 77 | // setPicture(result_Histogtam_Mat); 78 | 79 | 80 | //读取combobox对应的图 81 | for(int i=0;icomboBox->currentText()) 85 | { 86 | globalMat=m_listMat_glob.at(i).clone(); 87 | break; 88 | } 89 | } 90 | 91 | // globalMat=m_listMat_glob.at(0).clone();//新添加全局mat变量 92 | 93 | createHistogramGray();//创建直方图 94 | setHistogtam();//添加直方图 95 | 96 | } 97 | 98 | void HistogtamDlg::closeEvent(QCloseEvent *event) 99 | { 100 | 101 | 102 | QMessageBox mesg3; 103 | mesg3.about(NULL,"信息","关闭窗口了"); 104 | 105 | this->setAttribute(Qt::WA_DeleteOnClose); 106 | 107 | //在这里添加你希望执行关闭事件需要处理的事情 108 | //弹出消息框,关闭其他窗口 109 | } 110 | 111 | 112 | void HistogtamDlg::refreshSenddata() 113 | { 114 | emit sendToShowhistogtam(resultMat, 115 | ui->left_horizontalSlider->value(), 116 | ui->right_horizontalSlider->value()); 117 | 118 | } 119 | 120 | 121 | ////////////////////2017.10.22////////修复实验 122 | 123 | QImage HistogtamDlg::MatToQImage(const cv::Mat& mat) 124 | { 125 | // 8-bits unsigned, NO. OF CHANNELS = 1 126 | if (mat.type() == CV_8UC1) 127 | { 128 | QImage image(mat.cols, mat.rows, QImage::Format_Indexed8); 129 | // Set the color table (used to translate colour indexes to qRgb values) 130 | image.setColorCount(256); 131 | for (int i = 0; i < 256; i++) 132 | { 133 | image.setColor(i, qRgb(i, i, i)); 134 | } 135 | // Copy input Mat 136 | uchar *pSrc = mat.data; 137 | for (int row = 0; row < mat.rows; row++) 138 | { 139 | uchar *pDest = image.scanLine(row); 140 | memcpy(pDest, pSrc, mat.cols); 141 | pSrc += mat.step; 142 | } 143 | return image; 144 | } 145 | // 8-bits unsigned, NO. OF CHANNELS = 3 146 | else if (mat.type() == CV_8UC3) 147 | { 148 | // Copy input Mat 149 | const uchar *pSrc = (const uchar*)mat.data; 150 | // Create QImage with same dimensions as input Mat 151 | QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); 152 | return image.rgbSwapped(); 153 | } 154 | else if (mat.type() == CV_8UC4) 155 | { 156 | // Copy input Mat 157 | const uchar *pSrc = (const uchar*)mat.data; 158 | // Create QImage with same dimensions as input Mat 159 | QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); 160 | return image.copy(); 161 | } 162 | else 163 | { 164 | return QImage(); 165 | } 166 | } 167 | 168 | 169 | void HistogtamDlg::createHistogramGray()//创建直方图 170 | { 171 | 172 | #define cvQueryHistValue_1D( hist, idx0 )\ 173 | ((float)cvGetReal1D( (hist)->bins, (idx0))) 174 | 175 | //进行,灰度处理 176 | //matOri输入图像 由对话框来选 177 | //dstImage输出图像,最后希望显示的图像必须添加 178 | //例如:cv::cvtColor(matOri,dstImage,COLOR_RGB2GRAY); 179 | Mat intoMat=globalMat.clone(); 180 | IplImage *src= &IplImage(intoMat); 181 | IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1); 182 | cvCvtColor(src,gray_plane,CV_RGB2GRAY); 183 | // cv::cvtColor(src,gray_plane,COLOR_RGB2GRAY); 184 | 185 | int hist_size = 256; //直方图尺寸 186 | int hist_height = 256; 187 | float range[] = {0,255}; //灰度级的范围 188 | float* ranges[]={range}; 189 | //创建一维直方图,统计图像在[0 255]像素的均匀分布 190 | CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); 191 | //计算灰度图像的一维直方图 192 | cvCalcHist(&gray_plane,gray_hist,0,0); 193 | //归一化直方图 194 | cvNormalizeHist(gray_hist,1.0); 195 | 196 | int scale = 2; 197 | //创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale) 198 | IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3); 199 | cvZero(hist_image); 200 | //统计直方图中的最大直方块 201 | float max_value = 0; 202 | cvGetMinMaxHistValue(gray_hist, 0,&max_value,0,0); 203 | 204 | //分别将每个直方块的值绘制到图中 205 | for(int i=0;ileft_horizontalSlider->value()),0),cvPoint(1*2*(ui->left_horizontalSlider->value()),255),CV_RGB(0,255,0),2); 222 | // cvLine(transIplimage,cvPoint(1*2*(ui->right_horizontalSlider->value()),0),cvPoint(1*2*(ui->right_horizontalSlider->value()),255),CV_RGB(255,0,0),2); 223 | 224 | // outMat=cvarrToMat(transIplimage); 225 | // QImage imgshow=MatToQImage(outMat); 226 | // ui->histogtam_label->clear(); 227 | // imgshow=imgshow.scaled(this->ui->histogtam_label->width(),this->ui->histogtam_label->height(),Qt::KeepAspectRatio); 228 | // this->ui->histogtam_label->setPixmap(QPixmap::fromImage(imgshow)); 229 | } 230 | 231 | void HistogtamDlg::setHistogtam()//滑条函数,刷新直方图 232 | { 233 | Mat img2=globalMat.clone(); 234 | Mat dst; 235 | int value_m=this->ui->left_horizontalSlider->value(); 236 | int value_m2=this->ui->right_horizontalSlider->value(); 237 | 238 | cv::cvtColor(img2,img2,COLOR_RGB2GRAY);//进行,灰度处理 239 | //阈值分割 240 | threshold( img2, //输入图像,原始数组 (单通道 , 8-bit of 32-bit 浮点数). 241 | img2, //输出图像,输出数组,必须与 src 的类型一致,或者为 8-bit. 242 | value_m, //分割值 243 | 0, // 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值. 244 | cv::THRESH_TOZERO); //阈值类型 245 | 246 | threshold(img2, //输入图像,原始数组 (单通道 , 8-bit of 32-bit 浮点数). 247 | dst, //输出图像,输出数组,必须与 src 的类型一致,或者为 8-bit. 248 | value_m2, //分割值 249 | 0, // 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值. 250 | cv::THRESH_TOZERO_INV ); //阈值类型 251 | 252 | threshold( dst, //输入图像,原始数组 (单通道 , 8-bit of 32-bit 浮点数). 253 | dst, //输出图像,输出数组,必须与 src 的类型一致,或者为 8-bit. 254 | 1, //分割值 255 | 255, // 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值. 256 | cv::THRESH_BINARY); //阈值类型 257 | 258 | // QImage imgshow=MatToQImage(dst); 259 | // this-> ui->lb_OutToImg->clear(); 260 | // imgshow=imgshow.scaled( this->ui->lb_OutToImg->width(), this->ui->lb_OutToImg->height(),Qt::KeepAspectRatio); 261 | // this-> ui->lb_OutToImg->setPixmap(QPixmap::fromImage(imgshow)); 262 | // outGlobalMat=dst.clone(); 263 | 264 | resultMat=dst.clone();//处理结果 265 | refreshSenddata(); 266 | 267 | //2019.12.8 将刷新放在这里 268 | Mat outMat=globalHistMat.clone(); 269 | IplImage* transIplimage = cvCloneImage(&(IplImage) outMat); 270 | cvLine(transIplimage,cvPoint(1*2*(ui->left_horizontalSlider->value()),0),cvPoint(1*2*(ui->left_horizontalSlider->value()),255),CV_RGB(0,255,0),2); 271 | cvLine(transIplimage,cvPoint(1*2*(ui->right_horizontalSlider->value()),0),cvPoint(1*2*(ui->right_horizontalSlider->value()),255),CV_RGB(255,0,0),2); 272 | 273 | outMat=cvarrToMat(transIplimage); 274 | QImage imgshow=MatToQImage(outMat); 275 | ui->histogtam_label->clear(); 276 | imgshow=imgshow.scaled(this->ui->histogtam_label->width(),this->ui->histogtam_label->height(),Qt::KeepAspectRatio); 277 | this->ui->histogtam_label->setPixmap(QPixmap::fromImage(imgshow)); 278 | 279 | } 280 | 281 | void HistogtamDlg::setHistogtamRe(int value)//刷新直方图 282 | { 283 | // createHistogramGray(); 284 | setHistogtam(); 285 | } 286 | 287 | 288 | void HistogtamDlg::setLeftValue() 289 | { 290 | 291 | if(ui->left_horizontalSlider->value()>=ui->right_spinBox->value()) 292 | { 293 | ui->right_spinBox->setValue(ui->left_horizontalSlider->value()+1); 294 | } 295 | 296 | 297 | } 298 | void HistogtamDlg::setRightValue() 299 | { 300 | 301 | if(ui->right_horizontalSlider->value()<=ui->left_spinBox->value()) 302 | { 303 | ui->left_spinBox->setValue(ui->right_horizontalSlider->value()-1); 304 | } 305 | 306 | } 307 | 308 | void HistogtamDlg::on_pushButton_clicked() 309 | { 310 | 311 | /* 312 | 直方图的均值化。 313 | 图像中像素个数多的灰度级进行展宽, 314 | 而对图像中像素个数少的灰度进行压缩, 315 | 从而扩展像原取值的动态范围, 316 | 提高了对比度和灰度色调的变化, 317 | 使图像更加清晰。 318 | */ 319 | 320 | } 321 | 322 | void HistogtamDlg::on_show_pushButton_clicked() 323 | { 324 | 325 | //读取combobox对应的图 326 | for(int i=0;i< m_listVatiate_glob.size();++i)//遍历变量名 327 | { 328 | //变量名如果和对话框中的值相等输出对象的Mat 329 | if( m_listVatiate_glob.at(i)==ui->comboBox->currentText()) 330 | { 331 | globalMat=m_listMat_glob.at(i).clone(); 332 | break; 333 | } 334 | } 335 | 336 | setHistogtam();//刷新视图 337 | } 338 | 339 | 340 | //确定按钮 341 | void HistogtamDlg::on_out_pushButton_clicked() 342 | { 343 | 344 | 345 | Mat dstImage; 346 | if( m_listMat_glob.isEmpty()){ 347 | QMessageBox emptybox; 348 | emptybox.about(NULL,"信息","没有加载图片"); 349 | } 350 | else 351 | { 352 | QString inImgDlgVar=ui->comboBox->currentText();//输入变量名字 353 | QString outImgDlgVar=ui->out_lineEdit->text();//输出变量名字 354 | 355 | //////////////////////////////// 356 | ///*******获取变量**********// 357 | /////////////////////// 358 | QString left_var1=QString::number(ui->left_spinBox->value(),10,0);//获取变量1 359 | QString right_var2=QString::number(ui->right_spinBox->value(),10,0);//获取变量2 360 | 361 | 362 | for(int i=0;i< m_listVatiate_glob.size();++i)//遍历变量名,如果输出重复设为默认 363 | { 364 | if(outImgDlgVar==m_listVatiate_glob.at(i))//如果没有输入变量 365 | { 366 | 367 | QMessageBox mesg; 368 | mesg.about(NULL,"提示","无输出对象或对象重复,设置为默认"); 369 | 370 | QString strVar= QString::number(m_listVatiate_glob.size(),10,0); 371 | QString strVariable=QString("image%1").arg(strVar); 372 | outImgDlgVar=strVariable; 373 | break; 374 | } 375 | } 376 | 377 | if(outImgDlgVar.isEmpty())//如果没有输入变量,设为默认 378 | { 379 | QMessageBox mesg; 380 | mesg.about(NULL,"提示","无输出对象或对象重复,设置为默认"); 381 | 382 | QString strVar= QString::number(m_listVatiate_glob.size(),10,0); 383 | QString strVariable=QString("image%1").arg(strVar); 384 | outImgDlgVar=strVariable; 385 | } 386 | 387 | m_listVatiate_glob.append(outImgDlgVar);//添加变量名list 388 | // listNameMainWid.append(strg);//添加操作名list 389 | 390 | if(m_listMat_glob.size()>9)//mat list 长度超过9后要开辟空间 391 | { 392 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 393 | m_listMat_glob.append(matImageMainWid); 394 | } 395 | m_listMat_glob.insert(m_listMat_glob.size()-1,resultMat);//添加图元list 396 | 397 | 398 | //code内容 399 | QString sendstrg=QString("threshold( %1,%1, %2, 0,cv::THRESH_TOZERO); //阈值类型;\r\n" 400 | "threshold( %1,dst,%3, 0,cv:: cv::THRESH_TOZERO_INV ); //阈值类型;//设置核\r\n" 401 | "threshold( dst,%4, 1, 255,cv:: cv::THRESH_BINARY); //阈值类型,\r\n") 402 | .arg(inImgDlgVar).arg(left_var1).arg(right_var2).arg(outImgDlgVar); 403 | 404 | QMessageBox mesg2; 405 | mesg2.about(NULL,"信息",sendstrg); 406 | 407 | QString strg="灰度阈值分割"; 408 | 409 | 410 | // QMessageBox mesg3; 411 | // mesg3.about(NULL,"信息",outImgDlgVar); 412 | 413 | dstImage=resultMat.clone(); 414 | 415 | emit hdSendDataMW(dstImage,strg,outImgDlgVar,0,-1); 416 | emit hdSendStr(-1,sendstrg); 417 | 418 | } 419 | 420 | } 421 | 422 | 423 | 424 | 425 | -------------------------------------------------------------------------------- /histogtamdlg.h: -------------------------------------------------------------------------------- 1 | #ifndef HISTOGTAMDLG_H 2 | #define HISTOGTAMDLG_H 3 | 4 | #include 5 | #include 6 | #include "math.h" 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include 15 | //#include "showhistogtamresult.h" 16 | 17 | 18 | 19 | using namespace cv; 20 | 21 | namespace Ui { 22 | class HistogtamDlg; 23 | } 24 | 25 | class HistogtamDlg : public QWidget 26 | { 27 | Q_OBJECT 28 | 29 | public: 30 | explicit HistogtamDlg(QWidget *parent = 0); 31 | ~HistogtamDlg(); 32 | // void setPicture(Mat); 33 | // void createHistogtam(Mat); 34 | 35 | void refreshSenddata(); 36 | //修复消耗内存越来越卡的问题 37 | 38 | 39 | void setHistogtam();//滑条函数,刷新直方图 40 | void createHistogramGray();//创建直方图 41 | QImage MatToQImage(const cv::Mat& mat);//mat转qimage 42 | Mat globalMat; 43 | Mat globalHistMat; 44 | 45 | private: 46 | Ui::HistogtamDlg *ui; 47 | void closeEvent(QCloseEvent *event); 48 | // void paintEvent(QPaintEvent *); 49 | 50 | QList m_listVatiate_glob;//对应图像变量名字 51 | QList m_listMat_glob;//图像数据 52 | Mat resultMat; 53 | Mat result_Histogtam_Mat; 54 | Mat source_Histogtam_Mat; 55 | Mat source_gray_Mat; 56 | 57 | int left_Threshold; 58 | int right_Threshold; 59 | 60 | signals: 61 | void sendToShowhistogtam(Mat,int,int); 62 | void hdSendDataMW(Mat,QString,QString,int,int); //给图元窗口发送信号,将Mat,图像变量名称,操作名称,行号,标记号发送给图元窗口 63 | void hdSendStr(int,QString); //程序流程窗口,将操作函数文本发送给程序流程窗口 64 | 65 | 66 | 67 | private slots: 68 | void receiveDataForHistogtamdlg(QList,QList); 69 | 70 | // void Threshold_SetValue(int); 71 | // void Threshold_SetValue2(int); 72 | 73 | 74 | //////////////////////新定义 75 | void setLeftValue(); 76 | void setRightValue(); 77 | void setHistogtamRe(int);//刷新直方图 78 | void on_pushButton_clicked(); 79 | void on_show_pushButton_clicked(); 80 | void on_out_pushButton_clicked(); 81 | 82 | 83 | 84 | }; 85 | 86 | 87 | #endif //HISTOGTAMDLG_H 88 | 89 | -------------------------------------------------------------------------------- /histogtamdlg.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | HistogtamDlg 4 | 5 | 6 | true 7 | 8 | 9 | 10 | 0 11 | 0 12 | 600 13 | 450 14 | 15 | 16 | 17 | 18 | 600 19 | 450 20 | 21 | 22 | 23 | 24 | 600 25 | 450 26 | 27 | 28 | 29 | 直方图分割 30 | 31 | 32 | 33 | QLayout::SetDefaultConstraint 34 | 35 | 36 | 37 | 38 | QLayout::SetMinimumSize 39 | 40 | 41 | 42 | 43 | 44 | 45 | Qt::Horizontal 46 | 47 | 48 | 49 | 40 50 | 20 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 输入对象: 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 0 73 | 0 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 输出对象: 86 | 87 | 88 | 89 | 90 | 91 | 92 | true 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 刷新图像 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 左边阈值: 113 | 114 | 115 | 116 | 117 | 118 | 119 | 254 120 | 121 | 122 | 123 | 124 | 125 | 126 | 254 127 | 128 | 129 | Qt::Horizontal 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 右边阈值: 141 | 142 | 143 | 144 | 145 | 146 | 147 | 1 148 | 149 | 150 | 255 151 | 152 | 153 | 255 154 | 155 | 156 | 157 | 158 | 159 | 160 | 1 161 | 162 | 163 | 255 164 | 165 | 166 | 255 167 | 168 | 169 | Qt::Horizontal 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | Qt::Horizontal 181 | 182 | 183 | 184 | 40 185 | 20 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 直方图 196 | 197 | 198 | false 199 | 200 | 201 | Qt::AlignCenter 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | Qt::Horizontal 211 | 212 | 213 | 214 | 40 215 | 20 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 均值化直方图 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 输出 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | -------------------------------------------------------------------------------- /imagelook.cpp: -------------------------------------------------------------------------------- 1 | #include "imagelook.h" 2 | #include "ui_imagelook.h" 3 | #include "mainwindow.h" 4 | 5 | #pragma execution_character_set("utf-8") 6 | 7 | ImageLook::ImageLook(QWidget *parent) : 8 | QWidget(parent), 9 | ui(new Ui::ImageLook) 10 | { 11 | ui->setupUi(this); 12 | showImage(pImgs,globNames,controlNameGlob);//显示图像 13 | 14 | QObject::connect(pixItem,SIGNAL(scaleChanged()), 15 | this,SLOT(my_change()));//自定义信号和槽获取scale值反馈出来,scaleChanged()系统信号 16 | 17 | QObject::connect(ui->spinBox,SIGNAL(valueChanged(int)), 18 | ui->horizontalSlider,SLOT(setValue(int)));//spinBox值与滑条对应 19 | 20 | QObject::connect(ui->horizontalSlider,SIGNAL(valueChanged(int)), 21 | ui->spinBox,SLOT(setValue(int)));//滑条与spinBox值对应 22 | 23 | ui->horizontalSlider->setValue(0);//滑条初始值,范围值在窗口设计器里设置了 24 | 25 | QObject::connect(ui->B_ReZoom,SIGNAL(clicked(bool)), 26 | this,SLOT(resetzoom()));//复位按钮 27 | 28 | 29 | } 30 | 31 | ImageLook::~ImageLook() 32 | { 33 | delete ui; 34 | } 35 | 36 | 37 | void ImageLook::showImage(Mat matL,QString nameL,QString controlName) 38 | { 39 | globNames=nameL;//接收加载名字 40 | pImgs=matL;//接收加载图元 41 | // controlNameGlob=controlName; 42 | 43 | QImage image; 44 | if(pImgs.channels()==1)//灰度图通道变为1 45 | { 46 | //灰度转换时候Format_Grayscale8 47 | QImage imageGray((const uchar*)pImgs.data, pImgs.cols, 48 | pImgs.rows,pImgs.cols*pImgs.channels(),QImage::Format_Grayscale8); 49 | image=imageGray; 50 | } 51 | else 52 | { 53 | // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。 54 | QImage imageOriginal((const uchar*)pImgs.data, pImgs.cols, 55 | pImgs.rows,pImgs.cols*pImgs.channels(),QImage::Format_RGB888); 56 | image=imageOriginal; 57 | } 58 | 59 | QPixmap pixmapCV =QPixmap::fromImage(image); 60 | // QPixmap pixmapCV = QPixmap::fromImage(image.scaled(size(), Qt::KeepAspectRatio) ); 61 | 62 | pixItem = new MyPixItem(new QPixmap(pixmapCV)); 63 | //将该图元对象添加到场景中,并设置此图元在场景中的位置为中心(0,0) 64 | m_graphicsScene = new QGraphicsScene; //new 一个新的场景对象 65 | ui->graphicsView->setSceneRect(-10/2,-10/2,10,10); 66 | //设置开启滚动条范围,不然即使隐藏了滚动条后还是有滚动效果 67 | ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏横向滚动条 68 | ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏纵向滚动条 69 | ui->graphicsView->setScene(m_graphicsScene);//添加场景 70 | m_graphicsScene->addItem(pixItem);//将图元添加到场景中 71 | pixItem->setPos(0,0);//中心位置 72 | setWindowTitle(globNames); 73 | 74 | setWindowIcon(QIcon(":/images/eye_32px.png")); 75 | 76 | 77 | QObject::connect(pixItem,SIGNAL(scaleChanged()), 78 | this,SLOT(my_change()));//自定义信号和槽获取scale值反馈出来 79 | 80 | } 81 | 82 | 83 | void ImageLook::mouseDoubleClickEvent(QMouseEvent *e) 84 | { 85 | ////////***********图片复原代码**************///// 86 | pixItem->setPos(0,0); 87 | pixItem->setScaleValue(1); 88 | pixItem->setZoomState(NO_STATE); 89 | ui->horizontalSlider->setValue(0); 90 | } 91 | 92 | //滚轮滚动图片缩小放大 93 | void ImageLook::wheelEvent(QWheelEvent *event) 94 | { 95 | pixItem->setZoomState(NO_STATE);//枚举,对应pixitem类中 96 | int scaleValue=pixItem->getScaleValue();//获取ScaleValue值(放大缩小值) 97 | if(event->delta() > 0) //delta()为正,滚轮向上滚 98 | { 99 | scaleValue++; 100 | ui->horizontalSlider->setValue(scaleValue);//同步滑条 101 | } 102 | else 103 | { 104 | scaleValue--; 105 | ui->horizontalSlider->setValue(scaleValue);//同步滑条 106 | } 107 | pixItem->setScaleValue(scaleValue);//重新设置ScaleValue值(放大缩小值) 108 | } 109 | 110 | void ImageLook::my_change() 111 | { 112 | ui->horizontalSlider->setValue(pixItem->getScaleValue());//获取图元的放大缩小值 113 | } 114 | 115 | 116 | 117 | void ImageLook::mousePressEvent(QMouseEvent *e) 118 | { 119 | last = e->globalPos(); //鼠标点击点位 120 | wt=width();//获取窗口大小 121 | ht=height();//同上 122 | // pixItem->setValue(p);//传到pixitem类 123 | } 124 | 125 | 126 | //系统内置spinBox槽函数,在设计窗口选中控件,右键添加valueChanged,当值改变时候自动启动 127 | void ImageLook::on_spinBox_valueChanged(int arg1) 128 | { 129 | pixItem->setZoomState(NO_STATE);//对应图元类中放大缩小原始枚举项 130 | pixItem->setScaleValue(arg1); //获取控件改变的值 131 | wt=width(); 132 | ht=height(); 133 | QPointF p(wt,ht); 134 | pixItem->setValue(p);//将窗口值传给pixitem类 135 | } 136 | 137 | 138 | //复原函数 139 | void ImageLook::resetzoom() 140 | { 141 | pixItem->setPos(0,0);//复原位置 142 | pixItem->setScaleValue(0);//复原比例 143 | pixItem->setZoomState(NO_STATE); 144 | ui->horizontalSlider->setValue(0);//滑条值 145 | } 146 | 147 | 148 | //放大按钮 149 | void ImageLook::on_B_Boost_clicked() 150 | { 151 | int a=ui->spinBox->value()+1; 152 | ui->horizontalSlider->setValue(a); 153 | } 154 | 155 | //缩小按钮 156 | void ImageLook::on_B_Reduce_clicked() 157 | { 158 | int a=ui->spinBox->value()-1; 159 | ui->horizontalSlider->setValue(a); 160 | } 161 | 162 | -------------------------------------------------------------------------------- /imagelook.h: -------------------------------------------------------------------------------- 1 | #ifndef IMAGELOOK_H 2 | #define IMAGELOOK_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include "mypixitem.h" 8 | 9 | #include //视图类 10 | #include //场景类 11 | #include //图元类 12 | #include 13 | #include 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | #include 22 | 23 | using namespace cv; 24 | 25 | 26 | namespace Ui { 27 | class ImageLook; 28 | } 29 | 30 | class ImageLook : public QWidget 31 | { 32 | Q_OBJECT 33 | public: 34 | explicit ImageLook(QWidget *parent = 0); 35 | ~ImageLook(); 36 | void showImage(Mat,QString,QString); 37 | 38 | protected: 39 | void mousePressEvent(QMouseEvent *e); 40 | void mouseDoubleClickEvent(QMouseEvent *e); 41 | void wheelEvent(QWheelEvent *event); 42 | 43 | private slots: 44 | void my_change();//用于接收放缩值变化 45 | void on_spinBox_valueChanged(int arg1);//系统自动生成槽函数,检测对应控件值 46 | void resetzoom();//恢复图像 47 | void on_B_Boost_clicked();//放大按钮 48 | void on_B_Reduce_clicked();//缩小按钮 49 | 50 | 51 | private: 52 | Ui::ImageLook *ui; 53 | QPoint last; //点 54 | MyPixItem *pixItem; //自定义的图元类 55 | QGraphicsScene *m_graphicsScene; //场景 56 | QGraphicsView *m_graphicsView; 57 | 58 | int wt; 59 | int ht; 60 | IplImage *pImg; 61 | Mat pImgs; 62 | QString globNames; 63 | QString controlNameGlob; 64 | 65 | 66 | }; 67 | 68 | #endif // IMAGELOOK_H 69 | -------------------------------------------------------------------------------- /imagelook.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ImageLook 4 | 5 | 6 | 7 | 0 8 | 0 9 | 500 10 | 400 11 | 12 | 13 | 14 | 15 | 150 16 | 150 17 | 18 | 19 | 20 | 21 | 0 22 | 0 23 | 24 | 25 | 26 | Form 27 | 28 | 29 | 30 | 1 31 | 32 | 33 | 1 34 | 35 | 36 | 1 37 | 38 | 39 | 1 40 | 41 | 42 | 1 43 | 44 | 45 | 46 | 47 | 48 | 49 | Qt::Horizontal 50 | 51 | 52 | 53 | 40 54 | 20 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -50 63 | 64 | 65 | 50 66 | 67 | 68 | 69 | 70 | 71 | 72 | -50 73 | 74 | 75 | 50 76 | 77 | 78 | Qt::Horizontal 79 | 80 | 81 | 82 | 83 | 84 | 85 | 放大 86 | 87 | 88 | 89 | 90 | 91 | 92 | 缩小 93 | 94 | 95 | 96 | 97 | 98 | 99 | 复位 100 | 101 | 102 | 103 | 104 | 105 | 106 | Qt::Horizontal 107 | 108 | 109 | 110 | 40 111 | 20 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /images/Chart_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_128.png -------------------------------------------------------------------------------- /images/Chart_128gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_128gray.png -------------------------------------------------------------------------------- /images/Chart_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_32.png -------------------------------------------------------------------------------- /images/Chart_32gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_32gray.png -------------------------------------------------------------------------------- /images/Chart_64gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_64gray.png -------------------------------------------------------------------------------- /images/Chart_64t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Chart_64t.png -------------------------------------------------------------------------------- /images/Gray_24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Gray_24px.png -------------------------------------------------------------------------------- /images/Mirror_Horizontally_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Mirror_Horizontally_32.png -------------------------------------------------------------------------------- /images/Mirror_Vertically_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/Mirror_Vertically_32.png -------------------------------------------------------------------------------- /images/editcopy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/editcopy.png -------------------------------------------------------------------------------- /images/editcut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/editcut.png -------------------------------------------------------------------------------- /images/editpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/editpaste.png -------------------------------------------------------------------------------- /images/editredo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/editredo.png -------------------------------------------------------------------------------- /images/editundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/editundo.png -------------------------------------------------------------------------------- /images/eye_24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/eye_24px.png -------------------------------------------------------------------------------- /images/eye_32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/eye_32px.png -------------------------------------------------------------------------------- /images/eye_64px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/eye_64px.png -------------------------------------------------------------------------------- /images/eye_72px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/eye_72px.png -------------------------------------------------------------------------------- /images/filenew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/filenew.png -------------------------------------------------------------------------------- /images/fileopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/fileopen.png -------------------------------------------------------------------------------- /images/fileprint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/fileprint.png -------------------------------------------------------------------------------- /images/filesave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/filesave.png -------------------------------------------------------------------------------- /images/fushi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/fushi.png -------------------------------------------------------------------------------- /images/textbold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textbold.png -------------------------------------------------------------------------------- /images/textcenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textcenter.png -------------------------------------------------------------------------------- /images/textitalic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textitalic.png -------------------------------------------------------------------------------- /images/textjustify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textjustify.png -------------------------------------------------------------------------------- /images/textleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textleft.png -------------------------------------------------------------------------------- /images/textright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textright.png -------------------------------------------------------------------------------- /images/textunder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abcvincent/OpencvDevelop/a73aa8b7bd6a8e73bbf896909f24cb4376ef9276/images/textunder.png -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include 3 | #pragma execution_character_set("utf-8") 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | QApplication a(argc, argv); 8 | MainWindow w; 9 | w.show(); 10 | 11 | return a.exec(); 12 | } 13 | -------------------------------------------------------------------------------- /mainwindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include "ui_mainwindow.h" 3 | #include "imagelook.h" 4 | #include "myimagelist.h" 5 | #include "variatedialog.h" 6 | 7 | #include 8 | #include 9 | #include 10 | #include "codewidget.h" 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | #pragma execution_character_set("utf-8") 33 | 34 | using namespace cv; 35 | 36 | 37 | MainWindow::MainWindow(QWidget *parent) : 38 | QMainWindow(parent), 39 | ui(new Ui::MainWindow) 40 | { 41 | ui->setupUi(this); 42 | 43 | saveOffOn=false; 44 | fileExist=""; 45 | 46 | filePathExist=""; 47 | //开辟控件存储图元 48 | Mat matImageMainWid; 49 | for (int i=0;i<10;++i){ 50 | matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//大小2200*2200像素图片大了会报错 51 | listMatMainWid<mdiArea->addSubWindow(myimagelists)->resize(300,300);//添加到mdi上 57 | myimagelists->show();//显示 58 | 59 | codeWidget *codew=new codeWidget;//创建code窗口,程序流程窗口 60 | ui->mdiArea->addSubWindow(codew)->resize(300,300);//添加到mdi上 61 | codew->show();//显示 62 | 63 | //给图元窗口发送信号,将Mat,图像变量名称,操作名称,行号,标记号发送给图元窗口 64 | QObject::connect(this,SIGNAL(sendDataMW(Mat,QString,QString,int,int)),myimagelists,SLOT(receiveDataWM(Mat,QString,QString,int,int))); 65 | //给图元窗口发送信号,让其刷新数据 66 | QObject::connect(this,SIGNAL(sendAction()),myimagelists,SLOT(receiveAction())); 67 | //图元窗口图片被选中后弹出视图窗口,图元窗口间Mat和变量名返回给主窗口,主窗口再讲变量发给视图窗口 68 | QObject::connect(myimagelists,SIGNAL(sendDataList(Mat,QString,QString)),this,SLOT(receiveDataList(Mat,QString,QString))); 69 | //程序流程窗口,将操作函数文本发送给程序流程窗口 70 | QObject::connect(this,SIGNAL(sendStr(int,QString)),codew,SLOT(receiveStr(int,QString)));//发送到code 71 | 72 | 73 | //灰度直方图信号槽 74 | his_dlg=new HistogtamDlg; 75 | connect(this,SIGNAL(sendDataToHistogtamdlg(QList,QList)), 76 | his_dlg,SLOT(receiveDataForHistogtamdlg(QList,QList))); 77 | connect(his_dlg,SIGNAL(sendToShowhistogtam(Mat,int,int)), 78 | this,SLOT(receiveHistogtamResult(Mat,int,int))); 79 | 80 | 81 | //灰度直方图分割结果信号槽 82 | show_his_image=new ShowHistogtamResult; 83 | connect(this,SIGNAL(sendHistogtam_Mat(Mat)),show_his_image,SLOT(receiveHistogtam_Mat(Mat))); 84 | 85 | ////2019.12.7更新 86 | //给图元窗口发送信号,将Mat,图像变量名称,操作名称,行号,标记号发送给图元窗口 87 | // connect(his_dlg,SIGNAL(hdSendDataMW(QString)),this,SLOT(receiveDataHd(QString))); 88 | //给图元窗口发送信号,让其刷新数据 89 | // connect(his_dlg,SIGNAL(hdSendAction()),myimagelists,SLOT(receiveAction())); 90 | 91 | } 92 | 93 | MainWindow::~MainWindow() 94 | { 95 | delete ui; 96 | } 97 | 98 | 99 | /////////////////////////////////////////// 100 | //实验程序开始 101 | void MainWindow::on_ac_programme_triggered() 102 | { 103 | // QMessageBox mesg; 104 | // mesg.about(NULL,"信息","开始定义程序"); 105 | 106 | 107 | 108 | QString strg="自定义图像处理"; 109 | QString textDlg="算子:无"; 110 | QList listCV_CodeWid1; 111 | listCV_CodeWid1={"Not"}; 112 | QList listCV_CodeWid2; 113 | listCV_CodeWid2={"Not"}; 114 | QList listCV_CodeWid3; 115 | listCV_CodeWid3={"Not"}; 116 | int VariaeCount=1; 117 | 118 | 119 | Mat dstImage; 120 | if(listVariableMainWid.isEmpty()){ 121 | QMessageBox emptybox; 122 | emptybox.about(NULL,"信息","没有加载图片"); 123 | } 124 | else 125 | { 126 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 127 | VariateDialog *varDlg=new VariateDialog(strg, 128 | listVariableMainWid, 129 | textDlg, 130 | VariaeCount, 131 | listCV_CodeWid1, 132 | listCV_CodeWid2, 133 | listCV_CodeWid3); 134 | varDlg->exec();//显示对话框 135 | 136 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 137 | { 138 | Mat matOri;//创建一个Mat 139 | for(int i=0;icomboxStr) 143 | { 144 | matOri=listMatMainWid.at(i); 145 | break; 146 | } 147 | } 148 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 149 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 150 | 151 | 152 | for(int i=0;ibins, (idx0))) 184 | 185 | //进行,灰度处理 186 | //matOri输入图像 由对话框来选 187 | //dstImage输出图像,最后希望显示的图像必须添加 188 | //例如:cv::cvtColor(matOri,dstImage,COLOR_RGB2GRAY); 189 | 190 | //灰度直方图处理测试 191 | 192 | IplImage *src= &IplImage(matOri); 193 | IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1); 194 | cvCvtColor(src,gray_plane,CV_RGB2GRAY); 195 | // cv::cvtColor(src,gray_plane,COLOR_RGB2GRAY); 196 | 197 | 198 | int hist_size = 256; //直方图尺寸 199 | int hist_height = 256; 200 | float range[] = {0,255}; //灰度级的范围 201 | float* ranges[]={range}; 202 | //创建一维直方图,统计图像在[0 255]像素的均匀分布 203 | CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); 204 | //计算灰度图像的一维直方图 205 | cvCalcHist(&gray_plane,gray_hist,0,0); 206 | //归一化直方图 207 | cvNormalizeHist(gray_hist,1.0); 208 | 209 | int scale = 2; 210 | //创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale) 211 | IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3); 212 | cvZero(hist_image); 213 | //统计直方图中的最大直方块 214 | float max_value = 0; 215 | cvGetMinMaxHistValue(gray_hist, 0,&max_value,0,0); 216 | 217 | //分别将每个直方块的值绘制到图中 218 | for(int i=0;i9) 252 | { 253 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 254 | listMatMainWid.append(matImageMainWid); 255 | } 256 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 257 | 258 | 259 | emit sendStr(-1,sendstrg);//发送到code 260 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1);//发送到list 261 | emit sendAction();//刷新list 262 | listCodeMainWid.append(sendstrg);//添加到code存储表中 263 | 264 | 265 | 266 | /////////////手动添加///////////////// 267 | ////////////////// 268 | ///////////////////////////// 269 | /// 270 | 271 | Mat dstImage2; 272 | cv::cvtColor(matOri,dstImage2,COLOR_RGB2GRAY); 273 | //Mat dstImage2=cvarrToMat(gray_plane);//IplImage转Mat 274 | 275 | QString outImgDlgVar2; 276 | QString strg2="灰度操作"; 277 | 278 | 279 | if(outImgDlgVar2.isEmpty())//如果没有输入变量,设为默认 280 | { 281 | 282 | QString strVar= QString::number(listVariableMainWid.size(),10,0); 283 | QString strVariable=QString("image%1").arg(strVar); 284 | outImgDlgVar2=strVariable; 285 | } 286 | 287 | 288 | listVariableMainWid.append(outImgDlgVar2);//添加变量名list 289 | listNameMainWid.append(strg2);//添加操作名list 290 | 291 | 292 | QString sendstrg2=QString("%1;//灰度转换\r\n").arg(outImgDlgVar2); 293 | 294 | 295 | 296 | if(listVariableMainWid.size()>9) 297 | { 298 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 299 | listMatMainWid.append(matImageMainWid); 300 | } 301 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage2);//添加图元list 302 | 303 | 304 | emit sendStr(-1,sendstrg2);//发送到code 305 | emit sendDataMW(dstImage2,strg2,outImgDlgVar2,0,-1);//发送到list 306 | emit sendAction();//刷新list 307 | listCodeMainWid.append(sendstrg2);//添加到code存储表中 308 | 309 | 310 | 311 | //////////////////////////////////阈值操作//////////// 312 | /// \brief src 313 | /// 314 | /// 315 | 316 | Mat src3=cvarrToMat(gray_plane); 317 | Mat dst; 318 | 319 | double thresh = 150; 320 | double thresh2 = 200; 321 | int maxVal = 255; 322 | // cv::threshold(src3, dst, thresh, maxVal, cv::THRESH_BINARY); 323 | cv::threshold(src3, dst, thresh, maxVal, cv::THRESH_TOZERO); 324 | cv::threshold(dst, dst, thresh2, maxVal, cv::THRESH_BINARY); 325 | 326 | 327 | 328 | cv::imshow("threshold", dst); 329 | 330 | QString Threshold=QString::number(thresh,10,2); 331 | QString setMaxShow=QString::number(maxVal,10,0); 332 | 333 | Mat dstImage3=dst; 334 | QString outImgDlgVar3; 335 | QString strg3="灰度阈值操作"; 336 | QString sendstrg3=QString("Threshold=%1,setMaxShow=%2//灰度阈值分割\r\n") 337 | .arg(Threshold).arg(setMaxShow); 338 | 339 | if(outImgDlgVar3.isEmpty())//如果没有输入变量,设为默认 340 | { 341 | QString strVar= QString::number(listVariableMainWid.size(),10,0); 342 | QString strVariable=QString("image%1").arg(strVar); 343 | outImgDlgVar3=strVariable; 344 | } 345 | 346 | QString sendstrg_g=QString("%1;%2").arg(outImgDlgVar3).arg(sendstrg3); 347 | 348 | 349 | listVariableMainWid.append(outImgDlgVar3);//添加变量名list 350 | listNameMainWid.append(strg3);//添加操作名list 351 | 352 | if(listVariableMainWid.size()>9) 353 | { 354 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 355 | listMatMainWid.append(matImageMainWid); 356 | } 357 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage3);//添加图元list 358 | 359 | emit sendStr(-1,sendstrg_g);//发送到code 360 | emit sendDataMW(dstImage3,strg3,outImgDlgVar3,0,-1);//发送到list 361 | emit sendAction();//刷新list 362 | listCodeMainWid.append(sendstrg_g);//添加到code存储表中 363 | } 364 | else 365 | { 366 | QMessageBox mesg; 367 | mesg.about(NULL,"信息","已经取消输入"); 368 | } 369 | } 370 | } 371 | 372 | ////////////////////////////////////////////// 373 | ///////实验程序结束 374 | 375 | 376 | 377 | 378 | //打开图片 379 | void MainWindow::on_ac_openfile_triggered() 380 | { 381 | 382 | 383 | if (saveOffOn) 384 | { 385 | QMessageBox::StandardButton mesgdir= QMessageBox::information (NULL, 386 | "信息", "文件未保存,是否保存?", 387 | QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); 388 | if(mesgdir==QMessageBox::Yes) 389 | { 390 | on_ac_savefile_triggered(); 391 | } 392 | 393 | } 394 | 395 | 396 | QString fileName = QFileDialog::getOpenFileName( 397 | this, tr("open image file"), 398 | "./", tr("Image files(*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;All files (*.*)")); 399 | 400 | 401 | 402 | if(fileName.isEmpty()) 403 | { 404 | QMessageBox mesg; 405 | mesg.warning(this,"警告","打开图片失败!");//.about(NULL,"图片大小", strg); 406 | return; 407 | } 408 | 409 | // QString str=fileName; 410 | // char* ch; 411 | // QByteArray ba = str.toLatin1(); // must 412 | // ch=ba.data(); 413 | // Mat pImgs=imread(ch); 414 | 415 | QString str=fileName;//文件名 416 | std::string path = str.toLocal8Bit().toStdString(); //opencv加载中文问题关键是这个 417 | Mat pImgs=imread(path,1 );//cv函数创建Mat 418 | 419 | cvtColor(pImgs,pImgs,CV_BGR2RGB);//opencv Mat一般是bgr格式需要转换成rgb 420 | 421 | QString str1="原始图";//操作名 422 | 423 | emit sendDataMW(pImgs,str1,"image",0,0);//发送myimagelist,显示图像图元窗口 424 | emit sendAction();//刷新图元列表窗口 425 | 426 | //更新mainwindow的list列表 427 | listVariableMainWid.clear();//清空图元变量名称 428 | listVariableMainWid.append("image");//图元代号,list存储 429 | listMatMainWid.insert(0,pImgs);//添加Mat 430 | listNameMainWid.clear();//情况操作名称 431 | listNameMainWid.append(str1);//添加操作名称 432 | 433 | 434 | //发送到codewidget显示程序流程 435 | QString sendstrg=QString("Mat image=imread(%1,1);//加载图片\r\n").arg(str);//.arg(total).arg(fileName); 436 | emit sendStr(0,sendstrg);//发送给程序流程窗口 437 | pImgMat=pImgs;//传给其他操作 438 | listCodeMainWid.append(sendstrg);//讲流程文本数据保存 439 | saveOffOn=true; 440 | fileExist.clear(); 441 | 442 | } 443 | 444 | void MainWindow::on_ac_savefile_triggered() 445 | { 446 | 447 | if(listVariableMainWid.isEmpty())//如果没有变量侧提示并返回 448 | { 449 | QMessageBox mesgs; 450 | mesgs.about(NULL,"信息","无文件"); 451 | saveOffOn=true; 452 | return; 453 | } 454 | else 455 | { 456 | 457 | QString dirPath; 458 | QString filePath; 459 | 460 | if(fileExist.isEmpty())//判断fileExist是否存储,如果存在则说明已经保存过 461 | { 462 | QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间 463 | QString str = time.toString("yyyyMMdd_hhmmss"); //设置显示格式 464 | filePath = QFileDialog::getExistingDirectory(this,""); 465 | dirPath=QString("%1/Opencv develop temp%2").arg(filePath).arg(str); 466 | QDir *temp = new QDir;//声明文件对象 467 | temp->mkdir(dirPath);//创建文件夹 468 | filePathExist=filePath;//存储文件路径,为了再次保存时候找到 469 | fileExist=dirPath;//存储文件名,为了再次保存时候找到 470 | } 471 | else 472 | { 473 | dirPath=fileExist; 474 | filePath=filePathExist; 475 | QMessageBox mesgdir; 476 | mesgdir.about(NULL,"保存在",fileExist); 477 | } 478 | 479 | if(filePath.isEmpty()) 480 | { 481 | QMessageBox::information(this,"信息","保存失败"); 482 | return; 483 | } 484 | else 485 | { 486 | QString myTxt=QString("%1/程序流程.txt").arg(dirPath);//创建txt 487 | QFile myfile(myTxt); 488 | myfile.open(QIODevice::WriteOnly); 489 | 490 | for(int i=0;imdiArea->subWindowList().size();i++) 555 | { 556 | QString str2=ui->mdiArea->subWindowList().at(i)->windowTitle(); 557 | if(str2==textData) 558 | { 559 | ui->mdiArea->setActiveSubWindow(ui->mdiArea->subWindowList().at(i)); 560 | flags=true; 561 | break; 562 | } 563 | } 564 | 565 | if(flags==false) 566 | { 567 | ImageLook *imgL=new ImageLook; 568 | imgL->showImage(imageData,textData,controlName); 569 | QMdiSubWindow *subwindow1=new QMdiSubWindow; 570 | subwindow1->setWidget(imgL); 571 | subwindow1->setAttribute(Qt::WA_DeleteOnClose); 572 | ui->mdiArea->addSubWindow(subwindow1); 573 | subwindow1->show(); 574 | ui->mdiArea->activeSubWindow()->resize(imageData.cols/2,imageData.rows/2); 575 | } 576 | } 577 | 578 | void MainWindow::mesgbox() 579 | { 580 | QMessageBox mesg; 581 | mesg.about(NULL,"提示","无输出对象或对象重复,设置为默认"); 582 | 583 | } 584 | 585 | 586 | void MainWindow::on_ac_imageOriginal_triggered() 587 | { 588 | bool flags=false; 589 | for(int i=0;imdiArea->subWindowList().size();i++) 590 | { 591 | // QString str=QString::number(ui->mdiArea->subWindowList().size(),10,0); 592 | // QMessageBox mesg; 593 | // mesg.about(NULL,"提示",str); 594 | 595 | QString str2=ui->mdiArea->subWindowList().at(i)->windowTitle(); 596 | if(str2=="图元窗口") 597 | { 598 | ui->mdiArea->setActiveSubWindow(ui->mdiArea->subWindowList().at(i)); 599 | flags=true; 600 | break; 601 | } 602 | } 603 | 604 | if(flags==false) 605 | { 606 | 607 | myimagelists=new MyImageList; 608 | 609 | for(int i=0;iintoList(listNameMainWid.at(i),listVariableMainWid.at(i),listMatMainWid.at(i),i,-1); 612 | 613 | } 614 | myimagelists->updataListShows(1); 615 | ui->mdiArea->addSubWindow(myimagelists)->resize(300,300); 616 | myimagelists->show(); 617 | 618 | QObject::connect(this,SIGNAL(sendDataMW(Mat,QString,QString,int,int)),myimagelists,SLOT(receiveDataWM(Mat,QString,QString,int,int))); 619 | QObject::connect(this,SIGNAL(sendAction()),myimagelists,SLOT(receiveAction())); 620 | QObject::connect(myimagelists,SIGNAL(sendDataC(Mat,QString)),this,SLOT(receiveDataC(Mat,QString))); 621 | } 622 | 623 | } 624 | 625 | void MainWindow::on_ac_codeFlow_triggered() 626 | { 627 | 628 | 629 | bool flags=false; 630 | for(int i=0;imdiArea->subWindowList().size();i++) 631 | { 632 | QString str2=ui->mdiArea->subWindowList().at(i)->windowTitle(); 633 | if(str2=="程序流程窗口") 634 | { 635 | ui->mdiArea->setActiveSubWindow(ui->mdiArea->subWindowList().at(i)); 636 | flags=true; 637 | break; 638 | } 639 | } 640 | 641 | if(flags==false) 642 | { 643 | codeWidget *codew=new codeWidget; 644 | QObject::connect(this,SIGNAL(sendStr(int,QString)),codew,SLOT(receiveStr(int,QString)));//发送到code 645 | 646 | for(int i=0;imdiArea->addSubWindow(codew)->resize(300,300); 654 | codew->show(); 655 | 656 | } 657 | } 658 | 659 | 660 | 661 | void MainWindow::on_ac_order_triggered() 662 | { 663 | ui->mdiArea->tileSubWindows(); 664 | } 665 | 666 | void MainWindow::on_ac_stacking_triggered() 667 | { 668 | ui->mdiArea->cascadeSubWindows(); 669 | } 670 | 671 | void MainWindow::on_ac_closeAll_triggered() 672 | { 673 | ui->mdiArea->closeAllSubWindows(); 674 | } 675 | 676 | void MainWindow::on_ac_nextOne_triggered() 677 | { 678 | ui->mdiArea->activateNextSubWindow(); 679 | } 680 | 681 | void MainWindow::on_ac_preOne_triggered() 682 | { 683 | ui->mdiArea->activatePreviousSubWindow(); 684 | } 685 | 686 | void MainWindow::closeEvent(QCloseEvent *event) 687 | { 688 | 689 | if (saveOffOn) 690 | { 691 | QMessageBox::StandardButton mesgdir= QMessageBox::information (NULL, 692 | "信息", "文件未保存,是否保存?", 693 | QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); 694 | if(mesgdir==QMessageBox::Yes) 695 | { 696 | on_ac_savefile_triggered(); 697 | } 698 | 699 | else 700 | { 701 | event->ignore(); 702 | event->accept(); 703 | } 704 | 705 | // QMessageBox mesgdir; 706 | // mesgdir.about(NULL,"信息","未保存"); 707 | 708 | } 709 | else 710 | { 711 | event->accept(); 712 | } 713 | } 714 | 715 | void MainWindow::on_ac_gray_triggered()//灰度图 716 | { 717 | 718 | 719 | QString strg="灰度处理"; 720 | QString textDlg="算子:cv::cvtColor(Input src,Outpu dst,COLOR_BGR2GRAY)"; 721 | QList listCV_CodeWid1; 722 | listCV_CodeWid1={"Yes_combox","COLOR_RGB2GRAY"}; 723 | QList listCV_CodeWid2; 724 | listCV_CodeWid2={"Not"}; 725 | QList listCV_CodeWid3; 726 | listCV_CodeWid3={"Not"}; 727 | int VariaeCount=1; 728 | 729 | 730 | Mat dstImage; 731 | if(listVariableMainWid.isEmpty()){ 732 | QMessageBox emptybox; 733 | emptybox.about(NULL,"信息","没有加载图片"); 734 | } 735 | else 736 | { 737 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 738 | VariateDialog *varDlg=new VariateDialog(strg, 739 | listVariableMainWid, 740 | textDlg, 741 | VariaeCount, 742 | listCV_CodeWid1, 743 | listCV_CodeWid2, 744 | listCV_CodeWid3); 745 | varDlg->exec();//显示对话框 746 | 747 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 748 | { 749 | Mat matOri;//创建一个Mat 750 | for(int i=0;icomboxStr) 754 | { 755 | matOri=listMatMainWid.at(i); 756 | break; 757 | } 758 | } 759 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 760 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 761 | 762 | 763 | for(int i=0;i9) 792 | { 793 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 794 | listMatMainWid.append(matImageMainWid); 795 | } 796 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 797 | 798 | 799 | emit sendStr(-1,sendstrg); 800 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1); 801 | emit sendAction(); 802 | 803 | listCodeMainWid.append(sendstrg); 804 | 805 | } 806 | else 807 | { 808 | QMessageBox mesg; 809 | mesg.about(NULL,"信息","已经取消输入"); 810 | } 811 | 812 | } 813 | 814 | } 815 | 816 | 817 | void MainWindow::on_ac_h_v_triggered() 818 | { 819 | /* 820 | * 先判断有没有加载图片,如果有则启动对话框,没有则不启动; 821 | * 让后判断对话框点击取消或者×时候不进行操作 822 | * 进入对话框后对其内已有变量进行遍历,如果新变量和之前变量一样或者空则设为默认; 823 | * 进行图像转换操作; 824 | * 判断mat list 是否需要开辟新空间 825 | * 传递参数 826 | */ 827 | 828 | ////**************修改变量位置******************///// 829 | QString strg="翻转操作"; 830 | QString textDlg="算子:cv::flip(Input src,Outpu dst,int flipCode)"; 831 | QList listCV_CodeWid1; 832 | listCV_CodeWid1={"Yes_combox","水平翻转","垂直翻转","水平垂直翻转"}; 833 | QList listCV_CodeWid2; 834 | listCV_CodeWid2={"Not"}; 835 | QList listCV_CodeWid3; 836 | listCV_CodeWid3={"Not"}; 837 | 838 | int VariaeCount=1; 839 | ////******************************************///// 840 | 841 | 842 | Mat dstImage; 843 | if(listVariableMainWid.isEmpty()){ 844 | QMessageBox emptybox; 845 | emptybox.about(NULL,"信息","没有加载图片"); 846 | } 847 | else 848 | { 849 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 850 | VariateDialog *varDlg=new VariateDialog(strg, 851 | listVariableMainWid, 852 | textDlg,VariaeCount, 853 | listCV_CodeWid1, 854 | listCV_CodeWid2, 855 | listCV_CodeWid3); 856 | varDlg->exec();//显示对话框 857 | 858 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 859 | { 860 | Mat matOri;//创建一个Mat 861 | for(int i=0;icomboxStr) 865 | { 866 | matOri=listMatMainWid.at(i); 867 | break; 868 | } 869 | } 870 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 871 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 872 | 873 | 874 | 875 | QString var1=varDlg->lineEditStr1; 876 | 877 | for(int i=0;i9)//mat list 长度超过9后要开辟空间 927 | { 928 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 929 | listMatMainWid.append(matImageMainWid); 930 | } 931 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 932 | 933 | 934 | emit sendStr(-1,sendstrg); 935 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1); 936 | emit sendAction(); 937 | listCodeMainWid.append(sendstrg); 938 | } 939 | else 940 | { 941 | QMessageBox mesg; 942 | mesg.about(NULL,"信息","已经取消输入"); 943 | } 944 | } 945 | 946 | } 947 | 948 | 949 | 950 | void MainWindow::on_ac_erode_triggered() 951 | { 952 | /* 953 | * 1)先判断有没有加载图片,如果有则启动对话框,没有则不启动; 954 | * 2)让后判断对话框点击取消或者×时候不进行操作 955 | * 3)进入对话框后对其内已有变量进行遍历,如果新变量和之前变量一样或者空则设为默认; 956 | * 4)进行图像转换操作; 957 | * 5)判断mat list 是否需要开辟新空间 958 | * 6)传递参数 959 | */ 960 | 961 | 962 | ////**************修改变量位置******************///// 963 | QString strg="腐蚀操作"; 964 | QString textDlg="算子:cv::erode(Input src,Outpu dst,element)\n" 965 | "变量值1为腐蚀类型为:MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE;\n" 966 | "变量值2为核大小"; 967 | 968 | QList listCV_CodeWid1; 969 | listCV_CodeWid1={"Yes_combox","MORPH_RECT","MORPH_CROSS","MORPH_ELLIPSE"}; 970 | QList listCV_CodeWid2; 971 | listCV_CodeWid2={"Yes_Number_double"}; 972 | QList listCV_CodeWid3; 973 | listCV_CodeWid3={"Not"}; 974 | 975 | int VariaeCount=2; 976 | 977 | // MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f] 978 | // MORPH_CROSS = 1, //!< a cross-shaped structuring element: 979 | // //!< \f[E_{ij} = \fork{1}{if i=\texttt{anchor.y} or j=\texttt{anchor.x}}{0}{otherwise}\f] 980 | // MORPH_ELLIPSE = 2 981 | ////******************************************///// 982 | 983 | 984 | Mat dstImage; 985 | if(listVariableMainWid.isEmpty()){ 986 | QMessageBox emptybox; 987 | emptybox.about(NULL,"信息","没有加载图片"); 988 | } 989 | else 990 | { 991 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 992 | VariateDialog *varDlg=new VariateDialog(strg, 993 | listVariableMainWid, 994 | textDlg, 995 | VariaeCount, 996 | listCV_CodeWid1, 997 | listCV_CodeWid2, 998 | listCV_CodeWid3); 999 | varDlg->exec();//显示对话框 1000 | 1001 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 1002 | { 1003 | Mat matOri;//创建一个Mat 1004 | for(int i=0;icomboxStr) 1008 | { 1009 | matOri=listMatMainWid.at(i); 1010 | break; 1011 | } 1012 | } 1013 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 1014 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 1015 | 1016 | 1017 | //////////////////////////////// 1018 | ///*******获取变量**********// 1019 | /////////////////////// 1020 | QString var1=varDlg->lineEditStr1;//获取变量1 1021 | QString var2=varDlg->lineEditStr2;//获取变量2 1022 | 1023 | 1024 | for(int i=0;i9)//mat list 长度超过9后要开辟空间 1094 | { 1095 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 1096 | listMatMainWid.append(matImageMainWid); 1097 | } 1098 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 1099 | 1100 | 1101 | emit sendStr(-1,sendstrg); 1102 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1); 1103 | emit sendAction(); 1104 | listCodeMainWid.append(sendstrg); 1105 | } 1106 | else 1107 | { 1108 | QMessageBox mesg; 1109 | mesg.about(NULL,"信息","已经取消输入"); 1110 | } 1111 | } 1112 | 1113 | } 1114 | 1115 | void MainWindow::on_ac_dilate_triggered() 1116 | { 1117 | /* 1118 | int dilation_size=2; 1119 | int dilation_type; 1120 | dilation_type=MORPH_RECT; 1121 | Mat element=getStructuringElement(dilation_type, 1122 | Size(2*dilation_size+1,2*dilation_size+1), 1123 | Point(dilation_size,dilation_size)); 1124 | Mat dstImage; 1125 | dilate(pImgs,dstImage,element); 1126 | QString strg="膨胀"; 1127 | */ 1128 | 1129 | 1130 | /* 1131 | * 先判断有没有加载图片,如果有则启动对话框,没有则不启动; 1132 | * 让后判断对话框点击取消或者×时候不进行操作 1133 | * 进入对话框后对其内已有变量进行遍历,如果新变量和之前变量一样或者空则设为默认; 1134 | * 进行图像转换操作; 1135 | * 判断mat list 是否需要开辟新空间 1136 | * 传递参数 1137 | */ 1138 | 1139 | 1140 | ////**************修改变量位置******************///// 1141 | QString strg="膨胀操作"; 1142 | QString textDlg="算子:cv::dilate(Input src,Outpu dst,element)\n" 1143 | "变量值1为腐蚀类型为:MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE;\n" 1144 | "变量值2为核大小"; 1145 | 1146 | QList listCV_CodeWid1; 1147 | listCV_CodeWid1={"Yes_combox","MORPH_RECT","MORPH_CROSS","MORPH_ELLIPSE"}; 1148 | QList listCV_CodeWid2; 1149 | listCV_CodeWid2={"Yes_Number_double"}; 1150 | QList listCV_CodeWid3; 1151 | listCV_CodeWid3={"Not"}; 1152 | 1153 | int VariaeCount=2; 1154 | 1155 | // MORPH_RECT = 0, //!< a rectangular structuring element: \f[E_{ij}=1\f] 1156 | // MORPH_CROSS = 1, //!< a cross-shaped structuring element: 1157 | // //!< \f[E_{ij} = \fork{1}{if i=\texttt{anchor.y} or j=\texttt{anchor.x}}{0}{otherwise}\f] 1158 | // MORPH_ELLIPSE = 2 1159 | ////******************************************///// 1160 | 1161 | 1162 | Mat dstImage; 1163 | if(listVariableMainWid.isEmpty()){ 1164 | QMessageBox emptybox; 1165 | emptybox.about(NULL,"信息","没有加载图片"); 1166 | } 1167 | else 1168 | { 1169 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 1170 | VariateDialog *varDlg=new VariateDialog(strg, 1171 | listVariableMainWid, 1172 | textDlg, 1173 | VariaeCount, 1174 | listCV_CodeWid1, 1175 | listCV_CodeWid2, 1176 | listCV_CodeWid3); 1177 | varDlg->exec();//显示对话框 1178 | 1179 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 1180 | { 1181 | Mat matOri;//创建一个Mat 1182 | for(int i=0;icomboxStr) 1186 | { 1187 | matOri=listMatMainWid.at(i); 1188 | break; 1189 | } 1190 | } 1191 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 1192 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 1193 | 1194 | 1195 | //////////////////////////////// 1196 | ///*******获取变量**********// 1197 | /////////////////////// 1198 | QString var1=varDlg->lineEditStr1;//获取变量1 1199 | QString var2=varDlg->lineEditStr2;//获取变量2 1200 | 1201 | 1202 | for(int i=0;i9)//mat list 长度超过9后要开辟空间 1274 | { 1275 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 1276 | listMatMainWid.append(matImageMainWid); 1277 | } 1278 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 1279 | 1280 | 1281 | emit sendStr(-1,sendstrg); 1282 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1); 1283 | emit sendAction(); 1284 | listCodeMainWid.append(sendstrg); 1285 | } 1286 | else 1287 | { 1288 | QMessageBox mesg; 1289 | mesg.about(NULL,"信息","已经取消输入"); 1290 | } 1291 | } 1292 | } 1293 | 1294 | void MainWindow::on_ac_histogram_triggered() 1295 | { 1296 | 1297 | // //信号和槽写在这里会导致卡 1298 | // his_dlg=new HistogtamDlg; 1299 | // connect(this,SIGNAL(sendDataToHistogtamdlg(QList,QList)), 1300 | // his_dlg,SLOT(receiveDataForHistogtamdlg(QList,QList))); 1301 | // connect(his_dlg,SIGNAL(sendToShowhistogtam(Mat,int,int)), 1302 | // this,SLOT(receiveHistogtamResult(Mat,int,int))); 1303 | // //////// 1304 | 1305 | bool flags=false; 1306 | for(int i=0;imdiArea->subWindowList().size();i++) 1307 | { 1308 | QString str=ui->mdiArea->subWindowList().at(i)->windowTitle(); 1309 | if(str=="直方图分割") 1310 | { 1311 | ui->mdiArea->setActiveSubWindow(ui->mdiArea->subWindowList().at(i)); 1312 | flags=true; 1313 | break; 1314 | } 1315 | } 1316 | 1317 | if(flags==false) 1318 | { 1319 | if(listVariableMainWid.size()!=0) 1320 | { 1321 | 1322 | his_dlg=new HistogtamDlg; 1323 | connect(this,SIGNAL(sendDataToHistogtamdlg(QList,QList)), 1324 | his_dlg,SLOT(receiveDataForHistogtamdlg(QList,QList))); 1325 | connect(his_dlg,SIGNAL(sendToShowhistogtam(Mat,int,int)), 1326 | this,SLOT(receiveHistogtamResult(Mat,int,int))); 1327 | 1328 | //处理后图像返回 1329 | connect(his_dlg,SIGNAL(hdSendDataMW(Mat,QString,QString,int,int)), 1330 | this,SLOT(receiveDataHd(Mat,QString,QString,int,int))); 1331 | //程序流程窗口,将操作函数文本发送给程序流程窗口 1332 | connect(his_dlg,SIGNAL(hdSendStr(int,QString)),this,SLOT(receiveStrHd(int,QString)));//发送到code 1333 | 1334 | 1335 | 1336 | ui->mdiArea->addSubWindow(his_dlg);//->resize(550,422); 1337 | his_dlg->show(); 1338 | emit sendDataToHistogtamdlg(listVariableMainWid,listMatMainWid); 1339 | his_dlg->refreshSenddata(); 1340 | // qDebug()<<"ok";//输出计时 1341 | } 1342 | else 1343 | { 1344 | QMessageBox msg; 1345 | msg.about(NULL,"信息","无加载图片"); 1346 | } 1347 | } 1348 | 1349 | // his_dlg->refreshSenddata(); 1350 | } 1351 | 1352 | 1353 | void MainWindow::receiveHistogtamResult(Mat HistogtamMat,int left_m,int right_m) 1354 | { 1355 | 1356 | // ///写在这里会卡 1357 | // show_his_image=new ShowHistogtamResult; 1358 | // connect(this,SIGNAL(sendHistogtam_Mat(Mat)),show_his_image,SLOT(receiveHistogtam_Mat(Mat))); 1359 | // //// 1360 | 1361 | bool flags2=false; 1362 | for(int i=0;imdiArea->subWindowList().size();i++) 1363 | { 1364 | QString str2=ui->mdiArea->subWindowList().at(i)->windowTitle(); 1365 | if(str2=="直方图分割处理结果") 1366 | { 1367 | ui->mdiArea->setActiveSubWindow(ui->mdiArea->subWindowList().at(i)); 1368 | flags2=true; 1369 | break; 1370 | } 1371 | } 1372 | if(flags2==false) 1373 | { 1374 | if(listVariableMainWid.size()!=0) 1375 | { 1376 | 1377 | show_his_image=new ShowHistogtamResult; 1378 | connect(this,SIGNAL(sendHistogtam_Mat(Mat)),show_his_image,SLOT(receiveHistogtam_Mat(Mat))); 1379 | 1380 | ui->mdiArea->addSubWindow(show_his_image)->resize(300,300); 1381 | show_his_image->show(); 1382 | show_his_image->showHistogtam_Mat(HistogtamMat); 1383 | } 1384 | } 1385 | 1386 | show_his_image->reFresh(); 1387 | 1388 | emit sendHistogtam_Mat(HistogtamMat); 1389 | } 1390 | 1391 | void MainWindow::on_ac_demo_triggered() 1392 | { 1393 | 1394 | 1395 | 1396 | QString strg="自定义图像处理"; 1397 | QString textDlg="算子:无"; 1398 | QList listCV_CodeWid1; 1399 | listCV_CodeWid1={"Not"}; 1400 | QList listCV_CodeWid2; 1401 | listCV_CodeWid2={"Not"}; 1402 | QList listCV_CodeWid3; 1403 | listCV_CodeWid3={"Not"}; 1404 | int VariaeCount=1; 1405 | 1406 | 1407 | Mat dstImage; 1408 | if(listVariableMainWid.isEmpty()){ 1409 | QMessageBox emptybox; 1410 | emptybox.about(NULL,"信息","没有加载图片"); 1411 | } 1412 | else 1413 | { 1414 | //打开操作对话框,创建时候需要将数据输入,操作名,变量list,算子解释 1415 | VariateDialog *varDlg=new VariateDialog(strg, 1416 | listVariableMainWid, 1417 | textDlg, 1418 | VariaeCount, 1419 | listCV_CodeWid1, 1420 | listCV_CodeWid2, 1421 | listCV_CodeWid3); 1422 | varDlg->exec();//显示对话框 1423 | 1424 | if(varDlg->cancelDlg==1)//做判断如果对话框点击取消或叉则不添加,等于1时才赋值等 1425 | { 1426 | Mat matOri;//创建一个Mat 1427 | for(int i=0;icomboxStr) 1431 | { 1432 | matOri=listMatMainWid.at(i); 1433 | break; 1434 | } 1435 | } 1436 | QString inImgDlgVar=varDlg->comboxStr;//输入变量名字 1437 | QString outImgDlgVar=varDlg->lineEditStr;//输出变量名字 1438 | 1439 | 1440 | for(int i=0;idepth, src2->nChannels); 1476 | 1477 | IplImage *src = 0; //定义源图像指针 1478 | IplImage *tmp = 0; //定义临时图像指针 1479 | IplImage *src_back = 0; //定义源图像背景指针 1480 | IplConvKernel *element = 0; //定义形态学结构指针 1481 | 1482 | //1.读取和显示图像 1483 | // /* the first command line parameter must be image file name */ 1484 | // src = cvLoadImage("D:/ImageTest/rice.png", 0); 1485 | src = cvLoadImage("D:/ImageTest/1.bmp", 0); 1486 | 1487 | // src = cvLoadImage("D:/ImageTest/Rice.png", 0); 1488 | cvNamedWindow( "src", CV_WINDOW_AUTOSIZE ); 1489 | cvShowImage( "src", src ); 1490 | //cvSmooth(src, src, CV_MEDIAN, 3, 0, 0, 0); //中值滤波,消除小的噪声; 1491 | 1492 | //2.估计图像背景 1493 | tmp = cvCreateImage( cvGetSize(src), src->depth, src->nChannels); 1494 | src_back = cvCreateImage( cvGetSize(src), src->depth, src->nChannels); 1495 | //创建结构元素 1496 | element = cvCreateStructuringElementEx( 4, 4, 1, 1, CV_SHAPE_ELLIPSE, 0); 1497 | //用该结构对源图象进行数学形态学的开操作后,估计背景亮度 1498 | cvErode( src, tmp, element, 10); 1499 | cvDilate( tmp, src_back, element, 10); 1500 | cvNamedWindow( "src_back", CV_WINDOW_AUTOSIZE ); 1501 | cvShowImage( "src_back", src_back ); 1502 | 1503 | ///////////////////////////////// 1504 | //////////////////////////////// 1505 | //////////////////////////////// 1506 | //////////////////////////////// 1507 | /////////////////////////////// 1508 | 1509 | 1510 | dstImage=cvarrToMat(src_back2);//转化语句 1511 | 1512 | QString sendstrg=QString("code(%1,%2);//输入:%1,输出:%2\r\n") 1513 | .arg(inImgDlgVar).arg(outImgDlgVar); 1514 | 1515 | if(listVariableMainWid.size()>9) 1516 | { 1517 | Mat matImageMainWid = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 1518 | listMatMainWid.append(matImageMainWid); 1519 | } 1520 | listMatMainWid.insert(listVariableMainWid.size()-1,dstImage);//添加图元list 1521 | 1522 | 1523 | emit sendStr(-1,sendstrg);//发送到code 1524 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1);//发送到list 1525 | emit sendAction();//刷新list 1526 | listCodeMainWid.append(sendstrg);//添加到code存储表中 1527 | 1528 | 1529 | } 1530 | else 1531 | { 1532 | QMessageBox mesg; 1533 | mesg.about(NULL,"信息","已经取消输入"); 1534 | } 1535 | } 1536 | 1537 | } 1538 | 1539 | void MainWindow::receiveDataHd(Mat dstImage,QString strg,QString outImgDlgVar,int a,int b) 1540 | { 1541 | 1542 | QMessageBox mesg; 1543 | mesg.about(NULL,"信息","输出图像"); 1544 | 1545 | // emit sendStr(-1,sendstrg);//发送到code 1546 | emit sendDataMW(dstImage,strg,outImgDlgVar,0,-1);//发送到list 1547 | emit sendAction();//刷新list 1548 | } 1549 | 1550 | //灰度阈值分割处理结果code 1551 | void MainWindow::receiveStrHd(int a,QString strCode) 1552 | { 1553 | 1554 | emit sendStr(-1,strCode); 1555 | 1556 | } 1557 | -------------------------------------------------------------------------------- /mainwindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MAINWINDOW_H 2 | #define MAINWINDOW_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "imagelook.h" 9 | #include "histogtamdlg.h" 10 | #include "showhistogtamresult.h" 11 | 12 | 13 | #include 14 | #include 15 | 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | 23 | using namespace cv; 24 | 25 | //class ImageLook; 26 | class MyImageList; 27 | 28 | 29 | namespace Ui { 30 | class MainWindow; 31 | } 32 | 33 | class MainWindow : public QMainWindow 34 | { 35 | Q_OBJECT 36 | 37 | public: 38 | explicit MainWindow(QWidget *parent = 0); 39 | ~MainWindow(); 40 | 41 | void closeEvent(QCloseEvent *event); 42 | 43 | MyImageList *myimagelists; 44 | HistogtamDlg *his_dlg; 45 | ShowHistogtamResult *show_his_image; 46 | 47 | // QString lineEditStr1; 48 | // QString lineEditStr2; 49 | // int lineInt1; 50 | // int lineInt2; 51 | 52 | signals: 53 | void sendDataMW(Mat,QString,QString,int,int); //给图元窗口发送信号,将Mat,图像变量名称,操作名称,行号,标记号发送给图元窗口 54 | void sendAction(); //给图元窗口发送信号,让其刷新数据 55 | void sendStr(int,QString); //程序流程窗口,将操作函数文本发送给程序流程窗口 56 | 57 | // void sendDataToHistogtamdlg(QList,QList,int); 58 | void sendDataToHistogtamdlg(QList,QList); 59 | void sendHistogtamResult(Mat); 60 | void sendHistogtam_Mat(Mat); 61 | 62 | 63 | private slots: 64 | void mesgbox(); 65 | void receiveDataList(Mat imageData,QString textData,QString controlName); 66 | void receiveHistogtamResult(Mat,int,int); 67 | void receiveDataHd(Mat,QString,QString,int,int);//灰度阈值分割处理结果 68 | void receiveStrHd(int,QString);//灰度阈值分割处理结果code 69 | // void receiveDlg(QString,QString,int,int); 70 | 71 | void on_ac_openfile_triggered(); 72 | 73 | void on_ac_savefile_triggered(); 74 | 75 | // void on_ac_horizontal_triggered(); 76 | 77 | // void on_ac_vertial_triggered(); 78 | 79 | void on_ac_imageOriginal_triggered(); 80 | 81 | void on_ac_codeFlow_triggered(); 82 | 83 | void on_ac_order_triggered(); 84 | 85 | void on_ac_stacking_triggered(); 86 | 87 | void on_ac_closeAll_triggered(); 88 | 89 | void on_ac_nextOne_triggered(); 90 | 91 | void on_ac_preOne_triggered(); 92 | 93 | void on_ac_gray_triggered(); 94 | 95 | void on_ac_h_v_triggered(); 96 | 97 | void on_ac_erode_triggered(); 98 | 99 | void on_ac_dilate_triggered(); 100 | 101 | void on_ac_programme_triggered(); 102 | 103 | void on_ac_histogram_triggered(); 104 | 105 | void on_ac_demo_triggered(); 106 | 107 | private: 108 | Ui::MainWindow *ui; 109 | 110 | Mat pImgMat; 111 | QList listVariableMainWid;//对应图像变量名字 112 | QList listMatMainWid;//图像数据 113 | QList listNameMainWid;//图像操作名 114 | QList listCodeMainWid;//code流程 115 | bool saveOffOn; 116 | QString fileExist; 117 | QString filePathExist; 118 | 119 | }; 120 | 121 | #endif // MAINWINDOW_H 122 | -------------------------------------------------------------------------------- /mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 500 11 | 12 | 13 | 14 | Opencv开发平台 15 | 16 | 17 | 18 | :/images/eye_64px.png:/images/eye_64px.png 19 | 20 | 21 | 22 | 23 | 24 | 25 | 1 26 | 27 | 28 | QMdiArea::CreationOrder 29 | 30 | 31 | QTabWidget::South 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 0 42 | 800 43 | 22 44 | 45 | 46 | 47 | 48 | 文件 49 | 50 | 51 | 52 | 53 | 54 | 55 | 图像处理 56 | 57 | 58 | 59 | 翻转 60 | 61 | 62 | 63 | 64 | 65 | 形态处理 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 滤波 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 放缩 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 旋转 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 灰度处理 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 窗口 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | TopToolBarArea 133 | 134 | 135 | false 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | :/images/fileopen.png:/images/fileopen.png 150 | 151 | 152 | 打开图像 153 | 154 | 155 | 156 | 157 | 158 | :/images/filesave.png:/images/filesave.png 159 | 160 | 161 | 保存图像 162 | 163 | 164 | 165 | 166 | 167 | :/images/Mirror_Horizontally_32.png:/images/Mirror_Horizontally_32.png 168 | 169 | 170 | 翻转操作 171 | 172 | 173 | 翻转操作 174 | 175 | 176 | 177 | 178 | 179 | :/images/fushi.png:/images/fushi.png 180 | 181 | 182 | 腐蚀 183 | 184 | 185 | 186 | 187 | 膨胀 188 | 189 | 190 | 191 | 192 | 形态学处理 193 | 194 | 195 | 形态学处理,开闭运算,顶黑帽运算 196 | 197 | 198 | 199 | 200 | 均值 201 | 202 | 203 | 204 | 205 | 高斯 206 | 207 | 208 | 209 | 210 | 中值 211 | 212 | 213 | 214 | 215 | 双边 216 | 217 | 218 | 219 | 220 | 放大(PyrUp) 221 | 222 | 223 | 224 | 225 | 缩小(PyrDown) 226 | 227 | 228 | 229 | 230 | 放大缩小(Resize) 231 | 232 | 233 | 放大缩小(Resize) 234 | 235 | 236 | 237 | 238 | 顺时针 239 | 240 | 241 | 242 | 243 | 顺时针放缩 244 | 245 | 246 | 247 | 248 | 逆时针 249 | 250 | 251 | 252 | 253 | 零旋转放缩 254 | 255 | 256 | 257 | 258 | 图元窗口 259 | 260 | 261 | 262 | 263 | 程序流程窗口 264 | 265 | 266 | 267 | 268 | 平铺 269 | 270 | 271 | 平铺窗口 272 | 273 | 274 | 275 | 276 | 叠层 277 | 278 | 279 | 叠层排布 280 | 281 | 282 | 283 | 284 | 关闭所有 285 | 286 | 287 | 关闭所有窗口 288 | 289 | 290 | 291 | 292 | 下一个 293 | 294 | 295 | 下一个窗口 296 | 297 | 298 | 299 | 300 | 前一个 301 | 302 | 303 | 前一个窗口 304 | 305 | 306 | 307 | 308 | 309 | :/images/Gray_24px.png:/images/Gray_24px.png 310 | 311 | 312 | 灰度处理 313 | 314 | 315 | 316 | 317 | 二值图 318 | 319 | 320 | 二值图 321 | 322 | 323 | 324 | 325 | 326 | :/images/eye_32px.png:/images/eye_32px.png 327 | 328 | 329 | 自定义程序 330 | 331 | 332 | 自定义程序运行 333 | 334 | 335 | 336 | 337 | 338 | :/images/Chart_64t.png:/images/Chart_64t.png 339 | 340 | 341 | 直方图分割 342 | 343 | 344 | 直方图分割 345 | 346 | 347 | 348 | 349 | 自定义2 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | -------------------------------------------------------------------------------- /myimagelist.cpp: -------------------------------------------------------------------------------- 1 | #include "myimagelist.h" 2 | #include "ui_myimagelist.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "imagelook.h" 9 | #include "mainwindow.h" 10 | #include "ui_mainwindow.h" 11 | #include 12 | 13 | 14 | #pragma execution_character_set("utf-8") 15 | 16 | 17 | MyImageList::MyImageList(QWidget *parent) : 18 | QWidget(parent), 19 | ui(new Ui::MyImageList) 20 | { 21 | ui->setupUi(this); 22 | setWindowTitle("图元窗口"); 23 | Mat matImage; 24 | for (int i=0;i<10;++i){ 25 | matImage = Mat(Size(2200, 2200), CV_8UC3);//QPixmap(2200,2200); 26 | matList<listWidget->setIconSize(QSize(70, 80)); 72 | ui->listWidget->setResizeMode(QListView::Adjust); 73 | ui->listWidget->setViewMode(QListView::IconMode); 74 | ui->listWidget->setMovement(QListView::Static); 75 | LItem->setSizeHint(QSize(70,80)); 76 | ui->listWidget->addItem(LItem);//insertItem(3,LItem); 77 | showTableView(dstImage,listText.at(ui->listWidget->row(LItem)),listData.at(ui->listWidget->row(LItem)),ui->listWidget->row(LItem)); 78 | 79 | } 80 | 81 | 82 | //点击list图显示imagelook图像 83 | void MyImageList::on_listWidget_itemClicked(QListWidgetItem *item) 84 | { 85 | if(!item) 86 | { 87 | return; 88 | } 89 | int rowNb=ui->listWidget->row(item); 90 | emit sendDataList(matList.at(rowNb),listData.at(rowNb),listText.at(rowNb));//imagelook获得数据,窗口名字和图片 91 | showTableView(matList.at(rowNb),listText.at(rowNb),listData.at(rowNb),rowNb); 92 | } 93 | 94 | 95 | //void MyImageList:: on_listWidget_itemDoubleClicked(QListWidgetItem *item) 96 | //{ 97 | // if(!item) 98 | // { 99 | // return; 100 | // } 101 | // int rowNb=ui->listWidget->row(item); 102 | // qDebug() <<"双击了"<listWidget->row(item); 113 | // qDebug() <<"信号"<9) 133 | { 134 | Mat matImage=Mat(Size(2220, 2200), CV_8UC3); 135 | matList.append(matImage); 136 | } 137 | matList.insert(listText.size()-1,listMat); 138 | } 139 | if(marks>0) 140 | { 141 | listText.insert(listRow,listName); 142 | listData.insert(listRow,listV); 143 | matList.insert(listRow,listMat); 144 | } 145 | 146 | 147 | } 148 | 149 | void MyImageList::updataListShow(QString listNames,Mat listMats,int listRow) 150 | { 151 | 152 | // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。 153 | QImage images((const uchar*)listMats.data, listMats.cols, 154 | listMats.rows,listMats.cols*listMats.channels(),QImage::Format_RGB888); 155 | 156 | // QPixmap pixmapCV = QPixmap::fromImage(images.scaled(size(), Qt::KeepAspectRatio) ); 157 | QPixmap pixmapCV =QPixmap::fromImage(images); 158 | 159 | // QString strg=strName; 160 | QListWidgetItem *LItem = new QListWidgetItem(QIcon(pixmapCV.scaled(50,50)), listNames); 161 | ui->listWidget->setIconSize(QSize(70, 80)); 162 | ui->listWidget->setResizeMode(QListView::Adjust); 163 | ui->listWidget->setViewMode(QListView::IconMode); 164 | ui->listWidget->setMovement(QListView::Static); 165 | LItem->setSizeHint(QSize(70,80)); 166 | ui->listWidget->insertItem(listRow,LItem); 167 | 168 | } 169 | 170 | void MyImageList::updataListShows(int marks) 171 | { 172 | if(marks==1) 173 | { 174 | ui->listWidget->clear(); 175 | int j=listText.size(); 176 | // QString str=QString::number(j,10,0); // 这是你的变量 177 | // QMessageBox mesg; 178 | // mesg.about(NULL,"信息" , str); 179 | 180 | for ( int i=0; itableView->setEditTriggers(QAbstractItemView::NoEditTriggers); 206 | ui->tableView->setAutoScroll(true); 207 | QStandardItemModel *model = new QStandardItemModel; 208 | ui->tableView->setModel(model); 209 | ui->tableView->horizontalHeader()->hide(); 210 | ui->tableView->verticalHeader()->hide(); 211 | 212 | model->setItem(0,0,new QStandardItem("名称: ")); 213 | model->setItem(1,0,new QStandardItem("变量: ")); 214 | model->setItem(2,0,new QStandardItem("宽度: ")); 215 | model->setItem(3,0,new QStandardItem("高度: ")); 216 | model->setItem(4,0,new QStandardItem("其他: ")); 217 | 218 | model->setItem(0,1,new QStandardItem(textData));//图像操作名称 219 | 220 | QString strh=QString::number(imageData.cols,10,0); 221 | QString strw=QString::number(imageData.rows,10,0); 222 | 223 | // QString strVariable= QString("image%1").arg(rows); 224 | 225 | model->setItem(1,1,new QStandardItem(strVariable)); 226 | model->setItem(2,1,new QStandardItem(strh)); 227 | model->setItem(3,1,new QStandardItem(strw)); 228 | model->setItem(4,1,new QStandardItem("")); 229 | ui->tableView->resizeColumnToContents(0); 230 | ui->tableView->resizeColumnToContents(1); 231 | } 232 | 233 | 234 | -------------------------------------------------------------------------------- /myimagelist.h: -------------------------------------------------------------------------------- 1 | #ifndef MYIMAGELIST_H 2 | #define MYIMAGELIST_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include //视图类 9 | #include //场景类 10 | #include //图元类 11 | #include "mypixitem.h" 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | using namespace cv; 20 | 21 | 22 | namespace Ui { 23 | class MyImageList; 24 | } 25 | 26 | class MyImageList : public QWidget 27 | { 28 | Q_OBJECT 29 | 30 | public: 31 | explicit MyImageList(QWidget *parent = 0); 32 | ~MyImageList(); 33 | 34 | void showListItem(Mat dstImage,QString strName,QString controlName); 35 | void intoList(QString listName,QString listV,Mat listMat,int listRow,int marks); 36 | void updataListShow(QString listNames,Mat listMats,int listRow); 37 | void updataListShows(int marks); 38 | void showTableView(Mat,QString,QString,int); 39 | 40 | 41 | 42 | private slots: 43 | void on_listWidget_itemClicked(QListWidgetItem *item); 44 | 45 | // void on_listWidget_itemDoubleClicked(QListWidgetItem *item); //实验双击 46 | // void on_listWidget_itemActivated(QListWidgetItem *item); //实验 47 | 48 | void receiveDataWM(Mat,QString,QString,int,int);//接收mainwindow打开文件数据 49 | void receiveAction(); 50 | 51 | 52 | 53 | signals: 54 | //图元窗口图片被选中后弹出视图窗口,图元窗口间Mat和变量名返回给主窗口,主窗口再讲变量发给视图窗口 55 | void sendDataList(Mat imageData,QString textData,QString controlName);//发送信号 56 | 57 | private: 58 | Ui::MyImageList *ui; 59 | 60 | //声明IplImage指针 61 | IplImage *pImg; 62 | Mat pImgs; 63 | 64 | QList listText;//存储图像名称 65 | QList listData;//存储图像变量名称 66 | QList pixmapList;//存储图像 67 | 68 | QList matList;//存储mat图像 69 | 70 | }; 71 | 72 | #endif // MYIMAGELIST_H 73 | -------------------------------------------------------------------------------- /myimagelist.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MyImageList 4 | 5 | 6 | 7 | 0 8 | 0 9 | 500 10 | 380 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 5 19 | 20 | 21 | 1 22 | 23 | 24 | 9 25 | 26 | 27 | 1 28 | 29 | 30 | 1 31 | 32 | 33 | 34 | 35 | 图元窗口 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 变量窗口 46 | 47 | 48 | 49 | 50 | 51 | 52 | Qt::ScrollBarAsNeeded 53 | 54 | 55 | Qt::ScrollBarAsNeeded 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /mypixitem.cpp: -------------------------------------------------------------------------------- 1 | #include "mypixitem.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #pragma execution_character_set("utf-8") 11 | 12 | //构造函数初始化了变量pix 13 | MyPixItem::MyPixItem(QPixmap *pixmap) 14 | { 15 | pix = *pixmap; 16 | setAcceptDrops(true); //设置可拖拽 17 | m_scaleValue = 0;//放缩值初始化 18 | m_isMove = false;//不可移动 19 | widx=0; 20 | widy=0; 21 | } 22 | 23 | //实现自己的图元边界函数 24 | QRectF MyPixItem::boundingRect() const 25 | { 26 | return QRectF(-pix.width()/2, -pix.height()/2, 27 | pix.width(), pix.height());//需要对应图元,不然出现残影 28 | } 29 | 30 | //只需QPainter的drawPixmap()函数将图元图片绘出即可 31 | void MyPixItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, 32 | QWidget *) 33 | { 34 | painter->drawPixmap(-pix.width()/2, -pix.height()/2, pix);//需要对应边界函数 35 | } 36 | 37 | //鼠标点击事件 38 | void MyPixItem::mousePressEvent(QGraphicsSceneMouseEvent *event) 39 | { 40 | m_startPos = event->pos(); 41 | m_isMove = true;//图元是否可以移动 42 | } 43 | 44 | void MyPixItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 45 | { 46 | if(m_isMove) 47 | { 48 | QPointF point =mapToScene(event->pos())-mapToScene(m_startPos); 49 | moveBy(point.x(),point.y()); 50 | // 鼠标点击后并移动则图元相应移动,进行了图元坐标映射,映射到窗口中 51 | } 52 | } 53 | 54 | void MyPixItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *) 55 | { 56 | m_isMove = false; 57 | } 58 | 59 | 60 | //双击复位 61 | void MyPixItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) 62 | { 63 | setPos(0,0); 64 | m_scaleValue = 0; 65 | setScale(1); 66 | setTransformOriginPoint(0, 0); 67 | 68 | //做了坐标映射,将图片回复到窗口中心 69 | QPointF m_center; 70 | m_center=mapToScene(0,0); 71 | if(m_center.x()!=0||m_center.y()!=0) 72 | { 73 | if(m_center.x()>0&&m_center.y()>0) moveBy(-m_center.x(), -m_center.y()); 74 | if(m_center.x()<0&&m_center.y()<0) moveBy(m_center.x(), m_center.y()); 75 | if(m_center.x()>0&&m_center.y()<0) moveBy(-m_center.x(), m_center.y()); 76 | if(m_center.x()<0&&m_center.y()>0) moveBy(m_center.x(), -m_center.y()); 77 | } 78 | 79 | } 80 | 81 | //使用滚轮整体缩放 82 | void MyPixItem::wheelEvent(QGraphicsSceneWheelEvent *event) 83 | { 84 | setZoomState(NO_STATE); 85 | int scaleValue = m_scaleValue; 86 | if(event->delta() > 0) //delta()为正,滚轮向上滚 87 | { 88 | scaleValue++; 89 | } 90 | else 91 | { 92 | scaleValue--; 93 | } 94 | 95 | if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES) 96 | return; 97 | 98 | m_scaleValue = scaleValue; 99 | qreal s; 100 | if(m_scaleValue > 0) 101 | { 102 | s = pow(1.1, m_scaleValue); //放大 计算x的y方次 参数都是double类型 103 | } 104 | else 105 | { 106 | s = pow(1 / 1.1, -m_scaleValue); //缩小 107 | } 108 | setScale(s);//setScale设置比例放缩,内置的处理图像放缩的方法 109 | if(sceneBoundingRect().width()>=widx||sceneBoundingRect().height()>=widy) 110 | { 111 | // m_isMove = false; 112 | setTransformOriginPoint(event->pos());//基于图元坐标内鼠标指针变换中心 113 | } 114 | } 115 | 116 | //从widget获取的缩放值,用于同步滚轮和按键 117 | void MyPixItem::setScaleValue(const int &scaleValue) 118 | { 119 | if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES) 120 | return; 121 | 122 | m_scaleValue = scaleValue; 123 | 124 | qreal s; 125 | if(m_scaleValue > 0) 126 | { 127 | s = pow(1.1, m_scaleValue); //放大 计算x的y方次 参数都是double类型,去除正负数 128 | } 129 | else 130 | { 131 | s = pow(1 / 1.1, -m_scaleValue); //缩小 132 | } 133 | setScale(s); 134 | } 135 | 136 | //复原图像 137 | void MyPixItem::setZoomState(const int &zoomState) 138 | { 139 | m_zoomState = zoomState; 140 | if (m_zoomState == RESET) 141 | { 142 | m_scaleValue = 0; 143 | setScale(1); 144 | setTransformOriginPoint(0, 0); 145 | } 146 | } 147 | 148 | //获取放缩值 149 | int MyPixItem::getScaleValue() const 150 | { 151 | return m_scaleValue; 152 | } 153 | 154 | //返回窗口值 155 | void MyPixItem::setValue(const QPointF &pointxy) 156 | { 157 | QPointF p; 158 | p=pointxy; 159 | widx=p.x(); 160 | widy=p.y(); 161 | } 162 | -------------------------------------------------------------------------------- /mypixitem.h: -------------------------------------------------------------------------------- 1 | #ifndef PIXITEM_H 2 | #define PIXITEM_H 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | using namespace cv; 20 | 21 | //枚举方便传递 22 | enum Enum_ZoomState{ 23 | NO_STATE, 24 | RESET, 25 | ZOOM_IN, 26 | ZOOM_OUT 27 | }; 28 | 29 | //放大缩小值范围 30 | enum Enum_ZoomTimes{ 31 | ZOOM_IN_TIMES = 50, 32 | ZOOM_OUT_TIMES = -50, 33 | }; 34 | 35 | //直接继承QGraphicsObject,这样有信号和槽QGraphicsItem没有信号和槽功能 36 | class MyPixItem :public QGraphicsObject//public QGraphicsItem 37 | //继承自图元类,实现自定义的图元,qt预置的有直线,椭圆,文本图元,矩形图元等 38 | { 39 | public: 40 | MyPixItem(QPixmap *pixmap); //构造函数初始化了变量pix 41 | QRectF boundingRect() const; 42 | //实现自己的boundingRect 图元边界方法,继承QGraphicsItem必须要初始化话的虚函数 43 | //完成以图元坐标系为基础增加两个像素点的冗余的工作 44 | 45 | void paint(QPainter *painter, 46 | const QStyleOptionGraphicsItem *option, 47 | QWidget *widget); //重画图形函数 48 | 49 | void wheelEvent(QGraphicsSceneWheelEvent *event);//滚轮放大缩小 50 | void setZoomState(const int &zoomState);//设置图像恢复原始 51 | void mousePressEvent(QGraphicsSceneMouseEvent *event);//用于移动图像 52 | void mouseMoveEvent(QGraphicsSceneMouseEvent *event);//用于移动图像 53 | void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);//用于移动图像 54 | void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);//双击恢复图像 55 | int getScaleValue() const;//获取当前图元放缩值 56 | void setScaleValue(const int &);//返回放放缩值 57 | void setValue(const QPointF &);//返回窗口大小值 58 | int widx; 59 | int widy; 60 | 61 | signals: 62 | 63 | 64 | private: 65 | qreal m_scaleValue; //缩放值 66 | QPixmap pix; //作为图元显示的图片 67 | int m_zoomState; 68 | bool m_isMove; 69 | QPointF m_startPos; 70 | }; 71 | 72 | #endif // PIXITEM_H 73 | -------------------------------------------------------------------------------- /rc.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/fileopen.png 4 | images/filesave.png 5 | images/Mirror_Horizontally_32.png 6 | images/Mirror_Vertically_32.png 7 | images/eye_32px.png 8 | images/eye_64px.png 9 | images/eye_72px.png 10 | images/Gray_24px.png 11 | images/Chart_64gray.png 12 | images/Chart_64t.png 13 | images/fushi.png 14 | 15 | 16 | -------------------------------------------------------------------------------- /showhistogtamresult.cpp: -------------------------------------------------------------------------------- 1 | #include "showhistogtamresult.h" 2 | #include "ui_showhistogtamresult.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #pragma execution_character_set("utf-8") 9 | 10 | 11 | 12 | /////////////////////////////////// 13 | /// \brief ShowHistogtamResult::ShowHistogtamResult 14 | /// \param parent 15 | ///直方图显示程序会让程序特别的卡,可能是paintEvent(QPaintEvent *)的缘故 16 | /// 目前没有更好的方法解决个bug; 17 | /// 18 | /// 19 | /// 20 | /// 21 | 22 | ShowHistogtamResult::ShowHistogtamResult(QWidget *parent) : 23 | QWidget(parent), 24 | ui(new Ui::ShowHistogtamResult) 25 | { 26 | ui->setupUi(this); 27 | 28 | ui->show_label->setScaledContents(true);//自动调整为Qlabel大小。 29 | 30 | // QWidget *widget = new QWidget(); 31 | // widget->setAutoFillBackground(true); 32 | // QPalette palette; 33 | // QPixmap pixmap(":/Resources/Penguins.jpg"); 34 | // palette.setBrush(QPalette::Window, QBrush(pixmap)); 35 | // widget->setPalette(palette); 36 | // widget->show(); 37 | 38 | this->setAutoFillBackground(true); 39 | 40 | 41 | } 42 | 43 | ShowHistogtamResult::~ShowHistogtamResult() 44 | { 45 | delete ui; 46 | } 47 | 48 | void ShowHistogtamResult::showHistogtam_Mat(Mat receive_Mat) 49 | { 50 | source_gray_Mat=receive_Mat; 51 | setPicture(resultMat); 52 | 53 | } 54 | 55 | 56 | void ShowHistogtamResult::setPicture(Mat his_Mat) 57 | { 58 | ui->show_label->clear(); 59 | 60 | QImage image; 61 | Mat pImgs=his_Mat;//m_listMat_glob.at(0); 62 | 63 | if(pImgs.channels()==1)//灰度图通道变为1 64 | { 65 | //灰度转换时候Format_Grayscale8 66 | QImage imageGray((const uchar*)pImgs.data, pImgs.cols, 67 | pImgs.rows,pImgs.cols*pImgs.channels(),QImage::Format_Grayscale8); 68 | image=imageGray; 69 | } 70 | else 71 | { 72 | // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。 73 | QImage imageOriginal((const uchar*)pImgs.data, pImgs.cols, 74 | pImgs.rows,pImgs.cols*pImgs.channels(),QImage::Format_RGB888); 75 | image=imageOriginal; 76 | } 77 | 78 | // image = image.scaled(this->geometry().size(),Qt::KeepAspectRatio,Qt::SmoothTransformation); 79 | QPixmap pixmapCV =QPixmap::fromImage(image); 80 | // ui->show_label->setPixmap(pixmapCV); 81 | // ui->show_label->setAlignment(Qt::AlignCenter); 82 | 83 | 84 | 85 | QPalette palette; 86 | palette.setBrush(this->backgroundRole(), 87 | QBrush(pixmapCV.scaled(this->size(), 88 | Qt::IgnoreAspectRatio, 89 | Qt::SmoothTransformation))); 90 | 91 | this->setPalette(palette); 92 | 93 | } 94 | 95 | // void HistogtamDlg::closeEvent(QCloseEvent *event) 96 | // { 97 | // //在这里添加你希望执行关闭事件需要处理的事情 98 | // //弹出消息框,关闭其他窗口 99 | // } 100 | 101 | void ShowHistogtamResult::paintEvent(QPaintEvent *) 102 | { 103 | // ui->show_label->clear(); 104 | // ui->show_label->resize(this->geometry().size()); 105 | // setPicture(resultMat); 106 | reFresh(); 107 | 108 | } 109 | 110 | 111 | 112 | void ShowHistogtamResult::reFresh() 113 | { 114 | // ui->show_label->clear(); 115 | setPicture(resultMat); 116 | } 117 | 118 | 119 | void ShowHistogtamResult::receiveHistogtam_Mat(Mat re_Mat) 120 | { 121 | ui->show_label->clear(); 122 | resultMat=re_Mat; 123 | setPicture(resultMat); 124 | } 125 | -------------------------------------------------------------------------------- /showhistogtamresult.h: -------------------------------------------------------------------------------- 1 | #ifndef SHOWHISTOGTAMRESULT_H 2 | #define SHOWHISTOGTAMRESULT_H 3 | 4 | #include 5 | #include "histogtamdlg.h" 6 | 7 | #include "math.h" 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | using namespace cv; 15 | 16 | namespace Ui { 17 | class ShowHistogtamResult; 18 | } 19 | 20 | class ShowHistogtamResult : public QWidget 21 | { 22 | Q_OBJECT 23 | 24 | public: 25 | explicit ShowHistogtamResult(QWidget *parent = 0); 26 | ~ShowHistogtamResult(); 27 | 28 | void setPicture(Mat); 29 | void showHistogtam_Mat(Mat); 30 | void reFresh(); 31 | Mat source_gray_Mat; 32 | Mat resultMat; 33 | 34 | 35 | private: 36 | Ui::ShowHistogtamResult *ui; 37 | void paintEvent(QPaintEvent *); 38 | 39 | 40 | private slots: 41 | void receiveHistogtam_Mat(Mat); 42 | 43 | }; 44 | #endif // SHOWHISTOGTAMRESULT_H 45 | -------------------------------------------------------------------------------- /showhistogtamresult.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | ShowHistogtamResult 4 | 5 | 6 | 7 | 0 8 | 0 9 | 474 10 | 366 11 | 12 | 13 | 14 | 直方图分割处理结果 15 | 16 | 17 | 18 | 19 | 20 | 处理结果 21 | 22 | 23 | true 24 | 25 | 26 | Qt::AlignCenter 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /variatedialog.cpp: -------------------------------------------------------------------------------- 1 | #include "variatedialog.h" 2 | //#include "ui_variatedialog.h" 3 | #include "mainwindow.h" 4 | #include 5 | #include 6 | 7 | VariateDialog::VariateDialog(QString title, 8 | QList ListVariateDlg, 9 | QString text, 10 | int VariaeCount, 11 | QList ListCV_CodeDlg1, 12 | QList ListCV_CodeDlg2, 13 | QList ListCV_CodeDlg3)//:QDialog(parent) 14 | { 15 | 16 | m_title=title; 17 | m_text=text; 18 | m_listVatiate=ListVariateDlg; 19 | m_listCV_Code1=ListCV_CodeDlg1; 20 | m_listCV_Code2=ListCV_CodeDlg2; 21 | m_listCV_Code3=ListCV_CodeDlg3; 22 | 23 | 24 | cancelDlg=0; 25 | 26 | if(m_title.isEmpty()) {m_title="无";} 27 | if(m_text.isEmpty()) {m_text="无";} 28 | 29 | setWindowTitle(m_title); 30 | setModal(true); 31 | setFixedSize(380,220+VariaeCount*30); 32 | 33 | combox=new QComboBox(this); 34 | 35 | QLabel *labName1=new QLabel(this);//算子标题 36 | QLabel *labName12=new QLabel(this);//算子解释 37 | QLabel *labName2=new QLabel(this);//输入变量 38 | QLabel *labName3=new QLabel(this);//输出变量 39 | 40 | QFrame *line=new QFrame(this); 41 | line->setFrameShape(QFrame::HLine); 42 | line->setFrameShadow(QFrame::Sunken); 43 | 44 | QFrame *line2=new QFrame(this); 45 | line2->setFrameShape(QFrame::HLine); 46 | line2->setFrameShadow(QFrame::Sunken); 47 | 48 | QFont lb_font; 49 | lb_font.setPointSize(12); 50 | QPushButton *btOK=new QPushButton(this); 51 | QPushButton *btCancel=new QPushButton(this); 52 | QLineEdit *lineEdit1=new QLineEdit;//输出变量填写框 53 | QGridLayout *layouts=new QGridLayout;//创建对齐对象 54 | 55 | 56 | 57 | // 只能输入英文和数字 58 | // QRegExp regx("[a-zA-Z0-9]+$"); 59 | QRegExp regx("^[a-zA-Z][a-zA-Z0-9_]*$");//开头必须英文 60 | QValidator *validator = new QRegExpValidator(regx,this); 61 | lineEdit1->setValidator(validator); 62 | //不能重复变量 63 | 64 | 65 | // lineEdit2->setText("1"); 66 | lineEdit1->setToolTip("只能输入英文及数字"); 67 | btOK->setText("确定"); 68 | btCancel->setText("取消"); 69 | labName1->setText(m_title); 70 | labName12->setText(m_text); 71 | labName2->setText("输入对象 (Input src):"); 72 | labName3->setText("输出变量(Output dst):"); 73 | labName1->setFont(lb_font);//标题字体 74 | layouts->addWidget(labName1,0,1,1,2); 75 | layouts->addWidget(labName12,1,1,1,2); 76 | layouts->addWidget(line,2,1,1,2); 77 | layouts->addWidget(labName2,3,1,1,1); 78 | layouts->addWidget(combox,3,2,1,1); 79 | layouts->addWidget(labName3,4,1,1,1); 80 | layouts->addWidget(lineEdit1,4,2,1,1); 81 | 82 | 83 | 84 | for(int i=0;iaddItem(stri); 88 | } 89 | 90 | 91 | if(m_listCV_Code1.at(0)=="Yes_combox")//列表 92 | { 93 | // QMessageBox mesg; 94 | // mesg.about(NULL,"提示",m_listCV_Code1.at(0)); 95 | comboxVar1=new QComboBox(this);//变量box 96 | for(int i=1;iaddItem(stri); 100 | } 101 | 102 | QLabel *labNameVar1=new QLabel(this); 103 | labNameVar1->setText("变量值1(int flipCode1):"); 104 | layouts->addWidget(labNameVar1,5,1,1,1); 105 | layouts->addWidget(comboxVar1,5,2,1,1); 106 | 107 | } 108 | 109 | 110 | if(m_listCV_Code1.at(0)=="Yes_Number_int")//只呢输入数字整数 111 | { 112 | // QMessageBox mesg; 113 | // mesg.about(NULL,"提示",m_listCV_Code1.at(0)); 114 | lineEditVar1=new QLineEdit(this); 115 | QLabel *labNameVar1=new QLabel(this); 116 | labNameVar1->setText("变量值1(int flipCode1):"); 117 | layouts->addWidget(labNameVar1,5,1,1,1); 118 | layouts->addWidget(lineEditVar1,5,2,1,1); 119 | 120 | //只能输入整数 121 | QRegExp rx("^-?\\d+$"); 122 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 123 | lineEditVar1->setValidator(pReg); 124 | connect(lineEditVar1,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit1(QString))); 125 | } 126 | 127 | 128 | if(m_listCV_Code1.at(0)=="Yes_Number_double")//输入浮点数 129 | { 130 | lineEditVar1=new QLineEdit(this); 131 | QLabel *labNameVar1=new QLabel(this); 132 | labNameVar1->setText("变量值1(int flipCode1):"); 133 | layouts->addWidget(labNameVar1,5,1,1,1); 134 | layouts->addWidget(lineEditVar1,5,2,1,1); 135 | 136 | 137 | //限制浮点数输入范围为[-999999.9999,999999.9999] 138 | QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)"); 139 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 140 | lineEditVar1->setValidator(pReg); 141 | connect(lineEditVar1,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit1(QString))); 142 | 143 | } 144 | 145 | 146 | if(m_listCV_Code2.at(0)=="Yes_combox") 147 | { 148 | 149 | comboxVar2=new QComboBox(this);//变量box 150 | for(int i=1;iaddItem(stri); 154 | } 155 | 156 | QLabel *labNameVar2=new QLabel(this); 157 | labNameVar2->setText("变量值2(int flipCode2):"); 158 | layouts->addWidget(labNameVar2,6,1,1,1); 159 | layouts->addWidget(comboxVar2,6,2,1,1); 160 | } 161 | 162 | 163 | 164 | if(m_listCV_Code2.at(0)=="Yes_Number_int") 165 | { 166 | 167 | 168 | lineEditVar2=new QLineEdit(this); 169 | QLabel *labNameVar2=new QLabel(this); 170 | labNameVar2->setText("变量值2(int flipCode2):"); 171 | layouts->addWidget(labNameVar2,6,1,1,1); 172 | layouts->addWidget(lineEditVar2,6,2,1,1); 173 | 174 | //只能输入整数 175 | QRegExp rx("^-?\\d+$"); 176 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 177 | lineEditVar2->setValidator(pReg); 178 | connect(lineEditVar2,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit2(QString))); 179 | } 180 | 181 | 182 | if(m_listCV_Code2.at(0)=="Yes_Number_double")//输入浮点数 183 | { 184 | 185 | lineEditVar2=new QLineEdit(this); 186 | QLabel *labNameVar2=new QLabel(this); 187 | labNameVar2->setText("变量值2(int flipCode2):"); 188 | layouts->addWidget(labNameVar2,6,1,1,1); 189 | layouts->addWidget(lineEditVar2,6,2,1,1); 190 | 191 | 192 | //限制浮点数输入范围为[-999999.9999,999999.9999] 193 | QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)"); 194 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 195 | lineEditVar2->setValidator(pReg); 196 | connect(lineEditVar2,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit2(QString))); 197 | } 198 | 199 | 200 | 201 | if(m_listCV_Code3.at(0)=="Yes_combox") 202 | { 203 | 204 | 205 | comboxVar3=new QComboBox(this);//变量box 206 | for(int i=1;iaddItem(stri); 210 | } 211 | 212 | QLabel *labNameVar3=new QLabel(this); 213 | labNameVar3->setText("变量值3(int flipCode3):"); 214 | layouts->addWidget(labNameVar3,7,1,1,1); 215 | layouts->addWidget(comboxVar3,7,2,1,1); 216 | 217 | } 218 | 219 | 220 | 221 | 222 | if(m_listCV_Code3.at(0)=="Yes_Number_int") 223 | { 224 | 225 | lineEditVar3=new QLineEdit(this); 226 | QLabel *labNameVar3=new QLabel(this); 227 | labNameVar3->setText("变量值2(int flipCode2):"); 228 | layouts->addWidget(labNameVar3,7,1,1,1); 229 | layouts->addWidget(lineEditVar3,7,2,1,1); 230 | 231 | //只能输入整数 232 | QRegExp rx("^-?\\d+$"); 233 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 234 | lineEditVar3->setValidator(pReg); 235 | connect(lineEditVar3,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit3(QString))); 236 | } 237 | 238 | 239 | if(m_listCV_Code3.at(0)=="Yes_Number_double")//输入浮点数 240 | { 241 | 242 | lineEditVar3=new QLineEdit(this); 243 | QLabel *labNameVar3=new QLabel(this); 244 | labNameVar3->setText("变量值1(int flipCode1):"); 245 | layouts->addWidget(labNameVar3,7,1,1,1); 246 | layouts->addWidget(lineEditVar3,7,2,1,1); 247 | 248 | 249 | //限制浮点数输入范围为[-999999.9999,999999.9999] 250 | QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)"); 251 | QRegExpValidator *pReg = new QRegExpValidator(rx, this); 252 | lineEditVar3->setValidator(pReg); 253 | connect(lineEditVar3,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit3(QString))); 254 | } 255 | 256 | // comboxVar1=new QComboBox(this);//变量box 257 | // comboxVar2=new QComboBox(this);//变量box 258 | // comboxVar3=new QComboBox(this);//变量box 259 | 260 | // QLabel *labName4=new QLabel(this); 261 | // QLabel *labName5=new QLabel(this); 262 | 263 | // QLineEdit *lineEdit2=new QLineEdit; 264 | // QLineEdit *lineEdit3=new QLineEdit; 265 | 266 | // lineEdit2->setEnabled(false); 267 | // lineEdit3->setEnabled(false); 268 | 269 | // labName4->setText("变量值1(int flipCode1):"); 270 | // labName5->setText("变量值2(int flipCode2):"); 271 | 272 | 273 | // //限制浮点数输入范围为[-999999.9999,999999.9999] 274 | // QRegExp rx("^(-?[0]|-?[1-9][0-9]{0,5})(?:\\.\\d{1,4})?$|(^\\t?$)"); 275 | // QRegExpValidator *pReg = new QRegExpValidator(rx, this); 276 | // lineEdit2->setValidator(pReg); 277 | // lineEdit3->setValidator(pReg); 278 | 279 | // layouts->addWidget(labName4,5,1,1,1); 280 | // layouts->addWidget(lineEdit2,5,2,1,1); 281 | // layouts->addWidget(labName5,6,1,1,1); 282 | // layouts->addWidget(lineEdit3,6,2,1,1); 283 | 284 | 285 | layouts->addWidget(line2,6+VariaeCount,1,1,2); 286 | layouts->addWidget(btCancel,7+VariaeCount,1,1,1); 287 | layouts->addWidget(btOK,7+VariaeCount,2,1,1); 288 | layouts->setVerticalSpacing(10); 289 | 290 | 291 | 292 | setLayout(layouts); 293 | 294 | // lineEditStr1=combox->currentText(); 295 | // lineEditStr=lineEdit1->text(); 296 | // QString var1,var2; 297 | // var1=lineEdit2->text();//输入变量1 298 | // var2=lineEdit3->text();//输入变量2 299 | // double val=str.toDouble(); 300 | // lineInt1=QString::number(var1,10,0); 301 | // lineInt2=QString::number(var2,10,0); 302 | 303 | connect(btCancel,SIGNAL(clicked(bool)),this,SLOT(close())); 304 | connect(btOK,SIGNAL(clicked(bool)),this,SLOT(sendDlg(bool))); 305 | connect(lineEdit1,SIGNAL(textChanged(QString)),this,SLOT(getLineEdit(QString))); 306 | 307 | } 308 | 309 | void VariateDialog::sendDlg(bool) 310 | { 311 | comboxStr=combox->currentText(); 312 | 313 | if(m_listCV_Code1.at(0)=="Yes_combox") {lineEditStr1=comboxVar1->currentText();} 314 | if(m_listCV_Code2.at(0)=="Yes_combox") {lineEditStr2=comboxVar2->currentText();} 315 | if(m_listCV_Code3.at(0)=="Yes_combox") {lineEditStr3=comboxVar3->currentText();} 316 | 317 | cancelDlg=1; 318 | this->close(); 319 | } 320 | 321 | void VariateDialog::getLineEdit(QString linestr) 322 | { 323 | for(int i=0;imdiArea->subWindowList().size(),10,0); 327 | QMessageBox mesg; 328 | mesg.about(NULL,"提示","输出变量不能等于输入变量"); 329 | } 330 | else{lineEditStr=linestr;} 331 | } 332 | } 333 | 334 | void VariateDialog::getLineEdit1(QString linestr) 335 | { 336 | lineEditStr1=linestr; 337 | } 338 | 339 | void VariateDialog::getLineEdit2(QString linestr) 340 | { 341 | lineEditStr2=linestr; 342 | } 343 | 344 | 345 | void VariateDialog::getLineEdit3(QString linestr) 346 | { 347 | lineEditStr3=linestr; 348 | } 349 | 350 | -------------------------------------------------------------------------------- /variatedialog.h: -------------------------------------------------------------------------------- 1 | #ifndef VARIATEDIALOG_H 2 | #define VARIATEDIALOG_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | 23 | #pragma execution_character_set("utf-8") 24 | 25 | 26 | //namespace Ui { 27 | //class VariateDialog; 28 | //} 29 | 30 | class VariateDialog : public QDialog 31 | { 32 | Q_OBJECT 33 | 34 | public: 35 | //dialog初始化函数,窗口标题,输入变量列表,算子解释,算子变量数量,算子变量列表, 36 | VariateDialog(QString title, 37 | QList ListVariateDlg, 38 | QString text, 39 | int VariaeCount, 40 | QList ListCV_CodeDlg1, 41 | QList ListCV_CodeDlg2, 42 | QList ListCV_CodeDlg3); 43 | 44 | QString m_title; 45 | QString m_text; 46 | QList m_listVatiate; 47 | QList m_listCV_Code1; 48 | QList m_listCV_Code2; 49 | QList m_listCV_Code3; 50 | 51 | QString comboxStr; 52 | QString lineEditStr; 53 | 54 | // QString comboxVarStr1; 55 | // QString comboxVarStr2; 56 | // QString comboxVarStr3; 57 | 58 | QComboBox *combox; 59 | QComboBox *comboxVar1; 60 | QComboBox *comboxVar2; 61 | QComboBox *comboxVar3; 62 | 63 | 64 | QLineEdit *lineEditVar1; 65 | QLineEdit *lineEditVar2; 66 | QLineEdit *lineEditVar3; 67 | 68 | 69 | QString lineEditStr1; 70 | QString lineEditStr2; 71 | QString lineEditStr3; 72 | 73 | 74 | 75 | int cancelDlg; 76 | 77 | 78 | private slots: 79 | // void getVarDlg1(QString); 80 | // void getVarDlg2(QString); 81 | // void getVarDlg3(QString); 82 | // void getVarDlg4(QString); 83 | void sendDlg(bool); 84 | void getLineEdit(QString); 85 | void getLineEdit1(QString); 86 | void getLineEdit2(QString); 87 | void getLineEdit3(QString); 88 | 89 | //signals: 90 | // void sendVarDlg(QString,QString,int,int); 91 | 92 | }; 93 | 94 | #endif // VARIATEDIALOG_H 95 | --------------------------------------------------------------------------------