2008年7月8日 星期二

資料結構操作與運算-CvRect,CvBox2D資料結構

這兩個資料結構都是OpenCV,ROI專用的資料結構,ROI,全名的意思就是感興趣的區域(Region Of Interesting),對於圖形來講,總是有一些物體或是重要的圖像是我們必須要做研究,追蹤或分析的,物件追蹤在影像處理也是很大的一們領域,舉凡是人臉追蹤,汽車追蹤,鳥類追蹤,或是圖形檢索都是可以利用ROI的資料結構做實作的,而研究或分析的部份,則是對感興趣的區域實作特殊的演算法,或是對他做紋理或特徵分析,再資訊比對上面會得到很大的幫助.而CvRect資料結構則是畫方框,CvBox2D則是橢圓形的製作,一般感興趣區域演算法都是用方框CvRect來做實作,CvBox2D則是在OpenCV用人臉橢圓追蹤比較用的到.

CvRect資料結構ROI實作
#include <cv.h>
#include <highgui.h>
#include <stdio.h>


int main()
{
    IplImage *Image1;
    IplROI ROI;
    CvRect Rect1,Rect2;
    Image1=cvLoadImage("coast.jpg",1);
    Rect1=cvRect(287,300,14,22);
    ROI=cvRectToROI(Rect1,0);
    Image1->roi=&ROI;

    Rect2=cvROIToRect(*Image1->roi);

    cvNamedWindow("Coast(Region Of Interesting)",1);
    cvShowImage("Coast(Region Of Interesting)",Image1);

    Image1->roi=NULL;
    cvNamedWindow("Coast",1);
    cvShowImage("Coast",Image1);

    cvWaitKey(0);
}

原始圖片:


執行結果:


這張圖片則是簡單的實作擷取感興趣的區域,圖中唯一的小人被cvRect資料結構設定,傳給IplImage資料結構而被抓到了,這只是一個簡單的手動抓人物的實作.這邊ROI的製作方式有很多種,這邊只是其中一種的介紹,之後還會有ROI相關的函式應用,在這張圖片內,利用cvRect()擷取感興趣位置的座標,以及他的區塊大小,前兩個參數是座標,後兩個是寬跟高,再將cvRect資料結構用cvRectToROI()轉成IplROI格式,然後直接給IplImage資料結構內的ROI,而Rect2的實作也只是把IplROI結構轉換成CvRect的資料結構罷了,而如果把IplImage資料結構的ROI設定成NULL,那又會回到原圖影像大小了,在這邊cvRectToROI()的第二個參數是COI(Color Of Interesting)感興趣的通道顏色,而在OpenCV的cvShowImage()沒有被實作出來,而它還是在其他演算法函式上被用的到.

(1)CvRect資料結構


(2)IplROI資料結構,其實與CvRect長的很像


以下是CvBox簡單的介紹

CvBox資料結構實作
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>


int main()
{
    CvPoint2D32f Point1 =cvPoint2D32f(200,200);
    CvSize2D32f Size1 = cvSize2D32f(50,50);
    CvBox2D Box1;

    Box1.center=Point1;
    Box1.size=Size1;
    Box1.angle=90;

    printf("Box Point is :(%.1f,%.1f)\n",Box1.center.x,Box1.center.y);
    printf("Box Size is : (%.1f,%.1f)\n",Box1.size.width,Box1.size.height);
    printf("Box Angle is : %.1f\n",Box1.angle);
    system("pause");
}

執行結果:



CvBox是由CvPoint2D32f資料結構跟CvSize2D32f資料結構所組成的,還有加上float型別的角度資訊,這邊只能簡單的介紹它,因為CvBox的應用很少,比較能用到的就是人臉橢圓形ROI的部份,而CvBox本身也沒有自己可以初始化資料結構的函式以及OpenCV提供的其他副程式,有在用函式為cvCamShift(),cvMinAreaRect()及cvFitEllipse().



cvRect()
初始化CvRect()資料結構,輸入的引數為X座標,Y座標,寬度大小,高度大小
cvRect(X座標數據,Y座標數據,寬度數據,高度數據)

cvRectToROI()
將CvRect轉換成IplROI格式,也可以直接跟IplImage資料結構的ROI鏈結,所需輸入的引數為,CvRect資料結構,通道數,通道數被定義為0為不選取,1為通道一,2為通道二,以此類推
cvRectToROI(CvRect資料結構,通道數據)

cvROIToRect()
將IplROI轉換成cvRect格式,也可以直接拿IplImage的ROI做轉換,需要輸入IplROI資料結構
cvROIToRect(IplROI資料結構)



2 意見:

匿名 提到...

你好!!
我想請問一個問題
好比說我把人臉的部份框起來之後
我要如針對人臉的區域如何再做下一步的處理
我不太會設定ROI的東西
可以麻煩你 給我的提示嗎??
感謝你

匿名 提到...

请问我执行时没有像你的事例那样在原图上画出红框框,不知道是怎么回事啊?

Copyright 2008-2009,yester