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