一、(1) 淺拷貝:
Mat B;
B = image // 第一種方式
Mat C(image); // 第二種方式
這兩種方式稱爲淺copy,是由於它們有不同的矩陣頭,但是它們共享內存空間,即指向一個矩陣。當圖像矩陣發生變化時,兩者相關聯,都會變化。
(2)深拷貝
Mat B,C;
B = image.clone(); // 第一種方式
image.copyTo(C); // 第二種方式
深拷貝是真正的copy了一個新的圖像矩陣,此時image,B,C三者相互沒有影響。
二、IplImage裝換爲Mat
IplImage* iplImage = cvLoadImage("E:\song.jpg",1);
cv::Mat image2(iplImage,false); //其中false爲淺拷貝,而true爲深拷貝,默認爲false。IplImage 和image2共享同一份圖像數據。
此時需要注意釋放iplImage結構指向的內存時必須 調用函數: cvReleaseImage(&iplImage);
當然opencv提供了另外一種指針類,無需手動釋放,但現在已經不用了,可以使用它來封裝IplImage指針:
Ptr<IplImage> iplImage = cvLoadImage("E:\song.jpg",1);
應該儘量避免使用這個廢棄的數據結構,而是使用cv::Mat。
轉自http://www.bubuko.com/infodetail-493981.html