我知道'copyTo'可以處理掩碼。但是當不需要面具時,我可以同時使用兩種面具嗎?Mat :: cloneTo和Mat :: copyTo有什麼區別?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
我知道'copyTo'可以處理掩碼。但是當不需要面具時,我可以同時使用兩種面具嗎?Mat :: cloneTo和Mat :: copyTo有什麼區別?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
這是Mat::clone()
函數的實現:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
所以,@rotating_image曾提到,如果你不爲copyTo()
功能提供mask
,這是一樣的clone()
。
Mat::copyTo
適用於當您已經有一個目的地cv::Mat
(可能是)已經分配了正確的數據大小。 Mat::clone
是一個方便,當你知道你必須分配一個新的cv::Mat
。
其實他們是不是即使沒有面具也一樣。
主要區別在於,當目標矩陣和源矩陣具有相同的類型和大小時,copyTo
將不會更改目標矩陣的地址,而clone
將始終爲目標矩陣分配新地址。
當在copyTo
或clone
之前使用複製賦值運算符複製目標矩陣時,這很重要。例如,
使用copyTo
:
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat3.copyTo(mat1);
cout << mat1 << endl;
cout << mat2 << endl;
輸出:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
使用clone
:
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat1 = mat3.clone();
cout << mat1 << endl;
cout << mat2 << endl;
輸出:
[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]
沒有面具都是一樣的。 – 2013-03-28 03:14:46
謝謝。我應該閱讀源代碼不只是文件。 – yosei 2013-03-30 05:30:50