我知道'copyTo'可以处理蒙版。但是当没有蒙版时,两者是否都可以使用?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
我知道'copyTo'可以处理蒙版。但是当没有蒙版时,两者是否都可以使用?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
实际上,即使没有使用掩码,它们也不是相同的。
主要区别在于,当目标矩阵和源矩阵具有相同的类型和大小时,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]
这是Mat::clone()
函数的实现:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
所以,正如 @rotating_image 提到的那样,如果您不为 copyTo()
函数提供 mask
,它与 clone()
相同。Mat::clone()
后面的 const
是什么意思? - HasaniMat::copyTo
用于当您已经有一个目标cv::Mat
,它(可能或)已经分配了正确的数据大小。 Mat::clone
是一种方便的方法,当您知道必须分配一个新的cv::Mat
时使用。
copyTo 不会在堆上分配新的内存,这样速度更快。