数据结构操作与运算-CvRect,CvBox2D数据结构
这两个数据结构都是OpenCV,ROI专用的数据结构,ROI,全名的意思就是感兴趣的区域(Region Of Interesting),对于图像来讲,总是有一些物体或是重要的图像是我们必须要做研究,追踪或分析的,物体追踪在图像处理也是很大的一们领域,凡是人脸追踪,汽车追踪,鸟类追踪,或是图像检索都是可以利用ROI的数据结构做例子的,而研究或分析的部分,则是对感兴趣的区域实例特殊的算法,或是对它做纹理或特征分析,再信息比对上面会得到很大的帮助.而CvRect数据结构则是画方框,CvBox2D则是椭圆形的制作,一般感兴趣区域算法都是用方框 CvRect来做实例,CvBox2D则是在OpenCV用人脸椭圆追踪比较用的到.
CvRect数据结构ROI实例
#include <highgui.h>
#include <stdio.h>
int main ( )
{
IplImage *Image1;
IplROI ROI;
CvRect Rect1,Rect2;
Image1=cvLoadImage ( "coast.jpg", 1 );
Rect1=cvRect ( 176, 186, 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;
cvRectangle (Image1,cvPoint ( 176, 186 ),cvPoint ( 176 + 14, 186 + 22 ),CV_RGB ( 255, 0, 0 ), 1, 8, 0 );
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数据结构)