天天看點

PCL采樣一緻性算法

在計算機視覺領域廣泛的使用各種不同的采樣一緻性參數估計算法用于排除錯誤的樣本,樣本不同對應的應用不同,例如剔除錯誤的配準點對,分割出處在模型上的點集,PCL中以随機采樣一緻性算法(RANSAC)為核心,同時實作了五種類似與随機采樣一緻形算法的随機參數估計算法,例如随機采樣一緻性算法(RANSAC)最大似然一緻性算法(MLESAC),最小中值方差一緻性算法(LMEDS)等,所有估計參數算法都符合一緻性原則。在PCL中設計的采樣一緻性算法的應用主要就是對點雲進行分割,根據設定的不同的幾個模型,估計對應的幾何參數模型的參數,在一定容許的範圍内分割出在模型上的點雲。

(1)RANSAC随機采樣一緻性算法的介紹

RANSAC是“RANdom SAmple Consensus(随機抽樣一緻)”的縮寫。它可以從一組包含“局外點”的觀測資料集中,通過疊代方式估計數學模型的參數。它是一種不确定的算法——它有一定的機率得出一個合理的結果;為了提高機率必須提高疊代次數。

數 據分兩種:有效資料(inliers)和無效資料(outliers)。偏差不大的資料稱為有效資料,偏差大的資料是無效資料。如果有效資料占大多數,無 效資料隻是少量時,我們可以通過最小二乘法或類似的方法來确定模型的參數和誤差;如果無效資料很多(比如超過了50%的資料都是無效資料),最小二乘法就 失效了,我們需要新的算法

一個簡單的例子是從一組觀測資料中找出合适的2維直線。假設觀測資料中包含局内點和局外點,其中局内點近似的被直線所通過,而局外點遠離于直線。簡單的最 小二乘法不能找到适應于局内點的直線,原因是最小二乘法盡量去适應包括局外點在内的所有點。相反,RANSAC能得出一個僅僅用局内點計算出模型,并且概 率還足夠高。但是,RANSAC并不能保證結果一定正确,為了保證算法有足夠高的合理機率,我們必須小心的選擇算法的參數。

PCL采樣一緻性算法
PCL采樣一緻性算法

                                   左圖:包含很多局外點的資料集                                           右圖:RANSAC找到的直線(局外點并不影響結果)

概述

    RANSAC算法的輸入是一組觀測資料,一個可以解釋或者适應于觀測資料的參數化模型,一些可信的參數。

    RANSAC通過反複選擇資料中的一組随機子集來達成目标。被選取的子集被假設為局内點,并用下述方法進行驗證:

    1.有一個模型适應于假設的局内點,即所有的未知參數都能從假設的局内點計算得出。

    3.如果有足夠多的點被歸類為假設的局内點,那麼估計的模型就足夠合理。

    4.然後,用所有假設的局内點去重新估計模型,因為它僅僅被初始的假設局内點估計過。

    5.最後,通過估計局内點與模型的錯誤率來評估模型。

算法

    僞碼形式的算法如下所示:

輸入:

data —— 一組觀測資料

model —— 适應于資料的模型

n —— 适用于模型的最少資料個數

k —— 算法的疊代次數

t —— 用于決定資料是否适應于模型的閥值

d —— 判定模型是否适用于資料集的資料數目

輸出:

best_model —— 跟資料最比對的模型參數(如果沒有找到好的模型,傳回null)

best_consensus_set —— 估計出模型的資料點

best_error —— 跟資料相關的估計出的模型錯誤

iterations = 0

best_model = null

best_consensus_set = null

best_error = 無窮大

while ( iterations < k )

    maybe_inliers = 從資料集中随機選擇n個點

    maybe_model = 适合于maybe_inliers的模型參數

    consensus_set = maybe_inliers

    for ( 每個資料集中不屬于maybe_inliers的點 )

        if ( 如果點适合于maybe_model,且錯誤小于t )

            将點添加到consensus_set

    if ( consensus_set中的元素數目大于d )

        已經找到了好的模型,現在測試該模型到底有多好

        better_model = 适合于consensus_set中所有點的模型參數

        this_error = better_model究竟如何适合這些點的度量

        if ( this_error < best_error )

            我們發現了比以前好的模型,儲存該模型直到更好的模型出現

            best_model =  better_model

            best_consensus_set = consensus_set

            best_error =  this_error

    增加疊代次數

傳回 best_model, best_consensus_set, best_error

(2)最小中值法(LMedS)

LMedS的做法很簡單,就是從樣本中随機抽出N個樣本子集,使用最大似然(通常是最小二乘)對每個子集計算模型參數和該模型的偏差,記錄該模型參 數及子集中所有樣本中偏差居中的那個樣本的偏差(即Med偏差),最後選取N個樣本子集中Med偏差最小的所對應的模型參數作為我們要估計的模型參數。

在PCL中sample_consensus子產品支援的幾何模型

SACMODEL_TORUS - not implemented yet

