一、"=" 操作 淺拷貝
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還是爲空。