【发布时间】:2019-01-21 23:59:35
【问题描述】:
我知道“copyTo”可以处理掩码。但是当不需要面具时,我可以同时使用两者吗?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
【问题讨论】:
-
没有掩码都是一样的..
-
谢谢。我应该阅读源代码而不仅仅是文档。
标签: opencv
我知道“copyTo”可以处理掩码。但是当不需要面具时,我可以同时使用两者吗?
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone
【问题讨论】:
标签: opencv
实际上,即使没有面具,它们也不相同。
主要区别在于,当目标矩阵和源矩阵的类型和大小相同时,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 是什么?
Mat::copyTo 用于当您已经有一个目标cv::Mat 时(可能是或)已经分配了正确的数据大小。当您知道必须分配一个新的cv::Mat 时,Mat::clone 很方便。
【讨论】:
copyTo 不会在堆中分配新内存,这样更快。
【讨论】: