Opencv椭圆拟合
转: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椭圆拟合相关推荐
- OpenCV椭圆拟合ellipse fitting的实例(附完整代码)
OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 OpenCV椭圆拟合ellipse fitting的实例 #include &quo ...
- opencv中的椭圆拟合
首先贴一个最简单的程序:访问:https://blog.csdn.net/guduruyu/article/details/70069426 //创建一个用于绘制图像的空白图 cv::Mat imag ...
- c# 椭圆拟合库_利用C#版OpenCV实现圆心求取实例代码
前言 OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp. 该源码是 BSD ...
- java 椭圆拟合,OpenCV画轮廓的外界圆矩形椭圆等
#include #include #include #include using namespace std; #pragma comment(lib,"cv.lib") # ...
- OpenCV轮廓提取和椭圆拟合
今天用到了几个函数,作个总结. 首先是在二值图像中找轮廓,我的图象中只有一条轮廓,所以使用比较简单. 首先要分配存储空间,使用函数cvCreateMemStorage(0)分配一个默认大小的CvMem ...
- 基于代数距离的椭圆拟合
问题 给定离散点集Xi=(xi,yi),i=1,2,...NX_i=(x_i,y_i) ,i=1,2,...NXi=(xi,yi),i=1,2,...N,我们希望找到误差最小的椭圆去拟合这些离散 ...
- OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
1 图像的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义. ...
- OpenCV直线拟合检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测 ...
- 基于椭圆拟合的环岛识别方法
00摘要 环岛元素是智能车比赛中较难处理的元素之一.比赛要求智能车能检测到环岛并从入口驶入,在绕行约 270°后驶出环岛,其中,能否高响应.高鲁棒性地检测环岛是后续进出环岛等步骤的基础.本文根据计算机 ...
- MATLAB实战系列(三十三)-技术和医疗的完美结合(续),基于最小二乘法的椭圆拟合
前言 在上篇文章,基于MATLAB的骨骼测量系统--医学影像研究中,第3节金属球的求识别,运用到椭圆函数拟合来得到金属球大小.本文介绍如何采用MATLAB进行椭圆拟合,包括特殊的圆,一般椭圆及倾斜椭圆 ...
最新文章
- 鴻雁 Anser cygnoides
- 大话数据结构:平衡二叉排序树
- 2020最新Java线程池入门(超详细)
- 第五周课程总结实验报告(三)
- 未越狱设备提取数据_从三星设备中提取健康数据
- pandas中size方法_如何使用pdpipe与Pandas构建管道?
- cisco路由器基本实验之六 CHAP and RIP (Boson NetSim)
- 1.自编码器(keras+mnist)
- 计算机处理答题卡原理,基于图像处理的答题卡自动阅卷系统的设计与实现
- AIR是什么?.air文件如何打开?flex如何运行air文件
- Centos7下载文件恢复工具 extundelete
- 8_7.网络安全协议
- fastdb java_FastDB应用开发指南.pdf
- PicGo配置阿里云OSS
- errors potentially fixable with the `--fix` option报错的解决
- Oracle学习——第四讲(增删改查)
- java面试vs撒谎?
- python读写csv常用方法
- SqlYog创建数据库
- 职称计算机每次评都要高吗,计算机评中级职称都需要什么?
热门文章
- Vant中List组件immediate-check=false无效
- 什么是configmap资源、secret资源(实战)
- opencv多摄像头配准_CV 两幅图像配准
- 负载均衡的几种方式_负载均衡的几种类型
- darknet53 作用_darknet53 yolo 下的识别训练
- python中randint用法_python中的randint,引入模块
- python 统计excel表格_Python实现对excel文件列表值进行统计的方法
- python await timeout_python等待10秒执行下一命令的方法
- 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
- mysql计算3000分钟后的日期_MySQL – 计算两个日期时间之间的净时差,同时排除中断?...