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

OpenCV画出CvBox2D结构(转)

2012-10-24 13:58 330 查看
对给定的2D点集,寻找最小面积的包围矩形,使用函数:
CvBox2DcvMinAreaRect2(constCvArr*points,CvMemStorage*storage=NULL);

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

points

点序列或点集数组
storage
可选的临时存储仓
函数cvMinAreaRect2通过建立凸外形并且旋转外形以寻找给定2D点集的最小面积的包围矩形。
其中返回的2D盒子定义如下:
typedefstructCvBox2D
{
CvPoint2D32fcenter;/*盒子的中心*/
CvSize2D32fsize;/*盒子的长和宽*/
floatangle;/*水平轴与第一个边的夹角,用弧度表示*/
}CvBox2D;

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

注意夹角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;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

简单证明此函数的计算公式:
计算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);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: