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

Oph*_*tan 7 c++ opencv

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

确切的参考是:

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

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

Mat& operator = (const Scalar& s)
Run Code Online (Sandbox Code Playgroud)

矩阵赋值运算符

参数:

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;
Run Code Online (Sandbox Code Playgroud)

现在b == 2,intead为1

Jac*_*cob 5

您可以使用Mat::copyTo(). 例如

Mat a(5,5,CV_32C1),b;
a = 1;
a.copyTo(b);
a = 2;
Run Code Online (Sandbox Code Playgroud)

但是不,Mat不支持写时复制。当你需要做出改变,以a不影响b,你需要做的深层副本ab,然后修改a


Fez*_*vez 5

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

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