Qt 5.4 + OpenCV 进行图像处理Tips

最近用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下用imreadimwrite读写图像时,若文件路径中包含中文,用QStringtoStdString方法转出来的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需相同):

Qt 5.4 + OpenCV 进行图像处理Tips_第1张图片


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);


你可能感兴趣的:(opencv,Qt,qt,opencv,图像处理)