仕事で点群を使っているのでまとまった時間があるときに読もうとしている。
まずはボクセル化から。点群を減らすよりは、均一に並べるために使った事が多い。
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を使用した。
元の点群
ボクセル化後の点群。点群の数が減って、間隔が均等になっている。
教科書ではOpen3DとPythonでやっているが、PCLとC++に比べると記述少なくて良い。
実質、この2行で終わってる。
pcd = o3d.io.read_point_cloud(filename) downpcd = pcd.voxel_down_sample(voxel_size=s)
pcl::PointCloud<pcl::PointXYZRGB> みたいなのを書かなくて良い。本番機へのデプロイ(とその後のメンテ)が無ければPythonで点群アルゴリズム考えるのも良いなと思った。