辨識車輛顏色前,我想要從大張影像中找到車子,而車子的圖像就是我要的感興趣區域,一旦找到,就可以分析該區域的色彩,進而判斷為什麼顏色。
我們的想法很簡單,不過使用程式來獲得感興趣區域 (Region of Interest)需要一些功夫。
/**
Theme: Region of Interest
Compiler: Dev C++ 4.9.9.2
Date: 100/06/14
Author: ShengWen
Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main(){
IplImage *Image;
CvRect Rect1,Rect2;
uchar *Ptr;
CvSize Size;
CvScalar Scalar;
int Height;
int Width;
int Dims;
int COIChannel;
Image=cvLoadImage("apple.jpg",1);
Dims=cvGetDims(Image,0);
Height=cvGetDimSize(Image,0);//0高
Width=cvGetDimSize(Image,1);//1寬
COIChannel=cvGetImageCOI(Image);
Rect1=cvRect(50,50,150,150);//左上點(50,50),大小(150,150)
cvSetImageCOI(Image,1);//1藍、2綠、3紅、0不設定
cvSetImageROI(Image,Rect1);
Rect2=cvGetImageROI(Image);
Size=cvGetSize(Image);
Ptr=cvPtr2D(Image,70,40);
Scalar=cvGet2D(Image,70,40);
printf("==Apple ROI Information==\n");
printf("Dims is : %d\n",Dims);
printf("Height is : %d\n",Height);
printf("Width is : %d\n",Width);
printf("Set COI is : %d\n",COIChannel);
printf("ROI Size is : (%d,%d)\n\n",Size.height,Size.width);
printf("The Pointer 2D (70,40)Channels(Original) is : %d %d %d\n",*Ptr,*(Ptr+1),*(Ptr+2));
printf("The Scalar 2D (70,40) Channels is : %.1f %.1f %.1f\n",Scalar.val[0],Scalar.val[1],Scalar.val[2]);
for(int i=0; i<=3; i++){//設定12點的顏色
CvScalar Scalarx=cvScalar(0,64*i,255);
for(int j=0; j<=3; j++){
cvSet2D(Image,70+i,40+j,Scalarx);
}
}
printf("The Pointer 2D (70,40)Channels(Modified) is : %d %d %d\n",*Ptr,*(Ptr+1),*(Ptr+2));
cvNamedWindow("Apple ROI",1);
cvShowImage("Apple ROI",Image);
cvResetImageROI(Image);//重新設定ROI,不重設值,只重設區域
cvNamedWindow("Apple",1);
cvShowImage("Apple",Image);
cvWaitKey(0);
cvReleaseImage(&Image);
cvDestroyWindow("Apple");
cvDestroyWindow("Apple ROI");
return EXIT_SUCCESS;
}
這裡所使用的函式和參數:
- cvRect(50,50,150,150);
表示起始點在左上點(50,50),範圍大小是(150,150),如此一來結束點即為(200,200)。
為了在影像上看到明顯的改變,我這裡修改了12個點,可以從影像中看到紅色到黃色變化的小區域。


Comments on: "[OpenCV] 感興趣區域 (Region of Interest)" (5)
[…] 就如同今日的海量資料,我們會想要找到所需要的資訊,對應到影像來說,我們所需要的部份稱之為感興趣區域 (Region of Interest)。之前已寫過一篇,可參考:感興趣區域 (Region of Interest)。 […]
讚讚
原來如此,謝謝大大的詳解!因為我原本以為這個source code是可以自動在ROI裡找尋車子位置。
因為小弟最近想寫個停車格裡判斷有無車子在,因此我的ROI就是停車格線內,最後在ROI內偵測有無車子存在,但想要以不是人工打上ROI所需要的座標。想法是先用Canny法拍一張無車子時停車格狀態的照片,此時停車格線就會因為Canny被畫出來,但就卡在是否可以讓程式自動把畫出來的地方變成是我要的ROI,但是初學opencv所以在看ROI相關的東西,謝謝大大這麼不辭辛苦為我說明 ^^"
讚讚
當時我做期末專案,也就是「辨識車輛的顏色」是用滑鼠在影像上將車輛用「矩形」的方式框出來,這完全是人工的作法,經您這麼一說,canny是個不錯的邊緣偵測演算法,可以嘗試看看。
此外,我同學有做自動偵測車輛的專案,他是用影片來實做,設定時間間隔來擷取兩張影像,接著判斷兩張影像的差異,然後用一個演算法將差異描繪出來,於是做出來的結果就是車輛在馬路上行駛,車輛被不規則的紅色線段框起來,車輛行駛到哪,紅色框線也會隨之而行。
哈~也謝謝您這麼詳細解說您的目的,若有成果請記得跟我分享!
您可以參考我的成果:車輛顏色分類。
讚讚
作者大大您好!!
對於你這篇寫的程式碼我很有興趣,但我想請問一下這段程式碼有給我們甚麼資訊或用途嗎??
因為小弟愚昧實際跑了一下還是不知道他在做些甚麼是,還勞煩大大能指點一下。
讚讚
您好,感謝您的提問:)
這篇文章我想表達的是:如何在影像中找到你所感興趣的區域,接著對該區域進行後續處理,例如我可以把車子框出來,然後來做該區域的色彩分析,最後由程式判斷出車子的顏色為何。我的程式碼呈現的是:把我在下圖中感興趣的區域→左上點(50,50),大小(150,150)框出來,就是你所看到的上圖,端視你有何用途,接著分析該區域。
維基百科Region of interest的定義:A Region of Interest, often abbreviated ROI, is a selected subset of samples within a dataset identified for a particular purpose.
For example:
on a waveform (1D dataset), a time or frequency interval
on an image (2D dataset), the boundaries of an object
in a volume (3D dataset), the contours or surfaces outlining an object
in a time-volume (4D dataset), the outline of an object at or during a particular time interval
讚讚