转载自王先荣 http://www.cnblogs.com/xrwang/p/SampleOfRansac.html

作者:王先荣

大约在两年前翻译了《随机抽样一致性算法RANSAC》,在文章的最后承诺写该算法的C#示例程序。可惜光阴似箭,转眼许久才写出来,实在抱歉。本文将使用随机抽样一致性算法来来检测直线和圆,并提供源代码下载。

一、RANSAC检测流程

在这里复述下RANSAC的检测流程,详细的过程见上一篇翻译文章:

RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

    RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
    1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
    2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
    3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
    4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
    5.最后,通过估计局内点与模型的错误率来评估模型。
    这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

二、得到观测数据

我们没有实验(测试)数据,这里用手工输入的数据来替代——记录您在PictureBox中的点击坐标,作为观测数据。

 得到样本点

三、检测直线

3.1 直线的相关知识

(1)平面上的任意两点可以确定一条直线;

(2)直线的通用数学表达形式为:ax+by+c=0。这种表达形式有三个未知数,需要提供三个点才能解出a,b,c三个参数。由于随机选择的三个点不一定在一条直线上,所以程序中放弃这种方式。

(3)直线可以用y=ax+b及x=c这两个式子来表示。这两种形式只有一个或者两个未知数,只需两个点就能解出a,b,c三个参数。随机选择的两个点即可得到直线,我们采用这种形式。

3.2 直线类

直线类(Line)封装了跟直线相关的一些属性及方法,列表如下:

(1)属性

A——y=ax+b中的a

B——y=ax+b中的b

C——x=c中的c

(2)构造函数

public Line(PointF p1, PointF p2)

提供两个点p1及p2,计算出直线的属性A,B,C。

(3)方法

GetDistance——获取点到直线之间的距离;

GetY——根据x坐标,获取直线上点的y坐标;

ToString——获取直线的方程式。

 Line类

3.3 检测直线的过程

(1)随机从观测点中选择两个点,得到通过该点的直线;

(2)用(1)中的直线去测试其他观测点,由点到直线的距离确定观测点是否为局内点或者局外点;

(3)如果局内点足够多,并且局内点多于原有“最佳”直线的局内点,那么将这次迭代的直线设为“最佳”直线;

(4)重复(1)~(3)步直到找到最佳直线。

细心的您估计已经发现我省略了标准RANSAC检测过程中重新估计模型的步骤,我是故意的,我觉得麻烦且没什么用处,所以咔嚓了,O(∩_∩)O~。

 获取直线

四、检测圆

4.1 圆的相关知识

(1)平面内不在同一直线上的三个点可以确定一个圆;

(2)圆的数学表达形式为:(x-a)2+(y-b)2=r2

其中,(a,b)为圆心,r为半径。

4.2 圆类

圆类(Circle)封装了跟圆有关的属性及方法,列表如下:

(1)属性

A——圆心的x坐标

B——圆心的y坐标

R——圆的半径

(2)构造函数

public Circle(PointF p1, PointF p2, PointF p3)

提供三个点p1,p2和p3,计算出圆的属性A,B,R。

(3)方法

GetDistance——获取点到圆(周)之间的距离,表示点接近或者远离圆;

ToString——获取圆的方程式。

 Circle类

3.3 检测圆的过程

(1)随机从观测点中选择三个点,尝试得到通过这三个点的圆;

(2)用(1)中的圆去测试其他观测点,由点到圆的距离确定观测点是否为局内点或者局外点;

(3)如果局内点足够多,并且局内点多于原有“最佳”圆的局内点,那么将这次迭代的圆设为“最佳”圆;

(4)重复(1)~(3)步直到找到最佳圆。

 获取圆

五、本文源代码

点击这里下载本文源代码

