2017-08-11 68 views
3

我试图创建一个功能,使得可以使用OpenCV 3.1设置QImage的对比度/亮度。这完美的作品在释放,但在调试(它返回一个空白图像):OpenCV垫不能在调试模式下工作

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

你看到可能是什么问题呢?


编辑

我的.pro(两个相关的DLL都在bin目录)。

INCLUDEPATH += ../lib/opencv/include 

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

包括:

#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
+0

您是否在项目设置中添加了所有库? – Viktoria

+0

你如何建立这个?你可以在这里分享你的qmake/cmake文件吗?也许有什么优化..? –

+1

_“//将图像转换为具有深层副本的临时cv :: Mat”_不是深层复制,btw – Miki

回答

1

QImage使用的构造:

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

构造具有给定宽度,高度和格式的图像,即使用 现有存储器缓冲,数据。宽度和高度必须为 ,以像素为单位。 bytesPerLine指定每行 行(stride)的字节数。

缓冲区必须在QImage的所有生命周期中保持有效,并且所有 副本尚未修改或从 原始缓冲区中分离。

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

返回指向第一像素数据。这相当于 scanLine(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?

相关问题