最近用Qt+OpenCV写了个图像批处理小工具,把当中遇到的一些注意点记录下来,以备今后查阅。
首先说明一下我的系统平台版本:
Windows 8.0 x64
Qt 5.4 MSVC2013_OpenGL_32bit
OpenCV 2.4.8
其他平台应该大同小异
一、.pro文件 项目配置
1、平台及目录配置。
注意区分Release和Debug。有时需要清除工程甚至手动删掉整个编译后产生的Release或Debug目录,重新编译才起作用
win32{
INCLUDEPATH += E:/Tools/opencv/build/include
CONFIG(debug, release|debug):
{
LIBS += -LE:/Tools/opencv/build/x86/vc12/bin
LIBS += -LE:/Tools/opencv/build/x86/vc12/lib \
-lopencv_core248d \
-lopencv_imgproc248d \
-lopencv_highgui248d \
-lopencv_features2d248d
}
CONFIG(release, release|debug):
{
LIBS += -LE:/Tools/opencv/build/x86/vc12/bin
LIBS += -LE:/Tools/opencv/build/x86/vc12/lib \
-lopencv_core248 \
-lopencv_imgproc248 \
-lopencv_highgui248 \
-lopencv_features2d248
}
}
2、关于 #ifdef _DEBUG
在Debug下想用imshow显示中间结果图片,但不知为何用 #ifdef QT_DEBUG 不起作用。于是只好修改.pro文件:
CONFIG(debug, release|debug):DEFINES += _DEBUG
然后程序中就可以
#ifdef _DEBUG
imshow("Canny", image);
#endif
二、QString转std::string
我在windows下用imread和imwrite读写图像时,若文件路径中包含中文,用QString的toStdString方法转出来的std::string会导致图像读写失败。
(奇怪的是在Mac OS X 下就没问题。。。)
网上查了一下,用一个笨办法解决。(不知道有没有更好的办法)
QTextCodec *code;QString outFile;...code = QTextCodec::codecForName("gb18030");cv::imwrite(code->fromUnicode(outFile).data(), out);
三、OpenCV像素操作
对于带BGR三个通道的图像,大家都知道像素操作可以用img.at<Vec3b>(j,i);
然而 i 跟 j 是行还是是列、是横坐标还是纵坐标,经常会搞错,造成访问越界。网上有些程序写的也是错的。
记住下面这个循环就好:
for(int y = 0; y < input.rows; y++){
for(int x = 0; x < input.cols; x++){
for(int c=0; c<3; c++){
int value = input.at<Vec3b>(y,x)[c];
}
}
}
所以at()函数的第一个参数是纵坐标(也就是行号),第二个参数是横坐标(也就是列号)
四、图像区域拷贝
要把图像B的矩形区域B拷贝到图像A的矩形区域A(图像A、B尺寸可不同,但矩形区域A、B需相同):
Mat aux = ImgA.colRange(rectA.tl().x, rectA.br().x).rowRange(rectA.tl().y, rectA.br().y);
ImgB.colRange(rectB.tl().x, rectB.br().x).rowRange(rectB.tl().y, rectB.br().y).copyTo(aux);