• 随机抽样一致性算法(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)步直到找到最佳圆。

     获取圆

     

    五、本文源代码

        点击这里下载本文源代码

  • 相关阅读:
    vm串口问题
    web测试和一般的应用程序测试的主要区别
    测试点总结<转>
    【转】.net正则表达式基础学习
    QTP场景恢复详解
    QTP之检查点实例操作(转载)
    Java使用JNI调用第三方dll动态链接库
    Android 2.2播放mp4视频提示“是无效的流媒体”的问题
    FileSystemWatch 对文件的监测 修改 创建 删除 并写入日志
    WinForm程序开机自动运行
  • 原文地址:https://www.cnblogs.com/Tigerwang1218/p/7269614.html
Copyright © 2020-2023  润新知