RANSAC演算法應用

2021-08-07 14:25:09 字數 2376 閱讀 7351

在對資料進行建模時,我們往往會遇到資料中存在異常資料(outlier,一般稱為外點)的情況,如圖,用一條直線擬合圖中的點,其中左下和右上的點明顯是外點。

此時使用最小二乘法,則會由於外點的存在偏離正確模型較多,如下圖,因此我們需要找出並剔除這些外點,從而得到乙個較好的模型。

ransac(random sample consensus)基本思想是通過多次隨機抽取部分資料進行模型估計,然後使用全部資料評估這些模型的正確性並進行比較,得出最好的模型。具體步驟如下。

隨機抽取資料集中的一些樣本 si

,估計乙個模型 mi

。通過一定標準檢驗能較好的符合模型mi

的資料集s′

i ,稱為內點(inliner)。若s

ize(

si)>

n ,n為人為設定的閾值,則演算法結束,得到模型m

否則重新進行步驟1~3.若一定重複次數後演算法依然沒結束,則選取內點數目最多的模型。

使用得到模型的內點再次計算更優的模型m′

使用ransac演算法得到的擬合直線如下

ransac進行直線擬合的**如下:

ransac.hpp

#include 

#include

class ransacmodelestimator

; cv::mat run(std::vector

point_set);

int iterate(std::vector

& mask);

void estimateparm(std::vector

& initial_point);

void estimateinliners(std::vector

& mask);

cv::mat estimateparm1(std::vector

& initial_point);

double estimatedeparture(cv::point3d& p);

private:

std::vector

point_set;

cv::point3d theta;

std::vector

rand_index;

};

ransac.cpp

#include "ransac.hpp"

#include

#include

using

namespace

std;

using

namespace cv;

double ransacmodelestimator::estimatedeparture(point3d& p)

void ransacmodelestimator::estimateinliners(vector

& mask)

}void ransacmodelestimator::estimateparm(vector

& initial_point)

mat ransacmodelestimator::estimateparm1(vector

& inliner_point)

mat tconstrains;

mat result;

cv::svd::solvez(constrains, result);

return result;

}int ransacmodelestimator::iterate(vector

& mask)

estimateparm(initial_point);

estimateinliners(mask);

return mask.size();

}mat ransacmodelestimator::run(vector

point_set_)

}vector

inliners;

for (size_t i = 0; i < optimal_inliner_num; i++)

return estimateparm1(inliners);

}int main()

,,,,,,,, });

std::cout

<< result << endl;

return

0;}

RANSAC演算法應用

在對資料進行建模時,我們往往會遇到資料中存在異常資料 outlier,一般稱為外點 的情況,如圖,用一條直線擬合圖中的點,其中左下和右上的點明顯是外點。此時使用最小二乘法,則會由於外點的存在偏離正確模型較多,如下圖,因此我們需要找出並剔除這些外點,從而得到乙個較好的模型。ransac random ...

RANSAC演算法理解與應用

ransac核心思想就是隨機性和假設性,隨機性用於減少計算,迴圈次數是利用正確資料出現的概率。而假設性,就是說隨機抽出來的資料都認為是正確的,並以此去計算其他點,獲得其他滿足變換關係的點,然後利用投票機制,選出獲票最多的那乙個變換。具體的流程 1 在可以有 也可以沒有,主要看應用場景 條件限制 比如...

RANSAC演算法詳解

另參考 給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式 點斜式 截距式等等 然後通過向量計算即可方便地...