Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV Mat::operator=-它支持写时复制吗?_C++_Opencv - Fatal编程技术网

C++ OpenCV Mat::operator=-它支持写时复制吗?

C++ OpenCV Mat::operator=-它支持写时复制吗?,c++,opencv,C++,Opencv,从OpenCV文档中可以看出,复制矩阵似乎是使用浅拷贝完成的,但当更改其中一个拷贝时,就完成了拷贝 确切的数字是: 矩阵赋值算子 参数: m–指定的右手侧 矩阵。矩阵赋值为O(1) 操作,即不复制任何数据。 相反,数据是共享的,而 参考计数器(如有)为 增加在分配新任务之前 数据,旧数据通过 Mat::释放 expr–指定的矩阵表达式 对象与第一种形式相反 第二种是赋值运算 可以重用已分配的表单 矩阵,如果它具有正确的大小和 键入以拟合矩阵表达式 结果。它是由计算机自动处理的 矩阵的实函数 表达

从OpenCV文档中可以看出,复制矩阵似乎是使用浅拷贝完成的,但当更改其中一个拷贝时,就完成了拷贝

确切的数字是:

矩阵赋值算子

参数:

m–指定的右手侧 矩阵。矩阵赋值为O(1) 操作,即不复制任何数据。 相反,数据是共享的,而 参考计数器(如有)为 增加在分配新任务之前 数据,旧数据通过 Mat::释放

expr–指定的矩阵表达式 对象与第一种形式相反 第二种是赋值运算 可以重用已分配的表单 矩阵,如果它具有正确的大小和 键入以拟合矩阵表达式 结果。它是由计算机自动处理的 矩阵的实函数 表达式扩展为。对于 例如,C=A+B扩展为 cv::add(A、B、C)和add()将 注意自动C重新分配

s–标量,分配给每个 矩阵元素。矩阵大小或 类型未更改

然而,这似乎不起作用

Mat_<float> a(5,5),b(5,5);
a =1;
b = a;
a = 2;
mata(5,5),b(5,5);
a=1;
b=a;
a=2;

现在b==2,整数为1

您可以使用
Mat::copyTo()
进行深度复制。例如

Mat a(5,5,CV_32C1),b;
a = 1;
a.copyTo(b);
a = 2;

但不支持,
Mat
不支持写时复制。当您需要在不影响
b
的情况下更改
a
时,您需要将
a
深度复制到
b
,然后修改
a

,这似乎是您误解了“在分配新数据之前,通过Mat::release取消对旧数据的引用”并不意味着当您在
a
b
上写入时,会发生复制。这意味着当您键入
b=a
时,将丢失b中的数据


长话短说:不支持写时复制。

您也可以执行Mat b=a.clone();
Mat a(5,5,CV_32C1),b;
a = 1;
a.copyTo(b);
a = 2;