OpenCV垫在调试模式下不工作

Posted

技术标签:

【中文标题】OpenCV垫在调试模式下不工作【英文标题】:OpenCV mat not working in debug mode 【发布时间】:2017-08-11 11:06:12 【问题描述】:

我正在尝试创建一个函数,以便使用 OpenCV 3.1 设置 QImage 的对比度/亮度。这在发布时完美运行,但在调试中不起作用(它返回一个空白图像):

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>

【问题讨论】:

你在项目设置中添加了所有库吗? 你如何构建这个?你能在这里分享你的 qmake/cmake 文件吗?也许有一些优化..? "// 将图像转换为带有深拷贝的临时 cv::Mat" 这不是深拷贝,顺便说一句 【参考方案1】:

使用QImage的构造函数:

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

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

缓冲区必须在 QImage 的整个生命周期内保持有效,并且所有 未修改或以其他方式从 原始缓冲区。

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

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

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

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

或者您在堆栈上的Cv::Mat 容器中有一个QImage 的内部缓冲区,从getNewImage 函数返回后当然超出范围,并且您返回新的QImage 实例制作了@ 的浅表副本987654330@。这是QImage 的一个功能,旨在优化通过其实例传递大块图形数据而没有发生转换,所以我们不能避免在这里调用QImage::bits

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

【讨论】:

【参考方案2】:

我也遇到过同样的问题,好像我在函数中创建了 Mat 对象,而 qtcreator 调试器无法调试该函数刚刚停止并出现一个空的调试窗口并在一段时间后超时,所以我添加了 Mat 对象变量在类定义中,然后调试器顺利进行并按预期工作! :)(抱歉英语不好)

【讨论】:

以上是关于OpenCV垫在调试模式下不工作的主要内容,如果未能解决你的问题,请参考以下文章

此代码在调试模式下工作,但在发布模式下不工作 c++

VC++ OpenCV 项目在发布模式下不显示相机实时捕获

react-native-geolocation-service 在调试模式下正常工作,但在发布模式下不工作

Firebase 手机身份验证仅在发布模式下不启动 OTP,但即使在为发布模式添加 sha1 后也可以在调试模式下工作

为啥消息处理程序在调试模式下不起作用?

为啥我的应用程序在发布模式下崩溃但在调试模式下不崩溃?