圖像的ROI區域選擇與複製

【opencv學習筆記六】圖像的ROI區域選擇與複製

圖像的數據量仍是比較大的,對整張圖片進行處理會影響咱們的處理效率,所以經常只對圖像中咱們須要的部分進行處理,也就是感興趣區域ROI。今天咱們來看一下如何設置圖像的感興趣區域ROI。以及對ROI區域圖像進行復制與替換。ios

 

在開始以前咱們仍是先來看一下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中任意一個圖像操做後另外兩個也會同時變化,由於他們指向同一片圖像數據區域。示意圖以下:spa

 

 

再來看第二種方式:.net

 

Mat A = imread("i.jpg");
Mat B, C;
B = A.clone();
A.copyTo(C);

一樣已有圖像A,新建圖像B和C。咱們分別經過clone函數與copyTo函數複製圖像。此時A、B、C三個圖像不只有着各自的矩陣頭與指針,而且三個圖像的數據區域地質也是不一樣的,對其中一個操做不會影響另外兩個。示意圖以下:指針

 

 

 

接線來咱們來看一下選擇圖像ROI區域的方法。一樣有兩種方法。code

 

Rect(x,y,width,height)//矩形框

Rect是一個矩形框。orm

x爲起始列;blog

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區域選擇與複製

相關文章
相關標籤/搜索