OpenCV垫无法在调试模式下工作

时间:2017-08-11 11:06:13

标签: c++ qt opencv

我试图创建一个功能,可以使用OpenCV 3.1设置QImage的对比度/亮度。这完全适用于发布,但不适用于调试(它返回一个空白图像):

true

你看到可能出现什么问题吗?

修改

我的.pro(两个相关的dll在bin目录中)。

QImage getNewImage(QImage *img, float contrast, float brightness)
{
    // Convert image to temporary cv::Mat with a deep copy
    // Output format is BGRA
    cv::Mat temp(img->height(),img->width(),CV_8UC4,(uchar*)img->bits(),img->bytesPerLine());

    temp.convertTo(temp, -1, contrast, brightness);
    cv::cvtColor(temp, temp, CV_BGRA2RGB);

    // Convert back to QImage RGB
    QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    return dest;
}

包括:

INCLUDEPATH += ../lib/opencv/include

CONFIG(debug, debug|release) {
    LIBS += ../lib/opencv/opencv_world310d.lib
} else {
    LIBS += ../lib/opencv/opencv_world310.lib
}

2 个答案:

答案 0 :(得分:1)

QImage的构造函数:

QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
  

使用给定的宽度,高度和格式构造图像   现有的内存缓冲区,数据。宽度和高度必须是   以像素为单位指定bytesPerLine指定每个字节数   line(stride)。

     

缓冲区必须在QImage的整个生命周期内保持有效   未经修改或以其他方式分离的副本   原始缓冲区。

确保在从此函数返回之前调用非const QImage::bits()

  

返回指向第一个像素数据的指针。这相当于   扫描线(0)。

     

请注意,QImage使用隐式数据共享。此功能执行   共享像素数据的深拷贝,从而确保了这个QImage   唯一使用当前返回值的人。

dest.bits(); // does deep copy
return dest;

或者你在堆栈QImage容器中有一个Cv::Mat的内部缓冲区,当然从getNewImage函数返回后返回新的QImage时,它当然超出了范围}实例制作了QImage dest的浅表副本。这是QImage的一个功能,旨在通过其实例优化传递大块图形数据,而不会发生转换,因此我们无法避免在此处调用QImage::bits

显然,由于发布和调试模式之间的运行时差异,释放的堆栈内存中的缓冲区被覆盖,并显示代码出现问题。并且调试模式运行时会写入释放的运行时内存以防止这样的错误:In Visual Studio C++, what are the memory allocation representations?

答案 1 :(得分:0)

我遇到了同样的问题,就好像我在函数中创建Mat对象相比,qtcreator调试器无法调试该函数,只是用一个空的调试窗口将其停止并在一段时间后超时,因此我添加了Mat对象变量在类定义中,然后调试器运行顺利并按预期工作! :)(对不起,英语不好)