雖然先前知道ROI區域是感興趣區域,但是真正看到調用了OpenCV的cvSetImageROI函數時,並不知道它的作用,所以還是單獨寫了一段代碼對這個函數進行探究。
OpenCVchm文檔中對cvSetImageROI函數的介紹如下:
void cvSetImageROI( IplImage* image, CvRect rect );
image
圖像.
rect
ROI 矩形.
函數 cvSetImageROI 基於給定的矩形設置圖像的 ROI(感興趣區域) . 如果ROI是NULL 並且參數RECT的值不等於整個圖像, ROI被分配. 不像 COI, 大多數的 OpenCV 函數支持 ROI 並且處理它就像它是一個分離的圖像 (例如, 所有的像素坐標從ROI的左上角或左下角(基於圖像的結構)計算。
測試代碼:
- #include<cv.h>
- #include<cxcore.h>
- #include<highgui.h>
- void main()
- {
- IplImage *res,*dst;
- CvRect rect;
- rect.x=130,rect.y=30,rect.width=200,rect.height=200;
- res=cvLoadImage("C:/Users/lufee/Pictures/cat.jpg");//載入一張圖片
- dst=cvCreateImage(cvSize(200,200),8,3);//創建圖像空間
- //創建窗口
- cvNamedWindow("res",CV_WINDOW_AUTOSIZE);
- cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
- //設置ROI區域
- cvSetImageROI(res,rect);
- //提取ROI
- cvCopy(res,dst);
- //取消設置
- cvResetImageROI(res);
- //顯示圖像
- cvShowImage("res",res);
- cvShowImage("dst",dst);
- cvWaitKey(0);
- cvDestroyWindow("res");
- cvDestroyWindow("dst");
- cvReleaseImage(&res);
- cvReleaseImage(&dst);
- }
運行結果(res為原圖,dst為提取的ROI區域):
個人總結:
在對某IplImage圖像用cvSetImageROI函數設置了ROI后,對圖像的處理都將僅限於ROI區域,相當於該圖像變為了ROI中的圖像,測試代碼值僅用cvCopy(復制圖像的函數),進行了測試,實際上對於任何處理圖像IplImage類型的函數,處理設置了ROI區域的圖像類對象,都是處理它的ROI區域。
如果ROI為NULL並且參數rect的值不等於整個圖像,則ROI被分配。大多數OpenCV函數都支持ROI,
並將它作為一個獨立圖像進行處理,所有像素坐標都是從ROI的左上角或者左下角(基於圖像結構)開始計算的。
比如:
IplImage *img1=cvLoadImage("1.jpg");
cvSetImageROI(img1,cvRect(100,100,356,156));//設置img1的ROI區域
之后顯示img1圖像是
只顯示ROI標識的一部分,即改變了指針img1,但是它
仍舊保留有原來圖像的信息,在執行這一句cvResetImageROI(img1);之后,img1指示原來的圖像信息。執行下面的例子即可明了顯示。