从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
答案 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
,则需要制作a
至b
的深层副本,然后修改a
。
答案 1 :(得分:4)
好像你误会了。 “在分配新数据之前,通过Mat :: release取消引用旧数据”并不意味着当您在a
或b
上写入时,就会发生复制。这意味着当您键入b=a
时,您将丢失b中的数据。
长话短说:不支持写入时复制。