国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++:RANSAC采樣一致性算法擬合一元二次曲線

這篇具有很好參考價(jià)值的文章主要介紹了C++:RANSAC采樣一致性算法擬合一元二次曲線。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

數(shù)學(xué)補(bǔ)充

這里會(huì)用到線性代數(shù)里的一些知識(shí),每次都是用起來(lái)看,用完了又忘,這里把一些可能用到的貼出來(lái),用于快速理解算法里用到的公式等。
直線一般式

當(dāng)x1≠x2,y1≠y2時(shí),直線的斜率k=(y2-y1)/(x2-x1)
故直線方程為y-y1=(y2-y1)/(x2-x1)×(x-x1)
即x2y-x1y-x2y1+x1y1=(y2-y1)x-x1(y2-y1)(y2-y1)x-(x2-x1)y-x1(y2-y1)+(x2-x1)y1=0(y2-y1)x+(x1-x2)y+x2y1-x1y2=0 ①
可以發(fā)現(xiàn),當(dāng)x1=x2或y1=y2時(shí),①式仍然成立。所以直線AX+BY+C=0的一般式方程就是:
A = Y2 - Y1
B = X1 - X2
C = X2*Y1 - X1*Y2

對(duì)于一元二次多項(xiàng)式,可以轉(zhuǎn)換為線性方程組求解,我們一般寫成矩陣形式 Ax = y。
ransac擬合曲線,C++,激光點(diǎn)云,算法,c++,矩陣

Ax = y非一致方程和一致方程的求解
一致與非一致方程

    一致方程是指Ax = y有至少一個(gè)解
    非一致方程指Ax = y沒有解

Ax = y求解

    如果A是滿秩的方陣,則x = inv(A)*y

    如果A不是方陣,但是是行滿秩或者列滿秩,那么解為A的偽逆乘以y

    如果A是秩虧的,那么A的解為A的廣義逆乘以y

實(shí)際上廣義逆包括逆、偽逆,廣義逆又稱為:Moore-Penrose逆矩陣,所以Ax = y的解可以統(tǒng)一為A 的Moore-Penrose逆矩陣乘以y,特別的是,對(duì)于一致性方程,該解為最小范數(shù)解,對(duì)于非一致方程,該解為最小范數(shù)最小二乘解

Moore-Penrose逆矩陣
ransac擬合曲線,C++,激光點(diǎn)云,算法,c++,矩陣
RANSAC直線擬合

C++實(shí)現(xiàn)

