1. 准备
1)OpenCv库文件,头文件;
如果QT用的编译器是MinGW,那么则无法编译.lib后缀的库文件,所以需要准备.a后缀的opencv库文件。opencv244版本带有mingw的库文件,但opencv2410以后则没有了。
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的头文件都被包含
- 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:
\opencv
2_4_10
\include\opencv\
F:
\opencv
2_4_10
\include\opencv
2
\
F:
\opencv
2_4_10
\include
#
库文件路径LIBS+= F:
\opencv
2_4_10
\lib\libopencv
_core2410.dll.a
\
F:
\opencv
2_4_10
\lib\libopencv
_highgui2410.dll.a
\
F:
\opencv
2_4_10
\lib\libopencv
_imgproc2410.dll.a
建议使用第一种方法,这样就不用去记,只需要按照向导完成添加就好。
使用MinGw编译记得在添加的时候把“为debug版本添加-d后缀”选项去掉。
检查头文件路径是否正确,opencv的include文件夹又分为了opencv和opencv2两个子文件夹。
2)图像读取失败
检查读取的路径是否正确,注意在QCreate启动的程序的读取路径和点击.exe启动的读取路径是不同的。
3)把.dll添加到debug或release路径下;