隨機取樣一致性演算法RANSAC

2021-10-08 22:59:43 字數 1508 閱讀 8669

作用1:點雲分割通過(空間平面、直線、二維或三維圓、圓球、錐體等模型)進行分割。

作用2:點雲的配準對的剔除(例子:五個點雲,三個配準,利用ransac可以剔除另外兩個)

演算法簡介:從樣本中抽取乙個子集,通過該演算法最小方差對這個樣本計算出這個該模型的引數(例如模型是一條直線,那麼計算該樣本所有的點到直線的方差,綜合最短的距離就是這條直線的位置),然後所有樣本與該模型的偏差。為該模型設定乙個閾值,偏差小於閾值為內點,大於閾值為外點。

配準對的剔除存在的兩個問題,如果目標不是現實物體,閾值比較難設定,2_:迭代次數是執行期決定的,無法知道準確次數,但是可以**範圍,每次只能檢測一種模型。

**實現

#include //載入演算法

#include //載入平面模型

#include //載入球狀模型

pcl::pointcloud::ptr cloud(new pcl::pointcloud);

pcl::pointcloud::ptr inliers_cloud(new pcl::pointcloud);

pcl::sampleconsensusmodelplane::ptr model_p(

new pcl::sampleconsensusmodelplane(cloud)); //建立模型 // 根據模型迭代擬合出平面模型引數,並獲取符合其模型引數的內部點

// 用於接收所有內部點的索引

std::vectorinliers;

pcl::randomsampleconsensusransac(model_p);

// 閾值 1cm

ransac.setdistancethreshold(0.01f);

// 執行計算

ransac.computemodel();

// 獲取內點

ransac.getinliers(inliers);

// 根據索引列表拷貝點雲

pcl::copypointcloud(*cloud, inliers, *inliers_cloud);

球形,其他一樣

pcl::sampleconsensusmodelsphere::ptr model_s(

new pcl::sampleconsensusmodelsphere(cloud));

對於ransac來說接受的是

/** \brief ransac (random sample consensus) main constructor

* \param[in] model a sample consensus model

*/randomsampleconsensus (const sampleconsensusmodelptr &model)

: sampleconsensus(model)

所以還可以設定pcl::sampleconsensusmodel::ptr 來接收不同的模型

RANSAC 隨機取樣一致性演算法

ransac範例的正式描述如下 首先,要給定 1乙個模型,該模型需要最少n個資料點去例項化它的自由引數 2一組資料點p,p中包含資料點的數量 p 大於n。然後,從p中隨機地選擇n個點 組成p的乙個子集s1 並例項化這個模型 構造成m1 接下來,利用例項化的模型m1去測定p中點的某個子集s1 這些點相...

隨機一致性檢測RANSAC

隨機一致性取樣ransac是一種魯棒的模型擬合 演算法,能夠從有外點的資料中擬合準確的模型。它的原理很樸素就是從樣本資料中找到具有一致性的資料,用這些資料去建立樣本的數學模型。這個一致性怎麼理解?我的理解是 如果按照聚類處理方式,一致性資料就是可以歸為一類的資料,他們最相近。俗話說 物以類聚,人以群...

隨機抽樣一致性演算法(RANSAC)

隨機抽樣一致性演算法 ransac 以下都是個人對於ransac的一些認識,可能有比較大的問題,望大家批評指正。應用的範圍 主要在散點圖中獲得乙個已知模型的引數,使得符合這個模型引數的點最多。散點圖由局內點和局外點之分,當散點在模型上時則是局內點,如果在模型外則為局外點。ransac的目標是找尋乙個...