gpt4 book ai didi

opencv - 在open cv中的copyto()和clone函数

转载 作者:行者123 更新时间:2023-12-02 16:14:06 26 4
gpt4 key购买 nike

当我们使用cv::Mat保存图像时,我们知道在Mat对象的标题中它具有像素的目标位置(指向图像位置的指针),因此通过使用copy函数将其应用于Mat类中的另一个对象,是否可以创建单独的副本像素数或指向相同的存储位置?

最佳答案

.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()将始终创建一个连续矩阵,即使原始矩阵在每个像素行的末尾有其他不包含任何像素数据的字节(例如,如果每行的字节数不能满足硬件优化的要求。

关于opencv - 在open cv中的copyto()和clone函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35405534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com