47

我知道“copyTo”可以处理掩码。但是当不需要面具时,我可以同时使用两者吗?

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone

4

4 回答 4

70

实际上,即使没有面具,它们也不相同。

主要区别在于,当目的矩阵和源矩阵的类型和大小相同时,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]
于 2015-07-06T01:23:25.143 回答
32

这是Mat::clone()函数的实现:

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}

因此,正如@rotating_image 所提到的,如果您不提供mask功能copyTo(),则与clone().

于 2013-03-28T17:19:05.030 回答
23

Mat::copyTo适用于当您已经有一个目的地cv::Mat(可能是或)已经分配了正确的数据大小时。Mat::clone当您知道必须分配一个新的cv::Mat.

于 2013-03-28T17:22:05.710 回答
1

copyTo 不会在更快的堆中分配新内存。

于 2019-01-21T15:59:35.500 回答