Windows下QT搭建OpenCv环境
1. 准备
1)OpenCv库文件,头文件;
如果QT用的编译器是MinGW,那么则无法编译.lib后缀的库文件,所以需要准备.a后缀的opencv库文件。opencv244版本带有mingw的库文件,但opencv2410以后则没有了。
如果需要用opencv2410以后的版本,可以Cmake进行手动生成mingw所需要的库文件。教程链接:CMake编译opencv教程
本人所编译的opencv2410mingw库文件
2)Qt运行环境
2. 在项目中添加库文件
1)右击项目,选择添加库;
2)选择外部库;
3)选择库文件路径:
4)选择头文件路径:
5)修改选项,去掉“为Debug版本添加-d后缀选项”,因为MinGw编译环境需要的库文件没找到-d后缀的库文件。VC编译的则有-d后缀的库文件。如果不去掉这个选项,在MinGw下Debug编译就会有问题。
6)完成前面步骤则成功添加了一个库文件,继续添加库文件可以重复上面的步骤,也可以直接复制-修改-粘贴;后面两个库文件为复制第一个,然后改动库文件名得到($$PWD代表项目所在根目录)。到此添加库文件完成。
3包含头文件,使用opencv函数
1)包含头文件
#include "opencv2/opencv.hpp"
using namespace cv;//只需包含该头文件及命名空间,则所有opencv的头文件都被包含
2)读取图像,这里开了一个线程不断的读取图像;
void imageshow::run()
{
IplImage *img;
char buf[64] = {0};
int i = 0;
while(!isStop)
{
//读取图像;
sprintf(buf,"image/%d.jpg",i);
img = cvLoadImage(buf);
if(!img)
{
//读取失败则跳出循环;
break;
}
i++;
//判断图像的像素坐标原点是左上角或左下角,因为QT图像像素原点为左上角,所以opencv图像原点如果是左下角,则需要转换;
if(img->origin == IPL_ORIGIN_TL)
{
}
else
{
cvFlip(img,img,0);
}
//把opencv的BGR转换成QT的RGB;
cvCvtColor(img, img, CV_BGR2RGB);
emit drawImg(img);
}
}
3)显示图像
void Widget::drawImg(IplImage *img)
{
QImage qtempimg((uchar*)(img->imageData), img->width, img->height ,QImage::Format_RGB888);
//设置label所显示的内容自动适配label的大小;
ui->label->setScaledContents(true);
ui->label->setPixmap(QPixmap::fromImage(qtempimg));
//释放image
cvReleaseImage(&img);
}
注意问题
1)编译出错
检查库文件路径是否正确,除了上面说到的添加库的方法,还有其它的方法,例如:
#头文件路径
INCLUDEPATH+= F:\opencv2_4_10\include\opencv\
F:\opencv2_4_10\include\opencv2\
F:\opencv2_4_10\include
#库文件路径
LIBS+= F:\opencv2_4_10\lib\libopencv_core2410.dll.a \
F:\opencv2_4_10\lib\libopencv_highgui2410.dll.a \
F:\opencv2_4_10\lib\libopencv_imgproc2410.dll.a
建议使用第一种方法,这样就不用去记,只需要按照向导完成添加就好。
使用MinGw编译记得在添加的时候把“为debug版本添加-d后缀”选项去掉。
检查头文件路径是否正确,opencv的include文件夹又分为了opencv和opencv2两个子文件夹。
2)图像读取失败
检查读取的路径是否正确,注意在QCreate启动的程序的读取路径和点击.exe启动的读取路径是不同的。
3)把.dll添加到debug或release路径下;
本文相关Demo