PCL(Point Cloud Library)における、VoxelGridとApproximateVoxelGridの違いをまとめました。

【PCL】VoxelGridとApproximateVoxelGridの違い

点群を扱う際に、計算コストを減らすために、点の数を減らすダウンサンプリングをよく適用します。具体的には、空間をボクセルグリッドで区切り、各グリッド内の点群を近似することで、点の数を減らすのが一般的です。この機能に関して、PCLには、VoxelGridとApproximateVoxelGridという2つの似たクラスが用意されています。この2つは、名前も挙動も似ていて、違いがわかりづらいです。

これを踏まえ、この記事では、PCLにおけるVoxelGridとApproximateVoxelGridの違いをまとめていきます。

違いはズバリ...

  • VoxelGrid
    • グリッド内の点群をその重心で近似する
    • 点の数が大幅に減る
  • ApproximateVoxelGrid
    • グリッド内の点群を”凝縮する”
    • 点の数はほぼ減らない

VoxelGridの実装例

#include <pcl/filters/voxel_grid.h>
/* ~(略)~ */
void Downsampling(pcl::PointCloud<pcl::PointXYZ>::Ptr pc_in, pcl::PointCloud<pcl::PointXYZ>::Ptr pc_out, double leafsize)
{
	pcl::VoxelGrid<pcl::PointXYZ> vg;
	vg.setInputCloud(pc_in);
	vg.setLeafSize(leafsize, leafsize, leafsize);
	vg.filter(*pc_out);
}
/* ~(略)~ */

ApproximateVoxelGridの実装例

#include <pcl/filters/approximate_voxel_grid.h>
/* ~(略)~ */
void ApproximateDownsampling(pcl::PointCloud<pcl::PointXYZ>::Ptr pc_in, pcl::PointCloud<pcl::PointXYZ>::Ptr pc_out, double leafsize)
{
	pcl::ApproximateVoxelGrid<pcl::PointXYZ> avg;
	avg.setInputCloud(pc_in);
	avg.setLeafSize(leafsize, leafsize, leafsize);
	avg.filter(*pc_out);
}
/* ~(略)~ */

まとめ

点の数を減らしたい場合は、基本的に、VoxelGridを使えば問題ありません。ApproximateVoxelGridの用途は、正直よく分かりません。

ダウンサンプリングの関連記事

【PCL】VoxelGrid実装時の注意点

さいごに

PCLにおけるVoxelGridとApproximateVoxelGridの違いをまとました。参考になれば幸いです。


以上です。

Ad.