C++
PCL
pointcloudlibrary
STL

PCLでpoint cloud中の点をランダムに間引く

More than 3 years have passed since last update.

厳密ではないが,お手軽に点を間引きたい時に便利.

アイデア

cloud->points の実態はstl::vectorなので,コンテナに対する std::remove_if を適用する.
operator() が呼び出された時にランダムでTrue/Falseを返すクラスを作り,remove_if に投げる.

コード

まびく関数
#include <algorithm>

template <class T>
class isDelete
{
  float _random_sampling_percentage;
public:
  isDelete(float random_sampling_percentage)
  {
    srand((long)time(NULL)); 
    _random_sampling_percentage = random_sampling_percentage / 100.0;
  };
  bool operator() (T& val)
  {
    return (rand()/(double)RAND_MAX >= _random_sampling_percentage);
  }
};

void pointsReduction(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
                     float random_sampling_percentage)
{
  isDelete<pcl::PointXYZ> randDel( random_sampling_percentage );

  cloud->points.erase( std::remove_if(cloud->points.begin(),
                                      cloud->points.end(),
                                      randDel  ), 
                       cloud->points.end() );
}

Ptr型のcloudを与えればOK.

呼び出し
pointsReduction(cloud, 10); // 10%に間引く