Edited at

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%に間引く