从OpenCV文档中可以看出,复制矩阵是使用浅拷贝完成的,但是当更改其中一个副本时,就会完成复制.
确切的参考是:
Run Code Online (Sandbox Code Playgroud)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;
Run Code Online (Sandbox Code Playgroud)
现在b == 2,intead为1
您可以使用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,你需要做的深层副本a到b,然后修改a。
看来你误会了。“在分配新数据之前,通过 Mat::release 取消引用旧数据”并不意味着当您写入a或b然后发生复制时。这意味着当你输入时b=a,你会丢失 b 中的数据。
长话短说:不支持写时复制。
| 归档时间: |
|
| 查看次数: |
7939 次 |
| 最近记录: |