RANSAC算法一步步流程

1.數(shù)據(jù)輸入

cin遇到空格或回車結(jié)束讀取。

#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.隨機(jī)數(shù)產(chǎn)生器

參考資料:

[1]C++隨機(jī)數(shù)函數(shù)庫(kù)

#include<iostream>
#include<random>

using namespace std;

int main()
{
    //隨機(jī)數(shù)產(chǎn)生需要生成器和分布器
    default_random_engine rng;
    uniform_int_distribution<int> uniform(1,10);

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

    system("pause");
}

基本思想是對(duì)的


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

using namespace std;

struct stPoint {
    double x;
    double y;
};

//基于RANSAC算法的直線擬合
//pstData:指向數(shù)據(jù)的指針
//nDataCnt:數(shù)據(jù)點(diǎn)個(gè)數(shù)
//nMinCnt:模型參數(shù)估計(jì)所需要的數(shù)據(jù)點(diǎn)的個(gè)數(shù)
//nMaxIterCnt:最大迭代次數(shù)
//nConsesusCntThreshold:模型一致性判斷準(zhǔn)則
//dModelMeanError:模型誤差
//返回值:返回0表示獲取最優(yōu)模型,否則表示未獲取最優(yōu)模型

void RansacLinear(stPoint* pPoints,int nCnt,double& dAA,double& dBB,double& dCC,int nIterCnt,double dMaxErrorThreshold)
{
    //對(duì)于每一次迭代
    //1.隨機(jī)選擇2個(gè)點(diǎn)
    //2.得到模型參數(shù)
    //3.計(jì)算內(nèi)點(diǎn)數(shù)量
    //4.更新內(nèi)點(diǎn)數(shù)量最多的模型

    //隨機(jī)數(shù)需要生成器和分布器
    default_random_engine rng;
    uniform_int_distribution<int> uniform(0,nCnt);
    rng.seed(10);

    int nBestRightCnt = 0;
    while (nIterCnt)
    {
        //1.隨機(jī)選擇兩個(gè)點(diǎn)
        set<int> sIndexs;
        sIndexs.clear();
        while (1)
        {
            sIndexs.insert(uniform(rng));
            if (sIndexs.size() == 2)
                break;
        }

        //2.得到模型參數(shù)
        //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.統(tǒng)計(jì)內(nèi)點(diǎn)個(gè)數(shù)
        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.保存內(nèi)點(diǎn)個(gè)數(shù)最多的模型
        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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 淺談C++常用輸入輸出 在編寫C++程序的時(shí)候,經(jīng)常因?yàn)檩斎胼敵鲱^疼,所以在這里做一個(gè)小結(jié),記錄一下常用的輸入輸出...
    MinoyJet閱讀 3,851評(píng)論 0 6
  • 0.定義一個(gè)學(xué)生類。有屬性:姓名、年年齡、成績(jī)(語?文,數(shù)學(xué),英語)[每課成績(jī)的類型為整數(shù)]方法: a. 獲取學(xué)生...
    RurouniKenshin閱讀 266評(píng)論 0 13
  • 七年前的今天,南非世界杯決賽第一場(chǎng)。剛高考完的我,躺在沙發(fā)上熬夜看球。黑龍江那時(shí)還沒平行志愿,考完先估分再報(bào)考,最...
    小迷糊克謝妮加油哇閱讀 250評(píng)論 0 0
  • 大家早上好,我愛自己,昨天把最燒腦統(tǒng)計(jì)決策課上完了,就像老師說的,每個(gè)老師都是一本書,上一門課就是讀一本關(guān)于這個(gè)老...
    sophia夏閱讀 203評(píng)論 0 0
  • 閱讀書目:《成為作家》 作者:多蘿西婭·布蘭德 第三、四章 雖然這本書的分類屬于一般寫作的讀物,可是我又讀了兩章,...
    文ww文閱讀 152評(píng)論 0 1

友情鏈接更多精彩內(nèi)容