随机抽样一致性算法(RANSAC)示例及源代码--转载的更多相关文章

  1. 随机抽样一致性算法(RANSAC)示例及源代码

    作者:王先荣 大约在两年前翻译了<随机抽样一致性算法RANSAC>,在文章的最后承诺写该算法的C#示例程序.可惜光阴似箭,转眼许久才写出来,实在抱歉.本文将使用随机抽样一致性算法来来检测直 ...

  2. 随机抽样一致性算法(RANSAC)转载

    这两天看<计算机视觉中的多视图几何>人都看蒙了,转载一些干货看看 转自王先荣 http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac ...

  3. 随机抽样一致性(RANSAC)算法详解

    随机抽样一致性(RANSAC)算法能够有效的剔除特征匹配中的错误匹配点. 实际上,RANSAC能够有效拟合存在噪声模型下的拟合函数.实际上,RANSAC算法的核心在于将点划分为“内点”和“外点”.在一 ...

  4. 随机抽样一致性算法(RANSAC)

    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文. RANSAC是"RANdom SAmple ...

  5. [转载] 一致性问题和Raft一致性算法

    原文: http://daizuozhuo.github.io/consensus-algorithm/ raft 协议确实比 paxos 协议好懂太多了. 一致性问题 一致性算法是用来解决一致性问题 ...

  6. PCL采样一致性算法

    在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心 ...

  7. Raft 一致性算法论文译文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  8. 分布式一致性算法2PC和3PC

    为了解决分布式一致性问题,产生了不少经典的分布式一致性算法,本文将介绍其中的2PC和3PC.2PC即Two-Phase Commit,译为二阶段提交协议.3PC即Three-Phase Commit, ...

  9. 分布式一致性算法——paxos

    一.什么是paxos算法 Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题. 人们在理解paxos算法是会遇到一些困境,那么接下来,我们带着以下几个问题来学习 ...

随机推荐

  1. Python函数标注

    Python函数标注 是关于用户自定义函数中使用的类型的完全可选元数据信息. 函数标注 以Python字典的形式存放在函数的 __annotations__ 属性中,并且不会影响函数的任何其他部分. ...

  2. PHP精确到毫秒秒杀倒计时实例

    精确到毫秒秒杀倒计时PHP源码实例,前台js活动展示倒计时,后台计算倒计时时间.每0.1秒定时刷新活动倒计时时间. PHP: // 注意:php的时间是以秒算.js的时间以毫秒算 // 设置时区 da ...

  3. Java飞机大战MVC版

    PlaneWar Java飞机大战MVC版 //无聊时偷的雷霆战机素材写了一个飞机大战,本意是练习mvc,但写得还是不清晰 github下载:https://github.com/dejavudwh/ ...

  4. Spring Task中的定时任务无法注入service的解决办法

    1.问题 因一个项目(使用的是Spring+SpringMVC+hibernate框架)需要在spring task定时任务中调用数据库操作,在使用 @Autowired注入service时后台报错, ...

  5. 软银集团和共享办公空间公司WeWork在日本成立合资公司

    [TechWeb报道]7月18日消息,据国外媒体报道,软银集团和共享办公空间公司WeWork联合宣布,在日本成立合资公司WeWork Japan. 该合资公司将在日本开设联合办公空间,于明年初在东京设 ...

  6. 网易客户端授权密码,errormsg='authentication failed (method LOGIN)' exitcode=EX_NOPERM

    zabbix群里一网友在安装msmtp+mutt测试发送邮件失败 配置文件如下: /usr/local/msmtp/etc/msmtprc account default host smtp..com ...

  7. Centos上搭建git服务

    1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...

  8. php分页类学习

    分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在多个页面中显示大量的数据.在互联网上,分​页是一般用于搜索结果或是浏览全部信息(比如:一个论坛主题).几乎在每一个W ...

  9. Python Requests库简单入门

    我对Python网络爬虫的学习主要是基于中国慕课网上嵩天老师的讲授,写博客的目的是为了更好触类旁通,并且作为学习笔记之后复习回顾. 1.引言 requests 库是一个简洁且简单的处理HTTP请求的第 ...

  10. Navicat for mysql导入.sql数据库大小受限制

    把导入单个表的最大限制调一下就行(在my.ini里面就算改了max_allowed_packet也不一定行,因为Navicat貌似并不调用,实际他有自己的一套默认配置,所以需要在Navicat上调整) ...