copyto() 和 clone 函数在 open cv 中

copyto() and clone functions in open cv

本文关键字:open cv 函数 clone copyto      更新时间:2023-10-16

当我们使用 cv::Mat 保存图像时,我们知道在 Mat 对象的标题中它具有像素的目的地(指向图像位置的指针(,因此通过使用 copy 函数到垫类中的另一个对象是创建像素的单独副本还是指向相同的内存位置?

.copyTo.clone()都会(深度(复制像素数据,而不仅仅是标头,因此在大多数情况下,它将分配新的内存,在更多情况下,不会共享源的内存。

但是,如果目标矩阵已经分配了内存,并且图像大小和类型与新源相同,则.copyTo不会分配新内存,而是(深度(将像素数据复制到已分配的内存中。

例如:


此代码将为destination分配新内存,并将源的像素复制到其中,因此源和目标不会共享内存。

cv::Mat source = cv::imread(...);
cv::Mat destination;
source.copyTo(destination);

此代码将使用之前分配的内存,但仍将像素复制到目标,因此.copyTo不会分配新内存,但会复制像素,因此源和目标不会共享内存。

cv::Mat source = cv::imread(...);
cv::Mat destination = cv::Mat(source.size(), source.type()); // this will allocate memory fitting the data of source
source.copyTo(destination);

这段代码可能(不是 100% 确定,我没有测试它(共享内存,因为目标可能不会分配新内存,并且源和目标在 .copyTo 之前使用相同的内存:

cv::Mat source = cv::imread(...);
cv::Mat destination = source; // now they use the same memory
source.copyTo(destination); // since destination size and type do fit source size and type, MAYBE no new memory is allocated!


afaik,.clone()将始终分配新内存。.copyTo.clone之间的另一个区别是可以使用mask .copyTo


另一件事要提一下:.clone()将始终创建一个连续矩阵,即使原始矩阵在每个像素行的末尾都有额外的字节,这些字节不包含任何像素数据(例如,如果每行的字节数不满足硬件优化的要求,则此填充可用于启用硬件优化(。