圖像的ROI區域選擇與復制


【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區域選擇與復制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM