在做了信号槽与opencv的结合使用后,又选用了一种简单的方式来显示彩色,灰度,二值图片。
程序代码运行结果如下:
结果显示左图是彩色图,中间是灰度图,右边是二值图。
代码展示如下:
//qt_gray_binary_1.h
#ifndef QT_GRAY_BINARY_1_H
#define QT_GRAY_BINARY_1_H
#include <QtWidgets/QMainWindow>
#include "ui_qt_gray_binary_1.h"
#include<QtGui/QPainter>
#include <QtCore/QPoint>
#include <cv.h>
#include "qtcvimage.h"
class qt_gray_binary_1 : public QMainWindow
{
Q_OBJECT
public:
qt_gray_binary_1(QWidget *parent = 0);
~qt_gray_binary_1();
IplImage* image;
IplImage* imageGray;
IplImage* imageBin;
private:
Ui::qt_gray_binary_1Class ui;
QtCVImage* a;
QtCVImage* b;
QtCVImage* c;
};
#endif // QT_GRAY_BINARY_1_H
//qt_gray_binary_1.cpp
#include "qt_gray_binary_1.h"
#include <QMessageBox>
#include <opencv/cv.h>
#include<opencv/highgui.h>
#include <opencv/cvaux.h>
qt_gray_binary_1::qt_gray_binary_1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
/*this->read_in();
this->gray_img();
this->binary_img();
this->display();
*/
image=cvLoadImage("C:\\Users\\801\\Desktop\\3.jpg");//加载彩色图
a=new QtCVImage(image,this);
imageGray=cvCreateImage(cvGetSize(image),image->depth,1);//给imageGray分配存储空间
cvCvtColor(image,imageGray,CV_RGB2GRAY);//彩色图转换为灰度图
b=new QtCVImage(imageGray,this);
imageBin=cvCreateImage(cvGetSize(imageGray),imageGray->depth,1);//灰度图转换为二值图
cvThreshold(imageGray,imageBin, 0, 200, CV_THRESH_OTSU);// 转为二值图
c=new QtCVImage(imageBin,this);
ui.verticalLayout->addWidget(a);
ui.verticalLayout_2->addWidget(b);
ui.verticalLayout_3->addWidget(c);
}
qt_gray_binary_1::~qt_gray_binary_1()
{
}
这个里面比单纯的opencv图像的转换多出来的创新点就在于,保证了图片在一个界面能够同时显示,可视化比较好。
a=new QtCVImage(image,this);
b=new QtCVImage(imageGray,this);
c=new QtCVImage(imageBin,this);
ui.verticalLayout->addWidget(a);
ui.verticalLayout_2->addWidget(b);
ui.verticalLayout_3->addWidget(c);
这部分代码主要实现了以上的窗口显示。对应Qt上的界面,主要进行了如下的操作:
首先是在窗口中拖入三个Widget Containers,然后在Widget Containers上面拖入三个Vertical Layout(一一对应),然后点击窗口的空白处进行布局,效果如图所示:
这就是一个基本的界面布局。
这就为图片的显示打好基础,如果布局这部分有不清楚的,可以看一下《C++ GUI Qt4 编程(第二版)》,这本书当中有介绍布局管理,可以参考。