随机抽样一致性算法(RANSAC)示例及源代码--转载

转载自王先荣 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)步直到找到最佳圆。

 获取圆

五、本文源代码

点击这里下载本文源代码

时间: 2024-10-21 18:26:04

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

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

这两天看<计算机视觉中的多视图几何>人都看蒙了,转载一些干货看看 转自王先荣 http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html 作者:王先荣    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文.    RANSAC是"RANdom SAmple Consensus(随机抽样一致)"的缩写.它可以从一组包

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

RANSAC是"RANdom SAmple Consensus(随机抽样一致)"的缩写.它可以从一组包含"局外点"的观测数据集中,通过迭代方式估计数学模型的参数.它是一种不确定的算法--它有一定的概率得出一个合理的结果:为了提高概率必须提高迭代次数.该算法最早由Fischler和Bolles于1981年提出.    RANSAC的基本假设是:(1)数据由"局内点"组成,例如:数据的分布可以用一些模型参数来解释:(2)"局外点"

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

原文: http://daizuozhuo.github.io/consensus-algorithm/ raft 协议确实比 paxos 协议好懂太多了. 一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的结果达成一致. 更详细的解释就是,当其中某个服务器收到客户端的一组指令时,它必须与其它服务器交流以保证所有的服务器都是以同样的顺序收到同样的指

分布式一致性算法——paxos

一.什么是paxos算法 Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题. 人们在理解paxos算法是会遇到一些困境,那么接下来,我们带着以下几个问题来学习paxos算法: 1.paxos到底在解决什么问题? 2.paxos到底如何在分布式存储系统中应用? 3.paxos的核心思想是什么? 二.paxos解决了什么问题 分布式的一致性问题其实主要是指分布式系统中的数据一致性问题.所以,为了保证分布式系统的一致性,就要保证分布式系统中的数据是一致的. 在

Four modifications for the Raft consensus algorithmRaft一致性算法的四个改进译文

最近用业余时间对Four modifications for the Raft consensus algorithm论文进行了翻译,该论文从4个方面优化了Raft实现,对工程实现的借鉴意义如下: 1.Cluster initialization:可以解决多数派节点异常的情况下,集群始终不可用问题,让少数派集群恢复到正常服务的状态. 2.Universally Unique Database Identifier:可以在多raft组.multi raft.多数据中心场景下,避免由于运维人员操作错

一致性算法中的节点下限(转)

在众多的分布式一致性算法中,经常需要通过节点的数量满足某种规则来保证算法的正确性,比如Paxos算法,依赖一个”多数派“ 节点的工作的正确性.这类算法的共同目标是容许尽量多的节点失败但又不影响算法的正确性”. 这类问题本质上都抽象为数学上集合之间的逻辑关系,下面我们便从集合的性质入手讨论,为此先引入两个问题: 假设N为一非空结合,n为集合的元素数,M1,M2,...,Mm为N的m个子集,其元素数分别为n1,n2,...,nm,则: 求得M1∩M2∩...∩Mn≠Φ的条件 求得M1∩M2∩...∩

一致性算法--Paxos

分布式一致性算法--Paxos Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说,就是可以通过Paxos实现多副本一致性,分布式锁,名字管理,序列号分配等.比如,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态.为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”

一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%

一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的结果达成一致. 更详细的解释就是,当其中某个服务器收到客户端的一组指令时,它必须与其它服务器交流以保证所有的服务器都是以同样的顺序收到同样的指令,这样的话所有的 服务器会产生一致的结果,看起来就像是一台机器一样. 实际生产中一致性算法需要具备以下属性: safety:即不管怎样都不会返回错误的结果

Raft一致性算法

转自 http://blog.csdn.net/cszhouwei/article/details/38374603 Why Not Paxos Paxos算法是莱斯利·兰伯特(LeslieLamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后1998年重新发表到ACM Transactions on Computer Systems上(The Part-TimePa