2014-03-27 41 views
0

當我調整墊子時,有一些奇怪的事情發生在我的OpenCV墊子上。從一個指針創建墊子,調整它的大小並返回指向新墊子的指針

這是OpenCV的頭: 第i個接收的指針從在Visual C#我的託管代碼:

unsigned char * PointerImage(unsigned char* matData, int widht) 

我在OpenCV中創建從所述指針的墊:

cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData); 

如果我不應用調整大小,我發送指向我的mat創建到我的程序在Visual C#中,它工作正常,我可以在我的視覺C#中顯示圖像。

unsigned char *data = OriginalImg.data; 

問題開始當我申請調整大小把圖像更大:

cv::resize(OriginalImg, OriginalImg, size(270,270)); 

現在我不能看到圖像。

這裏是整個代碼:

unsigned char * PointerImage(unsigned char* matData, int widht){ 

    cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData); 
    cv::resize(OriginalImg, OriginalImg, size); 
    unsigned char *data = OriginalImg.data; 

    return data; 

} 

我懷疑指針當我申請調整大小。 謝謝。

+0

ouuch。看起來像非常破碎的設計 – berak

+1

cv :: resize可能會重新分配OriginalImg。但是如果是這樣的話,當你離開PointerImage函數時,OriginalImg會被破壞,並且你會留下懸掛的數據ptr。 – berak

+0

我以爲同樣,我應用marol的建議,現在它工作正常。謝謝你 – roma

回答

1

用戶@berak是非常正確的。你的代碼中有內存泄漏。您不能返回指向該函數中創建的變量數據的本地指針。當程序離開PointerIMage函數作用域時,會觸發OriginalImg對象的析構函數。內存被釋放,OriginalImg.data也是如此,使得這個指針不可用。你可以在你的C++代碼中使用全局變量(實際上不是很好的解決方案),或者將你的C++代碼封裝在稍後可以在c#中使用的類中(取決於你如何調用本地代碼形式.NET)。

+0

非常感謝你,當我創建一個全局矩陣並將originalImg的數據複製到其中時,然後調整它的大小並返回它工作正常的指針。謝謝 – roma