天天看點

[zt] ROI (Region of Interest) 感興趣區域 OpenCV

在以前介紹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區域有效。注釋掉那一句後的程式運作結果如下所示

,如需轉載請自行聯系原部落客。

繼續閱讀