转:https://blog.csdn.net/longwoshixiao/article/details/50341015

一 轮廓检测
二 椭圆拟合
三 程序操作
一 轮廓检测
在进行椭圆拟合时需要先检测出轮廓中的点,这就需要用到cvFindContous命令。

cvFindContours(
CvArr* image, 
CvSeq** first_contour,
int header_size CV_DEFAULT(sizeof(CvContour)),
int mode CV_DEFAULT(CV_RETR_LIST),
int method CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
CvPoint offset CV_DEFAULT(cvPoint(0,0)))
image: 是一个二值图像,一般由cvThreShold得到 
storage: 返回轮廓的容器 
first_contour: 输出函数, 指向第一个轮廓的地址 
header_size: 序列的尺寸,如果method=CV_CHAIN_CODE, 则 
header_size=sizeof(CvChain),否则为sizeof(CvContour) 
mode: CV_RETR_EXTERNAL, 只检索最外轮廓 
CV_RETR_LIST, 采用横向列表方式检索所用的轮廓 
method: CV_CHAIN_CODE - Freeman 链码的输出轮廓. 其它方法输出多边形(定点序列). 
CV_CHAIN_APPROX_NONE - 将所有点由链码形式翻译(转化)为点序列形式 
CV_CHAIN_APPROX_SIMPLE - 压缩水平、垂直和对角分割,即函数只保留末端的象素点 
CV_CHAIN_APPROX_TC89_L1 
CV_CHAIN_APPROX_TC89_KCOS - 应用 Teh-Chin 链逼近算法. CV_LINK_RUNS - 通过连接为 1 的水平碎片使用完全不同的轮廓提取算法。仅有 CV_RETR_LIST 提取模式可以在本方法中应用 
offset: 偏移量,用于移动所有轮廓点

二 椭圆拟合
cvFitEllipse( 
const CvPoint2D32f* points, 
int count, 
CvBox2D* box )
三 程序操作

CvMemStorage*stor; 
CvSeq*cont; 
CvFont font; 
CvBox2D32f*box; 
CvPoint*PointArray; 
CvPoint2D32f*PointArray2D32f; 
double minarea=10,maxarea=500; 
stor=cvCreateMemStorage(0); 
cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor); 
cvThreshold(image03,image02,slider_pos,255,CV_THRESH_BINARY); 
cvFindContours(image02,stor,&cont,sizeof(CvContour), 
CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0)); 
for(;cont;cont=cont->h_next) 

int i; 
int count=cont->total;//轮廓个数 
CvPoint center; 
CvSize size; 
/*个数必须大于6,这是cvFitEllipse_32f的要求*/ 
if(count<6) 

continue; 

double a=abs(cvContourArea(cont)); 
cvInitFont(&font,CV_FONT_HERSHEY_COMPLEX,0.5f,0.5f,0,1,8); //初始化字体 
if (a>=minarea&&a<=maxarea) 

//分配内存给点集 
PointArray=(CvPoint*)malloc(count*sizeof(CvPoint)); 
PointArray2D32f= (CvPoint2D32f*)malloc(count*sizeof(CvPoint2D32f)); 
//分配内存给椭圆数据 
box=(CvBox2D32f*)malloc(sizeof(CvBox2D32f)); 
//得到点集 
cvCvtSeqToArray(cont,PointArray,CV_WHOLE_SEQ); 
//将CvPoint点集转化为CvBox2D32f集合 
for(i=0;i<count;i++) 

PointArray2D32f[i].x=(float)PointArray[i].x; 
PointArray2D32f[i].y=(float)PointArray[i].y; 

//拟合当前轮廓 
cvFitEllipse(PointArray2D32f,count,box); 
//绘制当前轮廓 cvDrawContours(image04,cont,CV_RGB(255,255,255),CV_RGB(255,255,255),0,1,8,cvPoint(0,0)); 
//将椭圆数据从浮点转化为整数表示 
center.x=cvRound(box->center.x); 
center.y=cvRound(box->center.y); 
size.width=cvRound(box->size.width*0.5); 
size.height=cvRound(box->size.height*0.5); 
box->angle=-box->angle; 
centerfile<<box->center.x<<" "<<box->center.y<<endl; 
//画椭圆 
cvEllipse(image04,center,size,box- >angle,0,360,CV_RGB(0,0,255),1,CV_AA,0); 
free(PointArray); 
free(PointArray2D32f); 
free(box); 

}

