ランダム一貫性サンプリング RANSAC

PCL 公式ウェブサイト参考:ランダム サンプル コンセンサス モデルの使用方法 — PCL

1. RANSAC の概要

RANSAC ( RA ndom  SAmple Consensus 、Random Sampling Consensus) アルゴリズムは、「外れ値」を含むデータのセットから数学的モデルの パラメーターを正しく推定するための反復アルゴリズムです。「外れ値」とは通常、マッチングの不一致や推定曲線の外れ値など、データ内のノイズを指します。したがって、RANSAC は「外れ値」検出アルゴリズムでもあります。RANSAC アルゴリズムは不確実なアルゴリズムであり、1 つの確率の下でのみ結果を生成でき、この確率は反復回数が増加するにつれて増加します。

  • 基本的な前提:データは「内側の点」と「外側の点」で構成されます。「インライア」はモデルのパラメータを構成するデータであり、「アウトライア」はモデルに適合しないデータです。もう 1 つの必要な前提は、RANSAC がデータから選択されたモデル パラメーターを最適に推定できるということです。

2. アルゴリズムの基本的な考え方とプロセス

2.1 RANSAC アルゴリズムのプロセス

RANSAC は、データ セットを繰り返し選択してモデルを推定し、より良いモデルが推定されるまで反復します。
具体的な実装手順は次の手順に分けることができます。

  1. モデルを推定できる最小のデータセットを選択します (直線フィッティングの場合は 2 点、ホモグラフィー行列の計算の場合は 4 点です)。
  2. このデータセットを使用してデータモデルを計算します。
  3. すべてのデータをこのモデルに取り込み、「インライア」の数を計算します (特定の誤差範囲内で現在の反復ロールアウト モデルに適したデータを蓄積します)。
  4. 現在のモデルと以前に起動された最良のモデルの「内部ポイント」の数を比較し、「内部ポイント」の数が最も多かったモデル パラメーターと「内部ポイント」の数を記録します。
  5. 反復が終了するか、現在のモデルが十分に良好になる (「内部点の数が特定の数を超える」) まで、手順 1 ~ 4 を繰り返します。

2.2 RANSACアルゴリズムの長所と短所

  • RANSAC の利点の 1 つは、モデル パラメーターのロバストな推定が可能になることです。つまり、データセット内に多数の外れ値がある場合でも、パラメーターを高い精度で推定できます。
  • RANSAC の欠点は、これらのパラメーターの計算にかかる時間に上限がないことです。限られた反復回数で計算を実行すると、得られる解は最適ではない可能性があり、データに適切に適合するものでさえない可能性があります。このように、RANSAC はトレードオフを提供し、より多くの反復を計算することで、合理的なモデルを生成する確率が増加します。RANSAC のもう 1 つの欠点は、問題固有のしきい値が必要なことです。
  • RANSAC は、特定のデータセットに対して 1 つのモデルのみを推定できます。2 つ (またはそれ以上) のモデルが存在する場合、どのモデル アプローチでも、RANSAC はそれらのいずれも見つけられない可能性があります。

3. PCLでのRANSAC利用参考例

3.1 線形モデルと球面モデルのフィッティング

参考例ランダムサンプルコンセンサスモデルの使い方 — PCL

///核心代码注释
 std::vector<int> inliers;

  // created RandomSampleConsensus object and compute the appropriated model
  pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr
    model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ> (cloud));//球模型
  pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr
    model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud));//线模型
  if(pcl::console::find_argument (argc, argv, "-f") >= 0)//判断主函数输入参数
  {
    
    //输入参数-f时为线模型model_p
    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_p);//设置RANSAC模型
    ransac.setDistanceThreshold (.01);//设置阈值
    ransac.computeModel();//迭代计算
    ransac.getInliers(inliers);//获取内点inliners
  }
  else if (pcl::console::find_argument (argc, argv, "-sf") >= 0 )
  {
    
    
    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_s);
    ransac.setDistanceThreshold (.01);
    ransac.computeModel();
    ransac.getInliers(inliers);
  }


3.2 2-2点群取得装置の自動校正

参考資料: PCL_ 「点群ライブラリPCLのエントリーからマスターまで」ルーチンより2-2点群取得装置の自動校正

おすすめ

転載: blog.csdn.net/weixin_43949950/article/details/126407831