RANSAC算法一步步流程

1.数据输入

cin遇到空格或回车结束读取。

#include<iostream>
#include<vector>


using namespace std;

struct stPoint 
{
    double x;
    double y;
};


int main()
{
    int nNum;
    cin >> nNum;

    vector<stPoint> vecPoints(nNum);
    for (int i = 0; i < nNum; i++)
    {
        cin >> vecPoints[i].x >> vecPoints[i].y;
    }
    for (int i = 0; i < nNum; i++)
    {
        cout << vecPoints[i].x << " " << vecPoints[i].y << endl;
    }

    system("pause");

}
2.随机数产生器

参考资料:

[1]C++随机数函数库

#include<iostream>
#include<random>

using namespace std;

int main()
{
    //随机数产生需要生成器和分布器
    default_random_engine rng;
    uniform_int_distribution<int> uniform(1,10);

    rng.seed(10);
    int nCnt = 10;
    while (nCnt--)
    {
        cout << uniform(rng) <<" ";
    }

    system("pause");
}

基本思想是对的


#include<iostream>
#include<random>
#include<vector>
#include<memory.h>
#include<set>

using namespace std;

struct stPoint {
    double x;
    double y;
};

//基于RANSAC算法的直线拟合
//pstData:指向数据的指针
//nDataCnt:数据点个数
//nMinCnt:模型参数估计所需要的数据点的个数
//nMaxIterCnt:最大迭代次数
//nConsesusCntThreshold:模型一致性判断准则
//dModelMeanError:模型误差
//返回值:返回0表示获取最优模型,否则表示未获取最优模型

void RansacLinear(stPoint* pPoints,int nCnt,double& dAA,double& dBB,double& dCC,int nIterCnt,double dMaxErrorThreshold)
{
    //对于每一次迭代
    //1.随机选择2个点
    //2.得到模型参数
    //3.计算内点数量
    //4.更新内点数量最多的模型

    //随机数需要生成器和分布器
    default_random_engine rng;
    uniform_int_distribution<int> uniform(0,nCnt);
    rng.seed(10);

    int nBestRightCnt = 0;
    while (nIterCnt)
    {
        //1.随机选择两个点
        set<int> sIndexs;
        sIndexs.clear();
        while (1)
        {
            sIndexs.insert(uniform(rng));
            if (sIndexs.size() == 2)
                break;
        }

        //2.得到模型参数
        //set取值要注意
        vector<stPoint> vecPoints;
        vecPoints.clear();
        for (auto iter = sIndexs.begin(); iter != sIndexs.end(); iter++)
        {
            vecPoints.push_back(pPoints[*iter]);
        }


        double dDeltaY = vecPoints[0].y-vecPoints[1].y;
        double dDeltaX = vecPoints[0].x-vecPoints[1].y;

        double dA = -dDeltaY;
        double dB = dDeltaX;
        double dC = dDeltaY*vecPoints[0].x - dDeltaX*vecPoints[0].y;

        //3.统计内点个数
        int nRightCnt = 0;
        for (int i = 0; i < nCnt; i++)
        {
            double distance = abs(dA*pPoints[i].x + dB*pPoints[i].y + dC) / sqrt(dA*dA+dB*dB);
            if (distance < dMaxErrorThreshold)
                nRightCnt++;
        }
        //4.保存内点个数最多的模型
        if (nRightCnt > nBestRightCnt)
        {
            nBestRightCnt = nRightCnt;
            dAA = dA;
            dBB = dB;
            dCC = dC;
        }

        nIterCnt--;
    }

}



int main()
{
    int nNum;
    cin >> nNum;

    vector<stPoint> v(nNum);
    for (int i = 0; i < nNum; i++)
    {
        cin >> v[i].x >> v[i].y;
    }   

    int nCount = v.size();
    double dA, dB, dC, dMeanError;

    dA = dB = dC = 0;
        RansacLinear(v.data(),v.size(),dA,dB,dC,35,0.1);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 浅谈C++常用输入输出 在编写C++程序的时候,经常因为输入输出头疼,所以在这里做一个小结,记录一下常用的输入输出...
    MinoyJet阅读 3,782评论 0 6
  • 0.定义一个学生类。有属性:姓名、年年龄、成绩(语⽂文,数学,英语)[每课成绩的类型为整数]方法: a. 获取学生...
    RurouniKenshin阅读 252评论 0 13
  • 七年前的今天,南非世界杯决赛第一场。刚高考完的我,躺在沙发上熬夜看球。黑龙江那时还没平行志愿,考完先估分再报考,最...
    小迷糊克谢妮加油哇阅读 240评论 0 0
  • 大家早上好,我爱自己,昨天把最烧脑统计决策课上完了,就像老师说的,每个老师都是一本书,上一门课就是读一本关于这个老...
    sophia夏阅读 182评论 0 0
  • 阅读书目:《成为作家》 作者:多萝西娅·布兰德 第三、四章 虽然这本书的分类属于一般写作的读物,可是我又读了两章,...
    文ww文阅读 140评论 0 1