Mat 拷貝總結

一、"=" 操作     淺拷貝

Mat imageA = imread("..\\..\\bin\\2.bmp",0);
Mat imageB = imageA;
imageA.setTo(0);
imageA.release();

1、"="操作,相當於imageA 和 imageB指向了同一塊內存。
2、imageA.setTo(0)之後,imageB的圖像內容也跟着改變了。
3、當imageA.release()之後,imgeB中的圖像內容依然存在。
4、但是當執行“=”操作之前,imageA與imageB都爲空時,無指向的內存,所以後面imageA與imageB各自進行的操作都不會相互影響。如下代碼所示:

Mat imageB;
Mat imageA;
imageA = imageB;

二、copyTo clone()深拷貝

Mat imageA = imread("..\\..\\bin\\2.bmp",0);
//Mat imageB;
//imageA.copyTo(imageB);
Mat imageB = imageA.clone();
imageA.setTo(0);
imageA.release();
1、深拷貝,重新開闢了一塊內存
2、對 imageA進行的所有操作,都不會影響到imageB
3、高分辨圖片時,copyTo 與clone()耗時是一樣的。

三、傳入參數,其實傳入的是指針

void functionTest(cv::Mat image)
{
	image.setTo(0);
}
Mat imageA = imread("..\\..\\bin\\2.bmp",0);
functionTest(imageA);

1、執行完之後,imageA中內容全部變成了0
2、此時,void functionTest(cv::Mat image)與void functionTest(cv::Mat &image)其實是一樣的效果

3、結論是:Mat作爲參數時,相當於傳入了指針,執行的是“=”操作

但注意下面的代碼:(傳入之前,如果mat爲空指針)

void functionTest(cv::Mat image)
{
    cv::Mat  imageA = imread("..\\..\\bin\\2.bmp", 0);
    //image = imageA.clone();
    imageA.copyTo(image);
}	
Mat imageB;
functionTest(imageB);
	
4、執行完後,imageB還是爲空。
5、當改成 void functionTest(cv::Mat &image),執行完後,imageB就有內容了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章