RANSAC算法一步步流程

1.数据输入

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

#include
#include


using namespace std;

struct stPoint 
{
    double x;
    double y;
};


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

    vector 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
#include

using namespace std;

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

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

    system("pause");
}

基本思想是对的


#include
#include
#include
#include
#include

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 uniform(0,nCnt);
    rng.seed(10);

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

        //2.得到模型参数
        //set取值要注意
        vector 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 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);
}

你可能感兴趣的:(RANSAC算法一步步流程)