OpenCV Mat :: operator = - 它是否支持写入时的复制?

时间:2011-06-20 12:56:19

标签: c++ opencv

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

确切的reference是:

Mat& Mat::operator = (const Mat& m)

Mat& Mat::operator = (const MatExpr_Base& expr)

Mat& operator = (const Scalar& s)
     

矩阵赋值运算符

     

参数:

     

m - 指定的右侧   矩阵。矩阵赋值为O(1)   操作,即没有数据被复制。   相反,数据是共享的   参考计数器,如果有的话   递增。 在分配新内容之前   数据,旧数据通过解除引用   Mat :: release

     

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;

现在b == 2,intead of 1

2 个答案:

答案 0 :(得分:4)

您可以使用Mat::copyTo()制作深层副本。 E.g。

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

但不,Mat不支持copy-on-write。如果您需要对a进行更改而不影响b,则需要制作ab的深层副本,然后修改a

答案 1 :(得分:4)

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

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