2017-08-11 69 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?

相關問題