int ransac_curve_fitting(std::vector<float4> &in_cloud, std::vector<double> &best_model, std::vector<float4> &inliers, 
                        int maxiter=200, int mSamples=3, int min_inliers=10, float residual_thres=0.2)
{
    int point_num = in_cloud.size();
    std::default_random_engine rng;
    std::uniform_int_distribution<unsigned> uniform(0, point_num-1);
    rng.seed(10);

    // y = ax^2 + bx + c    <<<--- A_(0,0)=a, A_(1,0)=b, A_(2,0)=c --->>>
    Eigen::MatrixXd X_(3, 3), Y_(3, 1), A_(3, 1), points_x(point_num, 3), points_y(point_num, 1); //  dynamic cols.rows,
    for (int i = 0; i < point_num; ++i)
    {
      points_x(i, 0) = in_cloud[i].x * in_cloud[i].x;
      points_x(i, 1) = in_cloud[i].x;
      points_x(i, 2) = 1;
      points_y(i, 0) = in_cloud[i].y;
    }   

    std::vector<unsigned int> selectIndexs;
    int best_inilers = 0;
    float best_error = 100.0;
    int iter = 0;
    int best_iter = 0;
    float tmp_error = 0.0;
    int num = 0;
    
    while (iter < maxiter)
    {
        selectIndexs.clear();
        inliers.clear();
        // 隨機(jī)選n個(gè)點(diǎn)
        while (1)
        {
            unsigned int index = uniform(rng); 
            selectIndexs.push_back(index);
            if(selectIndexs.size() == mSamples) // sample==2
            {
                break;
            }
        }
        // 模型參數(shù)估計(jì)
        for (size_t i = 0; i < selectIndexs.size(); ++i)
        {
          // std::cerr << selectIndexs[i] << std::endl;
          X_(i, 0) = in_cloud[selectIndexs[i]].x * in_cloud[selectIndexs[i]].x;
          X_(i, 1) = in_cloud[selectIndexs[i]].x;
          X_(i, 2) = 1;
          Y_(i, 0) = in_cloud[selectIndexs[i]].y;
        }
        try
        {
          X_.inverse();
        }
        catch(const std::exception& e)
        {
          std::cerr << e.what() << '\n';
          std::cerr << "Start the next loop..." << '\n';
          continue;
        }
        // X_為可逆方陣
        A_ = X_.inverse() * Y_;  
        Eigen::MatrixXd y_pred = points_x * A_;
        Eigen::MatrixXd residual = points_y - y_pred;

        for (size_t i = 0; i < point_num; ++i)
        {
          if (abs(residual(i, 0)) < residual_thres)
          {
            inliers.push_back(in_cloud[i]);
          }
          
        }
        
        int inlier_num = inliers.size();
        if (inlier_num > best_inilers)
        {
          best_inilers = inlier_num;
          best_model[0] = A_(0,0);
          best_model[1] = A_(1,0);
          best_model[2] = A_(2,0);
          best_iter = iter;
        }

        if (inlier_num > min_inliers)
        {
          Eigen::MatrixXd better_model(3, 1), inliers_x(inlier_num, 3), 
                          inliers_y(inlier_num, 1), y_pred_better(inlier_num, 1);
          for (size_t i = 0; i < inlier_num; ++i)
          {
            inliers_x(i, 0) = inliers[i].x * inliers[i].x;
            inliers_x(i, 1) = inliers[i].x;
            inliers_x(i, 2) = 1;
            inliers_y(i, 0) = inliers[i].y;
          }
          better_model = (inliers_x.transpose() * inliers_x).inverse() * inliers_x.transpose() * inliers_y;
          y_pred_better = inliers_x * better_model;
          float mean_square_error = 0;
          for (size_t i = 0; i < inlier_num; ++i)
          {
            mean_square_error += pow((y_pred_better(i,0) - inliers_y(i,0)), 2);
          }
          mean_square_error = mean_square_error / inlier_num;
          if (mean_square_error < best_error)
          {
            best_error = mean_square_error;
            best_model[0] = better_model(0,0);
            best_model[1] = better_model(1,0);
            best_model[2] = better_model(2,0);
            best_iter = iter;
          }

        }

        if (tmp_error != best_error)
        {
          tmp_error = best_error;
        }
        else
        {
          num += 1;
          if (num > 10)
          {
            break;
          }
        }
        std::cerr << "number of the error is constant: " << num << std::endl;
        std::cerr << "ransac iterations: " << iter << std::endl;
        iter++;
    }
    std::cerr << "best_iter: " << best_iter << "\n" 
              << "best_model[0]: " << best_model[0] << "\n" 
              << "best_error: " << best_error << "\n" 
              << "inliers.size(): " << inliers.size() << std::endl;
    return 0;

}
std::vector<double> coef_line(3); // a, b, c
std::vector<float4> inliers;
ransac_curve_fitting(result, coef_line, inliers);

多車道線檢測(cè)效果圖

ransac擬合曲線,C++,激光點(diǎn)云,算法,c++,矩陣文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-578893.html

