**关闭。**此题需要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);
}
}
2条答案
按热度按时间wn9m85ua1#
temp_gray_testImg = temp;
这是:
temp_gray_testImg
变为与temp
共享相同的数据。(not将
temp
的图像内容复制到temp_gray_testImg
的方式)b4qexyjb2#
cv::Mat
是一个对象,它包含对 backing memory 的引用,可以在Mat
对象之间共享。备份存储器是参考计数的。Mat
对象本身只包含元数据,比如stride和offset信息 * 到 * 备份内存(以及对备份内存本身的引用)。当你通过赋值(或函数调用或返回)复制
Mat
时,Mat
被“复制”,但后备内存是相同的。现在,您有两个Mat,它们都在内部指向相同的后备内存。分配复制
Mat
,但不复制任何图像数据。当你想把一些数据复制到另一个
Mat
中,同时保留备份内存时,你需要使用Mat::copyTo()
。clone()
执行实际的深度拷贝,即为新的Mat
示例分配新的后备存储器。