Just My Life & My Work

辨識車輛顏色前,我想要從大張影像中找到車子,而車子的圖像就是我要的感興趣區域,一旦找到,就可以分析該區域的色彩,進而判斷為什麼顏色。

我們的想法很簡單,不過使用程式來獲得感興趣區域 (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個點,可以從影像中看到紅色黃色變化的小區域。

ROIROI

參考:資料結構操作與運算-IplImage資料結構操作(1)

Comments on: "[OpenCV] 感興趣區域 (Region of Interest)" (5)

  1. 未知 的大頭貼

    […] 就如同今日的海量資料,我們會想要找到所需要的資訊,對應到影像來說,我們所需要的部份稱之為感興趣區域 (Region of Interest)。之前已寫過一篇,可參考:感興趣區域 (Region of Interest)。 […]

  2. BOBO 的大頭貼

    原來如此,謝謝大大的詳解!因為我原本以為這個source code是可以自動在ROI裡找尋車子位置。

    因為小弟最近想寫個停車格裡判斷有無車子在,因此我的ROI就是停車格線內,最後在ROI內偵測有無車子存在,但想要以不是人工打上ROI所需要的座標。想法是先用Canny法拍一張無車子時停車格狀態的照片,此時停車格線就會因為Canny被畫出來,但就卡在是否可以讓程式自動把畫出來的地方變成是我要的ROI,但是初學opencv所以在看ROI相關的東西,謝謝大大這麼不辭辛苦為我說明 ^^"

    • HappyMan 的大頭貼

      當時我做期末專案,也就是「辨識車輛的顏色」是用滑鼠在影像上將車輛用「矩形」的方式框出來,這完全是人工的作法,經您這麼一說,canny是個不錯的邊緣偵測演算法,可以嘗試看看。
      此外,我同學有做自動偵測車輛的專案,他是用影片來實做,設定時間間隔來擷取兩張影像,接著判斷兩張影像的差異,然後用一個演算法將差異描繪出來,於是做出來的結果就是車輛在馬路上行駛,車輛被不規則的紅色線段框起來,車輛行駛到哪,紅色框線也會隨之而行。
      哈~也謝謝您這麼詳細解說您的目的,若有成果請記得跟我分享!

      您可以參考我的成果:車輛顏色分類

  3. BOBO 的大頭貼

    作者大大您好!!
    對於你這篇寫的程式碼我很有興趣,但我想請問一下這段程式碼有給我們甚麼資訊或用途嗎??
    因為小弟愚昧實際跑了一下還是不知道他在做些甚麼是,還勞煩大大能指點一下。

    • HappyMan 的大頭貼

      您好,感謝您的提問:)
      這篇文章我想表達的是:如何在影像中找到你所感興趣的區域,接著對該區域進行後續處理,例如我可以把車子框出來,然後來做該區域的色彩分析,最後由程式判斷出車子的顏色為何。我的程式碼呈現的是:把我在下圖中感興趣的區域→左上點(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

回覆給HappyMan 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