您的位置:首页 > 编程语言 > VB

OpenCV画出CvBox2D结构(转)

2017-11-29 10:46 561 查看
对给定的2D点集,寻找最小面积的包围矩形,使用函数:
CvBox2DcvMinAreaRect2(constCvArr*points,CvMemStorage*storage=NULL);

points
点序列或点集数组

storage

可选的临时存储仓

函数cvMinAreaRect2通过建立凸外形并且旋转外形以寻找给定2D点集的最小面积的包围矩形。

(一)  OpenCV坐标系原点说明:左上角为原点

(二)  CvBox2D中角度angle(θ)的选取规则为:X轴逆时针旋转和碰到矩形第一条边(延长线)的夹角。

(三)  角度angle(θ)的值永远为负,取值范围为(-90,0]。 

(四)  角度angle(θ)为角度,非弧度。

(五)  X轴逆时针碰到的第一条边为width(width和height的大小无关系,就是说width可能比height大,也可能小)。

其中返回的2D盒子定义如下:
typedefstructCvBox2D
{
CvPoint2D32fcenter;/*盒子的中心*/
CvSize2D32fsize;/*盒子的长和宽*/
floatangle;/*水平轴与第一个边的夹角,用弧度表示*/
}CvBox2D;


注意夹角angle是水平轴逆时针旋转,与碰到的第一个边(不管是高还是宽)的夹角。如下图



可用函数cvBoxPoints(box[count],point);寻找盒子的顶点

voidcvBoxPoints(CvBox2Dbox,CvPoint2D32fpt[4])

{

doubleangle=box.angle*CV_PI/180.

floata=(float)cos(angle)*0.5f;

floatb=(float)sin(angle)*0.5f;


pt[0].x=box.center.x-a*box.size.height-b*box.size.width;

pt[0].y=box.center.y+b*box.size.height-a*box.size.width;

pt[1].x=box.center.x+a*box.size.height-b*box.size.width;

pt[1].y=box.center.y-b*box.size.height-a*box.size.width;

pt[2].x=2*box.center.x-pt[0].x;

pt[2].y=2*box.center.y-pt[0].y;

pt[3].x=2*box.center.x-pt[1].x;

pt[3].y=2*box.center.y-pt[1].y;

}


简单证明此函数的计算公式:

计算x,由图可以得到三个方程式:

pt[1].x-pt[0].x=width*sin(angle)

pt[2].x-pt[1].x=height*cos(angle)

pt[2].x-pt[0].x= 2(box.center.x-pt[0].x)

联立方程可解得函数里的计算式,算y略。

写了个函数绘制CvBox2D

voidDrawBox(CvBox2Dbox,IplImage*img)

{

CvPoint2D32fpoint[4];

inti;

for(i=0;i<4;i++)

{

point[i].x=0;

point[i].y=0;

}

cvBoxPoints(box,point);//计算二维盒子顶点

CvPointpt[4];

for(i=0;i<4;i++)

{

pt[i].x=(int)point[i].x;

pt[i].y=(int)point[i].y;

}

cvLine(img,pt[0],pt[1],CV_RGB(255,0,0),2,8,0);

cvLine(img,pt[1],pt[2],CV_RGB(255,0,0),2,8,0);

cvLine(img,pt[2],pt[3],CV_RGB(255,0,0),2,8,0);

cvLine(img,pt[3],pt[0],CV_RGB(255,0,0),2,8,0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: