Mat::clone和Mat::copyTo有什么区别?

52

5
没有口罩,两者是一样的。 - rotating_image
1
谢谢。我应该阅读源代码而不仅仅是文档。 - ITO Yosei
4个回答

79

实际上,即使没有使用掩码,它们也不是相同的。

主要区别在于,当目标矩阵和源矩阵具有相同的类型和大小时,copyTo 不会改变目标矩阵的地址,而 clone 总是为目标矩阵分配新的地址。

当目标矩阵在使用赋值运算符 copyToclone 之前进行复制时,这一点非常重要。例如:

使用 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]

33

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

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}
所以,正如 @rotating_image 提到的那样,如果您不为 copyTo() 函数提供 mask,它与 clone() 相同。

克隆和赋值有什么区别?例如:Mat m1; Mat m2; m1 = m2; - Derzu
Mat::clone() 后面的 const 是什么意思? - Hasani
你写的不对。请参考@yangjie和OpenCV文档中的答案:“当指定操作掩码时,如果上面显示的Mat :: create调用重新分配矩阵,则新分配的矩阵在复制数据之前将被初始化为所有零。”但是,当您不提供掩码数据时,数据将在不重新分配的情况下进行复制,这意味着指向该矩阵的其他Mat将具有修改后的值! - giuseppe

24

Mat::copyTo用于当您已经有一个目标cv::Mat,它(可能或)已经分配了正确的数据大小。 Mat::clone是一种方便的方法,当您知道必须分配一个新的cv::Mat时使用。


3

copyTo 不会在堆上分配新的内存,这样速度更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接