ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

点群のボクセル化

仕事で点群を使っているのでまとまった時間があるときに読もうとしている。

www.kspub.co.jp

まずはボクセル化から。点群を減らすよりは、均一に並べるために使った事が多い。

PCLで同じように書いてみる。

#include <string>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int main()
{
    const std::string original_file = "/home/natu/gitproj/3dpcp_book_codes/3rdparty/Open3D/examples/test_data/fragment.ply";

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr p_src(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::io::loadPLYFile(original_file, *p_src);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr p_dst(new pcl::PointCloud<pcl::PointXYZRGB>);

    pcl::VoxelGrid<pcl::PointXYZRGB> vg;
    vg.setInputCloud(p_src);
    vg.setLeafSize(0.03, 0.03, 0.03);
    vg.filter(*p_dst);

    pcl::io::savePLYFile("voxeled.ply", *p_dst);

    return 0;
}

結果はこんな感じでボクセル化できている。点群の表示はCloudCompareを使用した。

www.danielgm.net

元の点群

ボクセル化後の点群。点群の数が減って、間隔が均等になっている。

教科書ではOpen3DとPythonでやっているが、PCLとC++に比べると記述少なくて良い。

github.com

実質、この2行で終わってる。

pcd = o3d.io.read_point_cloud(filename)
downpcd = pcd.voxel_down_sample(voxel_size=s)

pcl::PointCloud<pcl::PointXYZRGB> みたいなのを書かなくて良い。本番機へのデプロイ(とその後のメンテ)が無ければPythonで点群アルゴリズム考えるのも良いなと思った。