我试图创建一个功能,可以使用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
}
答案 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对象变量在类定义中,然后调试器运行顺利并按预期工作! :)(对不起,英语不好)