PCL学習:復興多項式滑らかな表面の法線点群に基づいて推定

I.多項式表面の点群に基づいて、推定通常リビルドを平滑化

ここでは、移動最小二乗(MLS)推定、平滑化と点群データのリサンプリングに基づいて、法線が記載されています。時々、それは、小さなオブジェクトの測定に直接使用し、その後する表面の再構成が脆弱性を平滑化又は持っていない場合は表面再構成に起因するこれらの不規則なデータエラーをいくつかのエラーを生成します。表面の完全なモデルを構築するために、平滑化とバグ修正されなければならないので、排除するために統計的分析を使用してこれらの凹凸は難しいです。追加のスキャンの場合にはできない、我々はデータのリサンプリング、表面の欠落部分を再構成する高次多項式補間の周囲のデータポイントのためのリサンプリングアルゴリズムにより、この問題を解決することができます。さらに、走査スポットの複数の表面再構成は、人工ダミーデータのような「二重壁」を有するかどう直接使用して得られた後、登録データをスキャンし、すなわち、二つの面と重なるブロック領域が表示されます。リサンプリングアルゴリズムは、この問題に処理することができます。

_images / resampling_1.jpg
結果を推定する通常図1

_images / resampling_2.jpg

図2、図の曲率

結果1つの左、登録エラーがあっても、同一平面上の点の集合で、通常のノイズによって引き起こされるので、図の推定で得られたデータセットと点群データセットの表面法線であり、これは法線方向と厳密に一致しない、右側が大きく、より正確で、左より一貫した推定ポイントクラウドを介して得られた同じデータセットの正常な結果であり、次いで、平滑化。および定量的測定のためにリサンプリングした後、我々は、図と一致2を与えるために、曲率の各点のデータセットをプロットした結果を可視化する前に特性を曲率に、大きな曲率特性分散処理、平滑化の変動を平滑化前より小さな。

二つ、クラスPCL :: MovingLeastSquares <PointlnT
、PointOutT> クラスは、点群平滑化に基づいて最小二乗アルゴリズムを移動MovingLeastSquares、リサンプリングデータを実装し、点群データが入力される推定通常の最適化を計算することができ、出力されますユーザ以降の処理に対応するパラメータの後に得られた平滑リサンプリング点群を設定します。
クラスMovingLeastSquares主要メンバ関数:

  • 無効setPolynomialOrder(int型の順)

順序は、計算に用いた多項式フィット順序を使用して提供されている場合。

  • 空SE tPolynomia!フィット(ブールpolynomial_fit)

、または唯一の推定接線で通常時の概算見積りの多項式フィットを使用するかどうかを設定し、フィットパラメータがYesに設定されている事実であるpolynomial_。

  • 空setComputeNormals(ブールcompute_normals)

点群を算出し、Yesに真compute_法線に設定されている通常のパラメータに対応する記憶されているか否かを設定します。

  • 空setSearchRadius(ダブル半径)

決定された近隣点多項式が使用される場合のk最近傍検索半径使用され、検索半径の半径を設定します。

  • 空setSqrGaussParam(ダブルsqr_gauss_param)

ガウス重み係数設定隣接sqr_ gauss_のPARAMは、一般的に設けられた場合に最高の検索の半径の二乗。

  • 空setUのpsamplingMethod(U psamplingMethod方法)

サンプリングアルゴリズム方法、4つの方法の合計を設定します。

  1. NONE:サンプリング後ポイントは直接サンプルを得るために、最小二乗適合面によって原点に投影されていません。
  2. SAMPLE_LOCAL_面は:サンプルセットパラメータ半径(upsampling_radius)によれば、地域内の近傍定義された円の外平面におけるパラメータの反復(upsampling_ステップ)ステップをサンプリングし、円は、投影面に取り付けられ、その後、離散得られたサンプリング点をサンプリングします。
  3. 均一点密度を奪う点を設定することにより定義された局所近傍の平面における、およびその後のサンプルを得るために、嵌合面に投影:RANDOM_UNIFORM_DENSITY。
  4. VOXEL_GRID_DILATION:拡張プロセスにおいて、元のポイントクラウド処理ボクセル空間、および(拡張_反復_num)膨張のボクセル数ボクセルパラメータを設定することによって拡張パラメータ(voxel_size)、曇り点を設定することにより、ボクセルサイズではありませんボクセルグリッドは、また、サンプリング後の最終的なポイントを与えるために、曇り点で満たされています。
  • 空setUpsamplingRations(ダブル半径)

半径はSAMPLE_LOCAL_PLANE Oのために、サンプル半径上に設けられています

  • 空setUpsamplingStepSize(ダブルstep_size)

SAMPLE_LOCAL_PLANEのために、サンプリングの繰り返しのstep_sizeを設定します。

  • 空setPointDens ITY(int型希望」num_のpoints_in_radius)

RANためのサンプリング密度セットポイントdesired_ num_ points_ IN_半径)M_ UNIFORM_ENSITY。

  • 空setDilationVoxelSize(フロートボクセルサイズ)

VOXEL_GRID_DILATIOため、ボクセルサイズvoxel_sizeを提供します。、。

  • 無効setDilationlterations(int型の反復)

VOXEL_GRID_DILATIONのために、反復回数に配置されたボクセルの数を拡大。

  • 無効プロセス(PointCloudOut 8>ι出力)

すべての入力ポイントクラウド表面再構成に基づいて、アルゴリズムの出力は、最小二乗表面モデルであり、出力に格納されています。

  • 仮想ボイドプロセス(PCL:PointCloud <PointOutT>&出力)

出力における入力点群、PointOutT対応する出力ポイント型テンプレートクラスパラメータを処理した結果が格納される出力します。

第三に、サンプルをテスト

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>

int
main (int argc, char** argv)
{// 将一个适当类型的输入文件加载到对象PointCloud中
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
  // 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的 
  pcl::io::loadPCDFile ("..\\..\\source\\bun0.pcd", *cloud);
  // 创建一个KD树
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
  // 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线
  pcl::PointCloud<pcl::PointNormal> mls_points;
  // 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来)
  pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  mls.setComputeNormals (true);

  //设置参数
  mls.setInputCloud (cloud);  //设置输入点云
  mls.setPolynomialFit (true);//设置在最小二乘计算中需要法线估计
  mls.setSearchMethod (tree); 
  mls.setSearchRadius (0.03); //设置搜索半径,确定多项式拟合时所用的邻域点进行k近邻搜索时所用的半径
  // 曲面重建
  mls.process (mls_points);

  // 保存结果
  pcl::io::savePCDFile ("bun0-mls.pcd", mls_points);

  return 0;
}

 

おすすめ

転載: blog.csdn.net/zfjBIT/article/details/95327306