SACMODEL_PARALLEL_LINES - not implemented yet

(2)PCL中Sample_consensus子產品及類的介紹

PCL中Sample_consensus庫實作了随機采樣一緻性及其泛化估計算法,例如平面,柱面,等各種常見的幾何模型,用不同的估計算法和不同的幾何模型自由的結合估算點雲中隐含的具體幾何模型的系數,實作對點雲中所處的幾何模型的分割,線,平面,柱面 ,和球面都可以在PCL 庫中實作,平面模型經常被用到常見的室内平面的分割提取中, 比如牆,地闆,桌面,其他模型常應用到根據幾何結構檢測識别和分割物體中,一共可以分為兩類:一類是針對采樣一緻性及其泛化函數的實作,一類是幾個不同模型的具體實作,例如:平面,直線,圓球等

pcl::SampleConsensusModel< PointT >是随機采樣一緻性估計算法中不同模型實作的基類,所有的采樣一緻性估計模型都繼承與此類,定義了采樣一緻性模型的相關的一般接口,具體實作由子類完成,其繼承關系:

PCL采樣一緻性算法

類成員的介紹

SampleConsensusModel類的構造函數,cloud為輸入點雲對象的指針,indices為算法使用點雲索引向量,如果設定random=true則用目前時間初始化随機化函數的種子否則使用12345作為種子

virtual void 

擷取一組随機采樣點資料以點雲中點的索引方式存儲到samples,iterations為疊代次數

virtual bool 

純虛函數檢查給定的點雲索引樣本samples能否一個有效的模型,

優化初始估計的模型參數,inliers設定的局内點,model_coefficients初始估計的模型的系數,optimized_coefficients優化後的模型系數

計算點雲中所有點到給定模型中model_coefficients的距離,存儲到distances

從點雲中選擇所有到給定模型model_coefficients的距離小于給定的閥值 threshold 的點為局内點,inliers存儲最終輸出的局内點

virtual int 

統計點雲到給定模型model_coefficients距離小于閥值的點的個數

将局内點inliner投影到model_coefficients上建立一組新的點雲projected_points,

        (太多了  太耽誤時間了)**************************

(2)pcl::SampleConsensus< T > 是采樣一緻性算法的基類

其中model設定随機采樣性算法使用的模型,threshold 閥值 

void 

Set the Sample Consensus model to use.

Set the distance to model threshold.

double 

Get the distance to model threshold, as set by the user.

Set the maximum number of iterations.

int 

Get the maximum number of iterations, as set by the user.

Set the desired probability of choosing at least one sample free from outliers.

Obtain the probability of choosing at least one sample free from outliers, as set by the user.

Compute the actual model.

Refine the model found.

Get a set of randomly selected indices.

(3)pcl::RandomizedMEstimatorSampleConsensus< PointT > 實作了RANSAC算法,RANSAC算法适用與處理資料點中局内點比例比較大的情況,科快速的進行局外點的剔除。

class  pcl::SampleConsensusModelCircle2D< PointT >實作采樣一緻性 計算二位平面圓周模型

class  pcl::SampleConsensusModelCone< PointT, PointNT >  實作采樣一緻性計算的三維椎體模型

太多了

class  

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_least_median_squares.html">pcl::LeastMedianSquares&lt; PointT &gt;</a>

LeastMedianSquares represents an implementation of the LMedS (Least Median of Squares) algorithm.

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_maximum_likelihood_sample_consensus.html">pcl::MaximumLikelihoodSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_m_estimator_sample_consensus.html">pcl::MEstimatorSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_progressive_sample_consensus.html">pcl::ProgressiveSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_random_sample_consensus.html">pcl::RandomSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_randomized_m_estimator_sample_consensus.html">pcl::RandomizedMEstimatorSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_randomized_random_sample_consensus.html">pcl::RandomizedRandomSampleConsensus&lt; PointT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_sample_consensus_model_normal_parallel_plane.html">pcl::SampleConsensusModelNormalParallelPlane&lt; PointT, PointNT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_sample_consensus_model_normal_sphere.html">pcl::SampleConsensusModelNormalSphere&lt; PointT, PointNT &gt;</a>

<a href="http://docs.pointclouds.org/trunk/classpcl_1_1_sample_consensus_model_parallel_line.html">pcl::SampleConsensusModelParallelLine&lt; PointT &gt;</a>

代碼執行個體 random_sample_consensus.cpp

運作結果:

在沒有任何參數的情況下,三維視窗顯示建立的原始點雲(含有局内點和局外點),如圖所示,很明顯這是一個帶有噪聲的菱形平面,噪聲點是立方體,自己要是我們在産生點雲是生成的是随機數生在(0,1)範圍内。

./random_sample_consensus

PCL采樣一緻性算法

./random_sample_consensus -f

PCL采樣一緻性算法

./random_sample_consensus -sf

PCL采樣一緻性算法

 未完待續****************************************************8

繼續閱讀