copyto() 和 clone 函数在 open cv 中
copyto() and clone functions in open cv
当我们使用 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()
将始终创建一个连续矩阵,即使原始矩阵在每个像素行的末尾都有额外的字节,这些字节不包含任何像素数据(例如,如果每行的字节数不满足硬件优化的要求,则此填充可用于启用硬件优化(。
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 在VS 15.7.5中,悬停在Open CV 3.4.1Mat上仍然冻结
- 如何使用 Gstreamer 和 C++ 将 Open CV 帧写入 RTSP 流
- 将 floodfill open cv 从 c++ 转换为 python
- 读取视频文件"Open CV WARNING: Couldn't read movie file bird.avi"时出现问题
- 使用Open CV和Java单击Android时,获取图像尺寸
- 如何找到连接一组点的平滑曲线(在Open CV中)
- 在 Visual Studio 2010 中安装 Open CV 2.43
- 在open cv中,我如何将灰度图像转换回RGB图像(颜色)
- 在 Open CV C++ 中应用 Gamma 时出错
- 'weight'参数在 Open CV 对象检测中的含义是什么
- 为什么我无法在 Open CV 中正确显示矩形?
- 使用 Open CV 时 Visual Studio 中未处理的异常
- copyto() 和 clone 函数在 open cv 中
- 从 Open CV 捕获网络摄像头视频
- CV::VideoCapture::open()中的一个错误
- 两个图像的乘积,其中图像在OPEN CV中具有不同的模型
- 使用Open CV迭代器进行分段故障
- 在.net中使用open cv打开dicom图像时链接错误
- 使用Open CV SIFT调试断言失败