opencv 自学日记2-在qt项目中使用opencv的链接库

1. 准备
1)OpenCv库文件,头文件; 
如果QT用的编译器是MinGW,那么则无法编译.lib后缀的库文件,所以需要准备.a后缀的opencv库文件。opencv244版本带有mingw的库文件,但opencv2410以后则没有了。 
opencv 自学日记2-在qt项目中使用opencv的链接库如果需要用opencv2410以后的版本,可以Cmake进行手动生成mingw所需要的库文件。教程链接:CMake编译opencv教程 
2)Qt运行环境
2. 在项目中添加库文件
1)右击项目,选择添加库; 
opencv 自学日记2-在qt项目中使用opencv的链接库
2)选择外部库;
3)选择库文件路径: 
opencv 自学日记2-在qt项目中使用opencv的链接库
4)选择头文件路径: 
opencv 自学日记2-在qt项目中使用opencv的链接库
5)修改选项,去掉“为Debug版本添加-d后缀选项”,因为MinGw编译环境需要的库文件没找到-d后缀的库文件。VC编译的则有-d后缀的库文件。如果不去掉这个选项,在MinGw下Debug编译就会有问题。 
opencv 自学日记2-在qt项目中使用opencv的链接库
6)完成前面步骤则成功添加了一个库文件,继续添加库文件可以重复上面的步骤,也可以直接复制-修改-粘贴;后面两个库文件为复制第一个,然后改动库文件名得到($$PWD代表项目所在根目录)。到此添加库文件完成。 
opencv 自学日记2-在qt项目中使用opencv的链接库
3包含头文件,使用opencv函数
1)包含头文件
#include "opencv2/opencv.hpp"using namespace cv;//只需包含该头文件及命名空间,则所有opencv的头文件都被包含
  • 1
  • 2
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路径下;