[英]OpenCV Mat::operator= - does it support copy on write?
從OpenCV文檔看來,使用淺表副本完成了矩陣的復制,但是當更改其中一個副本時,即完成了副本。
確切的參考是:
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,為1的整數
您可以使用Mat::copyTo()
進行深層復制。 例如
Mat a(5,5,CV_32C1),b;
a = 1;
a.copyTo(b);
a = 2;
但是不, Mat
不支持寫時復制。 當你需要做出改變,以a
不影響b
,你需要做的深層復制a
到b
,然后修改a
。
看來您誤會了。 “在分配新數據之前,通過Mat :: release取消了對舊數據的引用”並不意味着當您在a
或b
上a
寫操作時,就會發生復制。 這意味着當您鍵入b=a
,您將丟失b中的數據。
長話短說:不支持寫時復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.