OpenCV Mat::operator=-是否支持写时复制

OpenCV Mat::operator= - does it support copy on write?

本文关键字:支持 是否 复制 Mat operator OpenCV      更新时间:2023-10-16

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

确切的参考是:

Mat& Mat::operator = (const Mat& m)
Mat& Mat::operator = (const MatExpr_Base& expr)
Mat& operator = (const Scalar& s)

矩阵赋值运算符

参数:

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

expr–指定的矩阵表达式对象与第一种形式相反分配操作的第二个表单可以重用已分配的矩阵,如果它有合适的大小和键入以适应矩阵表达式后果它由自动处理矩阵的实函数表达式扩展为。For例如,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;

现在b==2,1 的整数

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

长话短说:不支持书面复制。

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

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

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