硬件和软件部分搞定之后,就可以正式上手了。很多书或者教程开始都是介绍OpenCV的历史等等之类的,但是一般人对这些都没兴趣,也不需要知道,所以本文就略过了。
OpenCV系列的第一个实例就是打开图片,而且一般人也不喜欢黑框框。现在找工作都是要求了解一定的图形框架,根据难易程度,我们从Qt开始。同时会添加一些函数或者其他信息。
1.1 新建Qt项目
新建Qt项目
1.2 添加库文件位置
在Qt项目文件*.pro中添加OpenCV库文件位置
unix:{
INCLUDEPATH += /usr/include/opencv4/
LIBS +=
-lopencv_core -lopencv_highgui -lopencv_videoio
-lopencv_imgcodecs -lopencv_imgproc -lopencv_ml
}
win32:{
INCLUDEPATH += C:Librariesopencvbuildinclude
LIBS += -LC:Librariesopencvbuildx64mingwbin
-lopencv_core412
-lopencv_dnn412
-lopencv_highgui412
-lopencv_imgcodecs412
-lopencv_imgproc412
-lopencv_ml412
}
1.3 临时文件处理
Qt编译后会产生很多的中间文件,我们通过项目设置来将临时文件移至统一的文件夹中。
DESTDIR = bin #可执行文件位置
OBJECTS_DIR = tmp/obj # gcc编译后的obj文件位置
RCC_DIR = tmp/rcc #Qt的resource文件编译后的位置
UI_DIR = tmp/ui #UI文件编译后的位置
MOC_DIR = tmp/moc #Qt的一种机制编译后文件位置
1.4 包含头文件
#include <opencv2/opencv.hpp>
using namespace cv;
在Qt中按住Ctrl,点击头文件名,可以跳转到头文件内容。
可以看到此头文件已经包含了所有需要的其他头文件,所有只需要这一个就够了。
1.5 显示图片
1.5.1 OpenCV显示
OpenCV库中提供了GUI界面用于显示图片
在mainwindow.cpp中mainwindow构造函数中添加代码:
Mat srcImage = imread("lena.jpg");//读取图片
imshow("lena",srcImage);//显示图片
显示图片函数中有两个参数:第一个是显示窗口名称,必须是英文,如果为中文会无法显示;第二个参数是图片数据。
lena图片要与可执行文件在同一个文件夹中。
1.5.2 Qt显示图片
既然是图像界面,那么就应该有打开、显示的过程。Qt图片操作是通过QImage类来操作的。
在Qt的UI界面中添加菜单栏和动作
在菜单栏中添加File菜单,在File菜单下添加Open行为。在下方的列表中选中actionOpen右击“转到槽”
triggered表示鼠标点击这个操作行为。这样在mainwidow.cpp中会生成一个槽函数,点击后会执行槽函数中的代码。
//打开操作,然后选择图片
QString filePath = QFileDialog::getOpenFileName(this,tr("Open"));
if(filePath.isEmpty()){//如果没有选中图片,则退出
qDebug()<<"Select nothing";
return;
}
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
std::string imagePath = codec->fromUnicode(filePath).data();//将QString转换为std::string
Mat srcImage = imread(imagePath);//从选中的图片的位置读取数据
if(!srcImage.data){//如果数据为空则退出,保险起见
//对话框显示错误信息
QMessageBox::information(this,tr("Waring"),tr("Cannot find data in selected file"),QMessageBox::Ok);
return;
}
ui->labelImg->clear();//清空界面中label中的所有信息
cvtColor(srcImage,srcImage,COLOR_RGB2BGR);//数据转换
QImage img = QImage((const unsigned char*)(srcImage.data),
srcImage.cols,srcImage.rows,srcImage.cols*srcImage.channels(),
QImage::Format_RGB888);//获取mat中的数据,并填充到QImage对象中
//img = img.scaled(label->size());
ui->labelImg->setPixmap(QPixmap::fromImage(img));//显示图片
具体的函数说明、参数、实例详见Qt的实例和官方文档库。
https://docs.opencv.org/4.1.2/index.htmldocs.opencv.org
按照一般的软件操作,点击file,点击open,选中图片,将会自动显示。
代码在github中。