到了這里,關(guān)于C++:RANSAC采樣一致性算法擬合一元二次曲線的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【負(fù)載均衡——一致性哈希算法】

    【負(fù)載均衡——一致性哈希算法】

    一致性哈希算法就很好地解決了分布式系統(tǒng)在擴(kuò)容或者縮容時(shí),發(fā)生過(guò)多的數(shù)據(jù)遷移的問題。 一致哈希算法也用了取模運(yùn)算,但與哈希算法不同的是,哈希算法是對(duì)節(jié)點(diǎn)的數(shù)量進(jìn)行取模運(yùn)算,而一致 哈希算法 是對(duì) 2^32 進(jìn)行取模運(yùn)算,是一個(gè)固定的值。 一致性哈希要進(jìn)行兩步

    2024年04月10日
    瀏覽(26)
  • 區(qū)塊鏈:哈希算法與一致性哈希算法

    本篇主要介紹區(qū)塊鏈中常用到的哈希算法。 1 哈希算法 1.1 定義及特性 ??哈希算法是指通過(guò)哈希函數(shù)(Hash Function)對(duì)任意長(zhǎng)度的輸入數(shù)據(jù)(比如文件、消息、數(shù)字等)進(jìn)行轉(zhuǎn)換,生成一個(gè)固定長(zhǎng)度的哈希值(Hash Value)的過(guò)程。 ??在區(qū)塊鏈中,哈希算法常用于區(qū)塊驗(yàn)證及安全性保

    2024年02月17日
    瀏覽(25)
  • Python小知識(shí) - 一致性哈希算法

    Python小知識(shí) - 一致性哈希算法

    一致性哈希算法 一致性哈希算法(Consistent Hashing Algorithm)是用于解決分布式系統(tǒng)中節(jié)點(diǎn)增減比較頻繁的問題。它的思想是,將數(shù)據(jù)映射到0~2^64-1的哈??臻g中,并通過(guò)哈希函數(shù)對(duì)數(shù)據(jù)進(jìn)行映射,計(jì)算出數(shù)據(jù)所在的節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)增加或減少時(shí),只需要重新計(jì)算數(shù)據(jù)所在的節(jié)點(diǎn)即

    2024年02月09日
    瀏覽(19)
  • 分布式一致性算法Paxos

    分布式一致性算法Paxos

    ????????Paxos算法是Lamport宗師提出的一種基于消息傳遞的分布式一致性算法,是目前公認(rèn)的解決分布式一致性問題最有效的算法之一。Google Chubby的作者M(jìn)ike Burrows曾經(jīng)狂妄的說(shuō)過(guò)這個(gè)世界上只有一種一致性算法,那就是Paxos,其它的算法都是殘次品。 ????????Paxos算法是

    2023年04月16日
    瀏覽(94)
  • 通過(guò)zookeeper淺談一致性算法

    CAP 定理指的是在一個(gè)分布式系統(tǒng)中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性),三者不可兼得。 通俗來(lái)說(shuō): 一致性(C):當(dāng)系統(tǒng)數(shù)據(jù)發(fā)生更新操作后,各個(gè)主機(jī)中的數(shù)據(jù)仍然處于一致的狀態(tài)。 可用性(A):對(duì)于用戶的每一個(gè)請(qǐng)求,系統(tǒng)總

    2024年02月07日
    瀏覽(27)
  • 一致性哈希算法優(yōu)勢(shì)在哪?如何實(shí)現(xiàn)?

    1.1 簡(jiǎn)介Hash 哈希算法即散列算法,是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來(lái)保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個(gè)字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時(shí),其標(biāo)志值也會(huì)發(fā)生改

    2024年02月03日
    瀏覽(35)
  • 分布式一致性算法——Paxos 和 Raft 算法

    分布式一致性算法——Paxos 和 Raft 算法

    本文隸屬于專欄《100個(gè)問題搞定大數(shù)據(jù)理論體系》,該專欄為筆者原創(chuàng),引用請(qǐng)注明來(lái)源,不足和錯(cuò)誤之處請(qǐng)?jiān)谠u(píng)論區(qū)幫忙指出,謝謝! 本專欄目錄結(jié)構(gòu)和參考文獻(xiàn)請(qǐng)見100個(gè)問題搞定大數(shù)據(jù)理論體系 Paxos和Raft算法都是 分布式一致性算法 ,它們的目的都是 在一個(gè)分布式系統(tǒng)

    2024年01月20日
    瀏覽(31)
  • Redis擴(kuò)容與一致性Hash算法解析

    作者:zhaokk 在分布式系統(tǒng)中,隨著數(shù)據(jù)量的增加和負(fù)載的變化,對(duì)于存儲(chǔ)系統(tǒng)的擴(kuò)容變得尤為重要。Redis作為一種高性能的內(nèi)存數(shù)據(jù)庫(kù),其在擴(kuò)容方面采用了一致性Hash算法,以實(shí)現(xiàn)無(wú)縫的數(shù)據(jù)分布和負(fù)載均衡。本篇博客將詳細(xì)探討Redis的擴(kuò)容機(jī)制,同時(shí)深入解析一致性Hash算法

    2024年02月12日
    瀏覽(48)
  • Redis擴(kuò)容機(jī)制與一致性哈希算法解析

    在分布式系統(tǒng)設(shè)計(jì)中,Redis是一個(gè)備受歡迎的內(nèi)存數(shù)據(jù)庫(kù),而一致性哈希算法則是分布式系統(tǒng)中常用的數(shù)據(jù)分片和負(fù)載均衡技術(shù)。本文將深入探討Redis的擴(kuò)容機(jī)制以及一致性哈希算法的原理,同時(shí)提供示例代碼以幫助讀者更好地理解這兩個(gè)重要概念。 Redis是一種高性能的內(nèi)存數(shù)

    2024年02月11日
    瀏覽(43)
  • 分布式系統(tǒng)共識(shí)機(jī)制:一致性算法設(shè)計(jì)思想

    分布式系統(tǒng)共識(shí)機(jī)制:一致性算法設(shè)計(jì)思想

    這次以一個(gè)宏觀的角度去總結(jié) 自己學(xué)習(xí)過(guò)的一致性算法。一致性算法的目標(biāo)就是讓分布式系統(tǒng)里的大部分節(jié)點(diǎn) 保持?jǐn)?shù)據(jù)一致。 區(qū)塊鏈中的共識(shí)算法,pow、pos這類就屬于這個(gè)范圍,但他們僅僅是在區(qū)塊鏈領(lǐng)域內(nèi)應(yīng)用的,下面介紹一致性算法是在分布式系統(tǒng)中 應(yīng)用廣泛的,當(dāng)然

    2023年04月16日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包