本文需要了解的库函数如下:
CvBox2D cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );
int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );
void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] ); //寻找盒子的顶点
精简的代码如下:
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"cxcore.lib")
#include <cv.h>
#include <highgui.h>
#include<stdio.h>
int main()
{
CvRNG rng = cvRNG(-1);//创建随机种子
IplImage* image = cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,3); //创建一副图像
cvNamedWindow("最小外包系列",1);
while(true)
{
cvZero(image);
int point_count = cvRandInt(&rng)%100;//随机创建点的数目
CvMat * points = cvCreateMat(point_count,1,CV_32FC2); //创建点集
for(int i =0 ;i<point_count;i++)
{
int x = cvRandInt(&rng)%200+100;
int y = cvRandInt(&rng)%200+100;
cvSet1D(points,i,cvScalar(x,y,0,0));
cvSet2D(image,y,x,cvScalar(0,0,255));//绘制点
}
CvBox2D box = cvMinAreaRect2(points); //获得点击的最小外包矩形
CvPoint2D32f point[4];
cvBoxPoints( box, point ); //得到盒子的顶点
/*绘制盒子*/
CvPoint p0;
p0.x = cvRound(point[3].x);
p0.y = cvRound(point[3].y);
for(i=0;i<4;i++)
{
CvPoint p;
p.x = cvRound(point[i].x);
p.y = cvRound(point[i].y);
cvLine(image,p,p0,cvScalar(0,255,0));
p0 = p;
}
/*绘制盒子结束*/
CvPoint2D32f center;//圆心
float radius; //半径
cvMinEnclosingCircle(points,¢er,&radius); //获得点击的最小外包圆
CvPoint cpoint;
cpoint.x = cvRound(center.x);
cpoint.y = cvRound(center.y);
cvCircle(image,cpoint,cvRound(radius),cvScalar(0,0,255));//绘制圆
cvShowImage("最小外包系列",image);
cvReleaseMat(&points);
if(cvWaitKey(0)=='\r') break; //按下回车退出
}
cvDestroyWindow("最小外包系列");
return 0;
}