Opencv使用roi不改变原图像?[关闭]

mm5n2pyu  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(128)

**关闭。**此题需要debugging details。目前不接受答复。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
5天前关闭。
Improve this question
我在用opencv处理一些项目。
我知道当我使用roi做垫子时,我有一个原始图像的参考,所以当我编辑roi_image,然后它会影响到原始图像。
但下面的代码不起作用。

for (int i = 0; i < 96; i = i+8) {
            for (int j = 0; j < 96; j = j+8) {
                cv::Rect roi = cv::Rect(j,i,8,8);
                cv::Mat temp = gray_testImg(roi).clone();
                
                // DO something on temp.

                // I want to change original gray_testImg
                cv::Mat temp_gray_testImg = gray_testImg(roi);

                // This does not change original.
                temp_gray_testImg = temp;

                // But this change! why???
                temp.copyTo(temp_gray_testImg);
           
            }
        }
wn9m85ua

wn9m85ua1#

temp_gray_testImg = temp;
这是:
temp_gray_testImg变为与temp共享相同的数据。
(not将temp的图像内容复制到temp_gray_testImg的方式)

b4qexyjb

b4qexyjb2#

cv::Mat是一个对象,它包含对 backing memory 的引用,可以在Mat对象之间共享。备份存储器是参考计数的。Mat对象本身只包含元数据,比如stride和offset信息 * 到 * 备份内存(以及对备份内存本身的引用)。
当你通过赋值(或函数调用或返回)复制Mat时,Mat被“复制”,但后备内存是相同的。现在,您有两个Mat,它们都在内部指向相同的后备内存。
分配复制Mat,但不复制任何图像数据。
当你想把一些数据复制到另一个Mat中,同时保留备份内存时,你需要使用Mat::copyTo()
clone()执行实际的深度拷贝,即为新的Mat示例分配新的后备存储器。

相关问题