OPENCV C++介面的複製roi資料。

來源:互聯網
上載者:User

pencv的映像及子映像複製1.x版本與2.x版本的使用方式有很大不同。

1.x版本採用cvCopy或cvSetImageROI, cvCopy, cvResetImageROI的方式實現。

而2.x版本以後,映像用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採用1.x版本的思路就比較費勁了。

Mat映像提供了adjustROI來更改映像的ROI,但使用起來很不方便。如果採用1.x版本的實現,將映像由Mat轉換為IplImage格式,就更麻煩了。

但Mat提供引用的方式擷取子映像資料。如

m.row(i), m.col(h), m.rowRange(), m.colRange(),這幾個函數的實現都源於

m(roi),建立新的Mat header,並不複製映像資料。相當於返回ROI子映像的引用。

這樣,複製一個映像的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,計算也比較方便,清晰。

-------------

ps: m.reshape 更改映像的維度(通道數),但並不更改原始映像的資料,原理等同於 更改mat header 資訊,擷取子映像引用,但不複製映像資料。

repeat(), flip()操作都會建立新的dst映像並複製src資料。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.