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