书中大量例程均使用Qt GUI应用,后文提到的Model-View-Controller模式也是非常值得借鉴的,所以我们就从Qt GUI开始吧
启动Qt Creator 新建一个 Qt Widget Application:
直接点击完成即可,并记得给工程.pro文件添加OpenCV的路径
之后可以看到有一个界面文件mainwindow.ui 它定义了UI的布局,利用此,我们可以通过拖拽不同的控件直观的设计我们想要的界面,如图。
右击设计好的按钮,在菜单中选择“转到槽”书中英文写的是“Go to slot"(这蛋疼的翻译啊),选择clicked()选项,之后会跳转到mainwindow.cpp文件中,并添加了Slot函数,当接收到该按键时,Click()将调用它。
void MainWindow::on_ButtonOpenImage_clicked()
{
}
为了可以实现功能,我们对MainWindow类进行进一步的修改,打开mainWindow.h,添加OpenCV中core.hpp,以及highgui.hpp头文件,并定义了一个cv::Mat 的成员变量:
#define MAINWINDOW_H
#include <QMainWindow>
<strong>#include <QFileDialog>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp></strong>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_ButtonOpenImage_clicked();
private:
Ui::MainWindow *ui;
<strong> cv::Mat image; //图像变量</strong>
};
#endif // MAINWINDOW_H
第一个按钮为打开图像,我们把相应的操作写在对应的函数槽中(为了编程方便,写入了using namespace cv):
void MainWindow::on_ButtonOpenImage_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
image = imread(filename.toLatin1().data());
namedWindow("Original Image");
imshow("Original Image",image);
}
注意哈!Qt5以后已经把toAscii()函数去掉了(书中使用该函数),需要用toLatin1()代替掉。
同样的,我们为第二个按钮增加clicked()槽,并对函数槽进行编辑:
void MainWindow::on_ButtonProcess_clicked()
{
flip(image,image,1);
namedWindow("Output Image");
imshow("Output Image",image);
}
其中file()函数是将图像进行翻转。
运行就OK了!