作用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的目標是找尋乙個...