轉自http://hi.baidu.com/%C3%B5%D1%A9%D3%C4%CF%E3/blog/item/9fbd6b3f55e1e23471cf6cf8.html
這兩個資料結構都是OpenCV ,roi專用的資料結構,roi,全名的意思就是感興趣的區域(感興趣區) ,對於圖形來講,總是有一些物體或是重要的圖像是我們必須要做研究,追蹤或分析的,物件追蹤在影像處理也是很大的一們領域,舉凡是人臉追蹤,汽車追蹤,鳥類追蹤,或是圖形檢索都是可以利用的roi的資料結構做實作的,而研究或分析的部份,則是對感興趣的區域實作特殊的演算法,或是對他做紋理或特徵分析,再資訊比對上面會得到很大的幫助。而CvRect資料結構則是畫方框, CvBox2D則是橢圓形的製作,一般感興趣區域演算法都是用方框CvRect來做實作, CvBox2D則是在OpenCV用人臉橢圓追蹤比較用的到。
這張圖片則是簡單的實作擷取感興趣的區域,圖中人物的頭像被cvRect資料結構設定,傳給IplImage資料結構而被抓到了,這只是一個簡單的手動抓人物的實作.這邊ROI的製作方式有很多種,這邊只是其中一種的介紹,之後還會有ROI相關的函式應用,在這張圖片內,利用cvRect()擷取感興趣位置的座標,以及他的區塊大小,前兩個參數是座標,後兩個是寬跟高,再將cvRect資料結構用cvRectToROI()轉成IplROI格式,然後直接給IplImage資料結構內的ROI,而Rect2的實作也只是把IplROI結構轉換成CvRect的資料結構罷了,而如果把IplImage資料結構的ROI設定成NULL,那又會回到原圖影像大小了,在這邊cvRectToROI()的第二個參數是COI(Color Of Interesting)感興趣的通道顏色,而在OpenCV的cvShowImage()沒有被實作出來,而它還是在其他演算法函式上被用的到.
CvRect
矩形框的偏移和大小
typedef struct CvRect
{
int x; /* 方形的最左角的x-座標 */
int y; /* 方形的最上或者最下角的y-座標 */
int width; /* 寬 */
int height; /* 高 */
}
CvRect;
/* 構造函數*/
inline CvRect cvRect( int x, int y, int width, int height );
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main()
{
IplImage *Image1;
IplROI ROI;
CvRect Rect1,Rect2;
Image1=cvLoadImage("coast2.jpg",1);
Rect1=cvRect(200,50,100,100);
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);
}
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");
}