ぱたへね

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

点群の外れ値除去

詳解 3次元点群処理にOpen3Dでの外れ値除去が載っていたのでPCLでもやってみた。

www.kspub.co.jp

StatisticalOutlierRemovalのサンプル通りで動く。

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

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

    pcl::PointCloud<pcl::PointXYZ>::Ptr pc_src(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPLYFile(original_file, *pc_src);
    pcl::PointCloud<pcl::PointXYZ>::Ptr pc_inliers(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr pc_outliers(new pcl::PointCloud<pcl::PointXYZ>);

    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
    sor.setInputCloud(pc_src);
    sor.setMeanK(50);
    sor.setStddevMulThresh(3);
    sor.filter(*pc_inliers);
    pcl::io::savePLYFile("inliers.ply", *pc_inliers);

    //外れ値だけ選ぶ
    sor.setNegative(true);
    sor.filter(*pc_outliers);

    //色を付けて保存
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr pc_outliers_rgb(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::copyPointCloud(*pc_outliers, *pc_outliers_rgb);

    for (auto it=pc_outliers_rgb->begin();it!=pc_outliers_rgb->end();++it) {
        it->r = 255;
        it->g = 0;
        it->b = 0;
    }
    pcl::io::savePLYFile("outliers.ply", *pc_outliers_rgb);

    return 0;
}

パラメータの調整が手こずったが、だいたい本と同じような結果になった。