椭圆拟合的函数式子以及绘制外接矩形
来源:互联网 发布:做淘宝客服对眼睛好吗 编辑:程序博客网 时间:2024/06/05 00:32
首先是在二值图像中找轮廓,我的图象中只有一条轮廓,所以使用比较简单。
首先要分配存储空间,使用函数cvCreateMemStorage(0)分配一个默认大小的CvMemStorage型空间。
然后使用CvSeq * contour = 0;建立一个轮廓的指针。
最后使用函数cvFindContours在二值图像中找轮廓。
首先要分配存储空间,使用函数cvCreateMemStorage(0)分配一个默认大小的CvMemStorage型空间。
然后使用CvSeq * contour = 0;建立一个轮廓的指针。
最后使用函数cvFindContours在二值图像中找轮廓。
轮廓保存在cvFindContours的参数CvSeq* contour中,根据这个轮廓画出轮廓可以用函数cvDrawContours。
我的工作在画出轮廓后,需要用椭圆拟合这个轮廓。
首先使用函数cvFitEllipse2获得轮廓拟合椭圆的边框box,再用cvEllipseBox画出box包围的椭圆。
我的工作在画出轮廓后,需要用椭圆拟合这个轮廓。
首先使用函数cvFitEllipse2获得轮廓拟合椭圆的边框box,再用cvEllipseBox画出box包围的椭圆。
别忘了用cvReleaseMemStorage释放开辟的CvMemStorage型空间。
//maxContour->h_next = NULL;//因为cvDrawContour是描绘的整个序列的,所以要把后面的设置为NULL,防止画多余的
cvDrawContours( mask, maxContour, cvScalar(255), cvScalar(255), -1, CV_FILLED, 8 );
//上面得到的mask是轮廓,下面将其拟合为椭圆,方便后面更好的提取其特征值
CvBox2D handBox;
handBox = cvFitEllipse2(maxContour);
cvEllipseBox( mask, handBox, cvScalarAll(255), 1, CV_AA, 0 );
下面的转自:http://blog.csdn.net/mine1024/article/details/6044856
之前用到opencv最小外接矩形去表示一个类椭圆形的高度,特此记录备查。
对给定的 2D 点集,寻找最小面积的包围矩形,使用函数:
CvBox2D cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );
- points
- 点序列或点集数组
- storage
- 可选的临时存储仓
- 函数 cvMinAreaRect2 通过建立凸外形并且旋转外形以寻找给定 2D 点集的最小面积的包围矩形。
其中返回的2D盒子定义如下:
1 typedef struct CvBox2D
2 {
3 CvPoint2D32f center; /* 盒子的中心 */
4 CvSize2D32f size; /* 盒子的长和宽 */
5 float angle; /* 水平轴与第一个边的夹角,用弧度表示*/
6 }CvBox2D;
2 {
3 CvPoint2D32f center; /* 盒子的中心 */
4 CvSize2D32f size; /* 盒子的长和宽 */
5 float angle; /* 水平轴与第一个边的夹角,用弧度表示*/
6 }CvBox2D;
注意夹角 angle 是水平轴逆时针旋转,与碰到的第一个边(不管是高还是宽)的夹角。如下图
可用函数 cvBoxPoints(box[count], point); 寻找盒子的顶点
1 void cvBoxPoints( CvBox2D box, CvPoint2D32f pt[4] )
2 {
3 double angle = box.angle*CV_PI/180.
4 float a = (float)cos(angle)*0.5f;
5 float b = (float)sin(angle)*0.5f;
6
7 pt[0].x = box.center.x - a*box.size.height - b*box.size.width;
8 pt[0].y = box.center.y + b*box.size.height - a*box.size.width;
9 pt[1].x = box.center.x + a*box.size.height - b*box.size.width;
10 pt[1].y = box.center.y - b*box.size.height - a*box.size.width;
11 pt[2].x = 2*box.center.x - pt[0].x;
12 pt[2].y = 2*box.center.y - pt[0].y;
13 pt[3].x = 2*box.center.x - pt[1].x;
14 pt[3].y = 2*box.center.y - pt[1].y;
15 }
2 {
3 double angle = box.angle*CV_PI/180.
4 float a = (float)cos(angle)*0.5f;
5 float b = (float)sin(angle)*0.5f;
6
7 pt[0].x = box.center.x - a*box.size.height - b*box.size.width;
8 pt[0].y = box.center.y + b*box.size.height - a*box.size.width;
9 pt[1].x = box.center.x + a*box.size.height - b*box.size.width;
10 pt[1].y = box.center.y - b*box.size.height - a*box.size.width;
11 pt[2].x = 2*box.center.x - pt[0].x;
12 pt[2].y = 2*box.center.y - pt[0].y;
13 pt[3].x = 2*box.center.x - pt[1].x;
14 pt[3].y = 2*box.center.y - pt[1].y;
15 }
简单证明此函数的计算公式:
计算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)
pt[2].x - pt[1].x = height*cos(angle)
pt[2].x - pt[0].x = 2(box.center.x - pt[0].x)
联立方程可解得函数里的计算式,算 y 略。
写了个函数绘制CvBox2D
1 void DrawBox(CvBox2D box,IplImage* img)
2 {
3 CvPoint2D32f point[4];
4 int i;
5 for ( i=0; i<4; i++)
6 {
7 point[i].x = 0;
8 point[i].y = 0;
9 }
10 cvBoxPoints(box, point); //计算二维盒子顶点
11 CvPoint pt[4];
12 for ( i=0; i<4; i++)
13 {
14 pt[i].x = (int)point[i].x;
15 pt[i].y = (int)point[i].y;
16 }
17 cvLine( img, pt[0], pt[1],CV_RGB(255,0,0), 2, 8, 0 );
18 cvLine( img, pt[1], pt[2],CV_RGB(255,0,0), 2, 8, 0 );
19 cvLine( img, pt[2], pt[3],CV_RGB(255,0,0), 2, 8, 0 );
20 cvLine( img, pt[3], pt[0],CV_RGB(255,0,0), 2, 8, 0 );
21 }
2 {
3 CvPoint2D32f point[4];
4 int i;
5 for ( i=0; i<4; i++)
6 {
7 point[i].x = 0;
8 point[i].y = 0;
9 }
10 cvBoxPoints(box, point); //计算二维盒子顶点
11 CvPoint pt[4];
12 for ( i=0; i<4; i++)
13 {
14 pt[i].x = (int)point[i].x;
15 pt[i].y = (int)point[i].y;
16 }
17 cvLine( img, pt[0], pt[1],CV_RGB(255,0,0), 2, 8, 0 );
18 cvLine( img, pt[1], pt[2],CV_RGB(255,0,0), 2, 8, 0 );
19 cvLine( img, pt[2], pt[3],CV_RGB(255,0,0), 2, 8, 0 );
20 cvLine( img, pt[3], pt[0],CV_RGB(255,0,0), 2, 8, 0 );
21 }
- 椭圆拟合的函数式子以及绘制外接矩形
- C# 图形的绘制矩形椭圆
- 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形
- ios-矩形-圆角矩形-椭圆-圆形的绘制
- opencv 轮廓的长度,面积,外接矩形(平行坐标轴),处接最小矩形,处接圆 , 椭圆
- opencv 轮廓的长度,面积,外接矩形(平行坐标轴),处接最小矩形,处接圆 , 椭圆
- QT 绘制矩形,椭圆等。
- MFC绘制矩形、椭圆、三角形
- MFC绘制矩形、椭圆、三角形
- openCV实现图像的轮廓检测以及外接矩形
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(2)--提高篇
- Opencv绘制最小外接矩形、最小外接圆
- Opencv绘制最小外接矩形、最小外接圆
- 椭圆与圆的拟合
- 编写一个单文档界面应用程序,该程序在用户区能以在两个矩形的相交矩形为外接矩形画一个椭圆。
- pyqt4 绘制点,椭圆,线,矩形
- OpenCV 求外接矩形以及旋转角度
- ASP.net 中Queue,Stack,Hashtable,Sortlist一些简单用法
- Session应用--用servlet写一次性验证码
- Response应答对象:
- Servlet的应用---ServletConfig和ServletContext
- 自定义标签入门
- 椭圆拟合的函数式子以及绘制外接矩形
- Servlet的应用--Referer请求和参数传递
- Servlet应用---HttpServletRequest的应用
- 购物车
- ServletConfig和ServletContext
- Request_irq和setup_irq的区别
- 连接数据库中的类
- hdu_2039_三角形
- 文件的上传