在以前介紹IplImage結構的時候,有一個重要的參數——ROI。ROI全稱是”Region Of Interest”,即感興趣的區域。實際上,它是IPL/IPP(這兩個是Inter的庫)結構IplROI的執行個體。IplROI包含xOffset、yOffset、height、width和coi成員變量。其中COI代表channel of interest(感興趣的通道)。ROI的思想是:一旦設定ROI,通常組用于整幅圖像的函數便隻會對ROI所表示的子圖像進行操作。如果COI被設定非0值,則對該圖像的操作就隻作用于被指定的通道上了。這個COI變量可取的值是1、2、3、4通道,并且為了使COI無效而保留了0取值(有點像忽略)。但是,許多OpenCV函數都忽略參數COI。
ROI在實際工作中有很重要的作用,在許多情況下,使用它會提高計算機視覺代碼的執行速度。這是因為他們允許對圖像的某一部分進行操作,而不是對整個圖像進行操作。在OpenCV中,普遍支援ROI,函數的操作被限于感興趣的區域。要設定或取消ROI,就要使用 cvSetImageROI( )和cvResetImageROI( )函數。如果設定ROI,可以使用函數 cvSetImageROI( ),并為其傳遞一個圖像指針和矩形。要取消ROI,隻需要為函數 cvResetImageROI( )傳遞一個圖像指針。
1
2
void cvSetImageROI(IplImage* image, CvRect rect);
void cvResetImageROI(IplImage* image);
下面用一個例子來來說明ROI的用法。例子中:我們加載一幅圖像并修改一些區域——設定ROI的x,y,width和height的值,最後将ROI區域中像素都加上一個整數。代碼如下:
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
IplImage *src;
src = cvLoadImage("E:\OpenCV\images\cat.jpg");
int x = 90;
int y = 110;
int width = 180;
int height = 180;
int add = 150;
cvSetImageROI(src, cvRect(x, y, width, height));
cvAddS(src, cvScalar(add), src);
cvResetImageROI(src);
cvNamedWindow("Roi_Add", 1);
cvShowImage("Roi_Add", src);
cvWaitKey();
return 0;
}
上述代碼把ROI集中于貓的臉部,并将其藍色通道增加150。
最後有兩點需要說明:
1. cvAddS( )函數,該函數用于實作一個數組和一個标量的元素級的相加運算。例子中通過cvScalar( )構造函數将CvScalar的第一個分量設定為add代表的值,其他值為預設值0,然後和src裡面的元素相加。那為什麼是藍色通道增加150,而不是紅色通道呢?因為RGB圖在記憶體中的排列順序是:BGRA BGRA BGRA …。是以,實際上第一個通道是B(blue)。該函數其實還有第四個參數(預設為NULL),其代表的含義可參考OpenCV文檔。
2. 顯示圖像之前的” cvResetImageROI(src); ”這一句代碼千萬不能少。如果沒有這行代碼,那接下去顯示圖像的時候,隻會顯示ROI區域。因為前面已經說過,設定了ROI區域後,OpenCV的函數隻會對ROI區域有效。注釋掉那一句後的程式運作結果如下所示
,如需轉載請自行聯系原部落客。