├── 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 |
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 |
--------------------------------------------------------------------------------