OpenCV error note

1. OpenCV Mat copy 的方法

在使用 Mat 複製時,特別要注意到不能直接把等號打上,cv::Mat 會認為是另外一個Mat的參考,表示說兩個 Mat 都是指向同一組數據。因此,要 Copy Mat 的話要用 copyTo 或是 clone 這兩種方式來實現。

example :

cv::Mat img1 = cv::imread("123.bmp");

cv::Mat img2 = img1; // "warning" 沒有數據拷貝

cv::Mat img3 = img1.clone(); // 有數據拷貝

cv::Mat img4;

img1.copyTo( img4 ); //有數據拷貝

今天就是犯了這樣一個大錯誤,害我花了很多時間 debug 。


reference : http://blog.csdn.net/jianguo_cui/article/details/7387169



2. release Mat error

上禮拜在做 Mat reread的動作時,在 debug mode 的狀態下,程式可以正常運作,但換到 release mode 時,Mat 經過 release() 後再 imread 時,程式出現“堆疊損毀”的錯誤訊息。Google 後發現問題是在於函式在呼叫的過程中,所有的變數、參考及回傳位置都是存放在堆疊底下的,然而 debug 下堆疊的存取是透過暫存器儲存的位址來實現;而 release 下,將暫存器(EBP)最佳化而省略了堆疊位址的指標,因此在存取堆疊時,容易造成回傳位址錯誤,而使堆疊損毀。

解決方法:

在 Mat release 前將 refcount = 0,即可避免發生錯誤。

Mat img = imread("a.bmp",1);
img.refcount = 0;
img.release();
img = imread("b.bmp",1); // re-read an image

另外,如果是從 Iplimage 定義一個 Mat 的情況下,則要用 deallocated() 函式來釋放分配記憶體。


reference : 

http://stackoverflow.com/questions/15873617/cvmats-release-method

http://stackoverflow.com/questions/11156019/opencv-mixing-iplimage-with-cvmat

https://kevincg.wordpress.com/2006/04/19/release


3. save mat suggestion

在寫回 Mat1b 的圖檔時,記得要存成 .bmp 格式,這樣在 photoshop 讀出來的值才會正確。如果今天轉存為 .png 格式,原本 intensity 為 28,在 photoshop 上看到的值會變成 20。

 

Leave a Reply

Your email address will not be published. Required fields are marked *