【opencv學習筆記六】圖像的ROI區域選擇與複製
圖像的數據量還是比較大的,對整張圖片進行處理會影響我們的處理效率,因此常常只對圖像中我們需要的部分進行處理,也就是感興趣區域ROI。今天我們來看一下如何設置圖像的感興趣區域ROI。以及對ROI區域圖像進行複製與替換。
在開始之前我們還是先來看一下Mat類型的數據存儲方式以及對Mat類型變數賦值的方式。Mat類型的圖像在內存中包含兩部分的內容:矩陣頭與圖像數據矩陣的指針。矩陣頭包含了圖像的基本信息(如矩陣尺寸、存儲方式、存儲地址等),而數據指針則指向圖像所有像素值的矩陣。通常複製Mat類型數據有兩種方類型,一種是僅複製Mat變數的矩陣頭與數據指針,但是不複製圖像數據區域。第二種是不僅為複製Mat類型圖像的矩陣頭與數據指針,同時也把圖像數據區域複製過去。這種方式處理的數據量會很大。
我們先來看第一種方式。
Mat A = imread("i.jpg");Mat B, C;B = A;Mat(A);
已有圖像A,新建圖像B和C。我們分別通過賦值方式和構造函數初始化B和C。此時A、B、C均有各自的矩陣頭與指針,並且其指針指向統一個圖像數據區域。即可以理解為A、B、C三個指針均指向同一片內存地址。使用這種方法後,對A、B、C中任意一個圖像操作後另外兩個也會同時變化,因為他們指向同一片圖像數據區域。示意圖如下:
再來看第二種方式:
Mat A = imread("i.jpg");Mat B, C;B = A.clone();A.copyTo(C);
同樣已有圖像A,新建圖像B和C。我們分別通過clone函數與copyTo函數複製圖像。此時A、B、C三個圖像不僅有著各自的矩陣頭與指針,並且三個圖像的數據區域地質也是不同的,對其中一個操作不會影響另外兩個。示意圖如下:
接線來我們來看一下選擇圖像ROI區域的方法。同樣有兩種方法。
Rect(x,y,width,height)//矩形框
Rect是一個矩形框。
x為起始列;
y為起始行;
width為寬度;
height為高度;
Range(start,end)//感興趣行列範圍
Range是感興趣起始行/列與終點行/列。
分別用上面兩種方法表示圖像img從(100,100)到(200,200)的區域為:
img(Rect(100, 100, 100, 100));img(Range(100, 200), Range(100,200));
實例
下面放出一個例子,讀取圖片img1"1.jpg"將原圖拷貝到img4中,選取並顯示img1中(200,200)到(300,300)區域的子圖片,將該子圖片保存到img3中,設定img5為img1中(100,100)到(200,200)的區域。將img1中img5區域的內容替換為img3.
//************頭文件包含*************#include "stdafx.h"#include<iostream>#include<opencv.hpp>//包含opencv的頭文件//***********************************//************命名空間***************using namespace cv;//使用opencv命名空間using namespace std;//***********************************//************主函數*****************int main(){ int c; Mat img1 = imread("1.jpg"); Mat img2,img3,img4,img5; img4 = img1.clone();//將img1圖像複製到img4中,此複製連同數據區域一起複制 namedWindow("原圖");//創建窗口 namedWindow("ROI區域圖");//創建窗口 namedWindow("複製圖");//創建窗口 while (1) { img2 = img1(Rect(200,200,100,100));//選取img1中從(200,200)到(300,300)的ROI區域 img5 = img1(Range(100,100+img2.rows),Range(100,100+img2.cols));//選取img1中從(100,100)開始與img2同樣大小的ROI區域 img3 = img2.clone();//將img2圖像複製到img3中,此複製連同數據區域一起複制 img3.copyTo(img5);//將img3圖像複製到img5中,此時img1中相應的ROI區域數據也一起發生了變化 imshow("原圖", img4);//顯示圖像 imshow("ROI區域圖", img2);//ROI區域圖像 imshow("複製圖", img1);//顯示合併後的圖像 c = waitKey(0);//等待按鍵按下 if (c == 27||char(c) == q|| char(c) == Q)//按下Q鍵或者ESC鍵退出程序 break; } return 0;}
以下是結果:
下載
功能很簡單,代碼很少,建議自己寫一下或者在博文中複製一下,當然實在是懶的不要不要的土豪可以去下面的連接直接下載。
【opencv學習筆記六】圖像的ROI區域選擇與複製
推薦閱讀:
※做增強現實AR,高通sdk與opencv有什麼區別。各有什麼利弊?
※基於opencv和mfc的攝像頭採集框架(GOMFCTemplate2)
※1.5【OpenCV圖像處理】讀寫像素
※opencv Mat類型的轉換問題?
TAG:OpenCV |