簡體   English   中英

OpenCV Mat :: operator =-它支持寫時復制嗎?

[英]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 ,你需要做的深層復制ab ,然后修改a

看來您誤會了。 “在分配新數據之前,通過Mat :: release取消了對舊數據的引用”並不意味着當您在aba寫操作時,就會發生復制。 這意味着當您鍵入b=a ,您將丟失b中的數據。

長話短說:不支持寫時復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM