1. 程式人生 > >opencv之影象mat複製copyTo,clone=

opencv之影象mat複製copyTo,clone=

函式原型

Mat clone() const;

void copyTo( OutputArray m ) const;

void copyTo( OutputArray m, InputArray mask) const;

copyTo()有過載,

對於你說的imge.clone()和imge.copyTo(result)這種情況,原始碼解釋如下

inline Mat Mat::clone() const

{

   Mat m;

   copyTo(m);

   return m;

}

相信一看就能知道了,呵呵,所以clone()和 copyTo()區別就在copyTo()的第二個實現吧,帶掩碼的那個。

影象用Mat來表示。影象的複製方法比較多,例如

src.clone()

src.copyTo(dst)

src.copyTo(dst, mask)

dst與src型別相同時,直接建立並複製影象資料(深copy),

src.convertTo(dst, type, scale, shift)

當src.depth==dst.depth且noscale時,等同於copyTo(建立並複製);其他,轉換並複製資料

這樣,複製一個影象的ROI到另外一個影象的指定區域就簡單多了。

如opencv中給出的例子

Rect r(1, 1, 10, 20);  // 指定src 的 ROI子影象區域

Mat dstroi =dst(Rect(0,10,r.width,r.height)); // 拿到 dst指定區域子影象的引用

src(r).convertTo(dstroi, dstroi.type(), 1,0); // ROI子影象之間的複製

此時,無需指定影象的ROI,計算也比較方便,清晰。

opencv矩陣賦值函式copyTo、clone、過載元算賦‘=’之間實現的功能相似均是給不同的矩陣賦值功能。

copyTo和clone函式基本相同,被賦值的矩陣和賦值矩陣之間空間獨立,不共享同一空間。

但是過載元算賦‘=’,被賦值的矩陣和賦值矩陣之間空間共享,改變任一個矩陣的值,會同時影響到另一個矩陣。當矩陣作為函式的返回值時其功能和過載元算賦‘=’相同,賦值運算賦會給矩陣空間增加一次計數,所以函式變數返回後函式內部申請的變數空間並不會被撤銷,在主函式中仍可以正常使用傳遞後的引數。具體的過程見下面的測試程式。