Opencv椭圆拟合相关推荐

  1. OpenCV椭圆拟合ellipse fitting的实例(附完整代码)

    OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 #include &quo ...

  2. opencv中的椭圆拟合

    首先贴一个最简单的程序:访问:https://blog.csdn.net/guduruyu/article/details/70069426 //创建一个用于绘制图像的空白图 cv::Mat imag ...

  3. c# 椭圆拟合库_利用C#版OpenCV实现圆心求取实例代码

    前言 OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp. 该源码是 BSD ...

  4. java 椭圆拟合,OpenCV画轮廓的外界圆矩形椭圆等

    #include #include #include #include using namespace std; #pragma   comment(lib,"cv.lib") # ...

  5. OpenCV轮廓提取和椭圆拟合

    今天用到了几个函数,作个总结. 首先是在二值图像中找轮廓,我的图象中只有一条轮廓,所以使用比较简单. 首先要分配存储空间,使用函数cvCreateMemStorage(0)分配一个默认大小的CvMem ...

  6. 基于代数距离的椭圆拟合

    问题 给定离散点集Xi=(xi,yi),i=1,2,...NX_i=(x_i,y_i) ,i=1,2,...NXi​=(xi​,yi​),i=1,2,...N,我们希望找到误差最小的椭圆去拟合这些离散 ...

  7. OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合

    1 图像的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义. ...

  8. OpenCV直线拟合检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测 ...

  9. 基于椭圆拟合的环岛识别方法

    00摘要 环岛元素是智能车比赛中较难处理的元素之一.比赛要求智能车能检测到环岛并从入口驶入,在绕行约 270°后驶出环岛,其中,能否高响应.高鲁棒性地检测环岛是后续进出环岛等步骤的基础.本文根据计算机 ...

  10. MATLAB实战系列(三十三)-技术和医疗的完美结合(续),基于最小二乘法的椭圆拟合

    前言 在上篇文章,基于MATLAB的骨骼测量系统--医学影像研究中,第3节金属球的求识别,运用到椭圆函数拟合来得到金属球大小.本文介绍如何采用MATLAB进行椭圆拟合,包括特殊的圆,一般椭圆及倾斜椭圆 ...

最新文章

  1. 鴻雁 Anser cygnoides
  2. 大话数据结构:平衡二叉排序树
  3. 2020最新Java线程池入门(超详细)
  4. 第五周课程总结实验报告(三)
  5. 未越狱设备提取数据_从三星设备中提取健康数据
  6. pandas中size方法_如何使用pdpipe与Pandas构建管道?
  7. cisco路由器基本实验之六 CHAP and RIP (Boson NetSim)
  8. 1.自编码器(keras+mnist)
  9. 计算机处理答题卡原理,基于图像处理的答题卡自动阅卷系统的设计与实现
  10. AIR是什么?.air文件如何打开?flex如何运行air文件
  11. Centos7下载文件恢复工具 extundelete
  12. 8_7.网络安全协议
  13. fastdb java_FastDB应用开发指南.pdf
  14. PicGo配置阿里云OSS
  15. errors potentially fixable with the `--fix` option报错的解决
  16. Oracle学习——第四讲(增删改查)
  17. java面试vs撒谎?
  18. python读写csv常用方法
  19. SqlYog创建数据库
  20. 职称计算机每次评都要高吗,计算机评中级职称都需要什么?

热门文章

  1. Vant中List组件immediate-check=false无效
  2. 什么是configmap资源、secret资源(实战)
  3. opencv多摄像头配准_CV 两幅图像配准
  4. 负载均衡的几种方式_负载均衡的几种类型
  5. darknet53 作用_darknet53 yolo 下的识别训练
  6. python中randint用法_python中的randint,引入模块
  7. python 统计excel表格_Python实现对excel文件列表值进行统计的方法
  8. python await timeout_python等待10秒执行下一命令的方法
  9. 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
  10. mysql计算3000分钟后的日期_MySQL – 计算两个日期时间之间的净时差,同时排除中断?...