PCLライブラリでのポイントクラウドフィルタリングの概要

 

 パスフィルター

// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.0, 1.0);
//pass.setFilterLimitsNegative(true);
pass.filter(*cloud_filtered);

 ボクセルフィルター

// 创建过滤对象 
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
  sor.setInputCloud(cloud);
  sor.setLeafSize(0.01f,0.01f,0.01f);
  sor.filter(*cloud_filtered);

 統計フィルター

  // 创建过滤对象 
  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
  sor.setInputCloud(cloud);
  sor.setMeanK(50);
  sor.setStddevMulThresh(1.0);
  sor.filter(*cloud_filtered);

RADIUSフィルター

// 构建过滤器 
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.8);
outrem.setMinNeighborsInRadius(2);
// apply filter 
outrem.filter(*cloud_filtered);

明らかに、さまざまなフィルターのフィルタリングプロセスでは、常に最初にオブジェクトが作成され、次にオブジェクトパラメーターが設定され、最後にフィルター関数が呼び出されてポイントクラウドが処理されます(ポイントクラウドはスマートポインターが指す領域です)。 。

フルコールメソッド:

例として統計フィルターを取り上げます。PreProcess関数の関数本体を上記の統計フィルターの内容に置き換えます。他の写真は猫や虎のようなものです。

#include <string>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/organized.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/segmentation/impl/extract_clusters.hpp>
#include <pcl/features/don.h>
#include <pcl/visualization/pcl_visualizer.h>//for visualization
#include <pcl/filters/radius_outlier_removal.h>

using namespace pcl;
using namespace std;

PointCloud<PointXYZI>::Ptr PreProcess(PointCloud<PointXYZI>::Ptr cloud, float thre0, int thre1)
{
    cout<<"thre0 = "<<thre0<<endl;
    cout<<"thre1 = "<<thre1<<endl;
    pcl::RadiusOutlierRemoval<pcl::PointXYZI> outrem;
    outrem.setInputCloud(cloud);
    outrem.setRadiusSearch(thre0);
    outrem.setMinNeighborsInRadius(thre1);
    // apply filter 
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new PointCloud<PointXYZI>);
    outrem.filter(*cloud_filtered);
    return cloud_filtered;
}

int main(int argc, char const *argv[])
{
    float thre2 =(float)(atoi(argv[3])) / 100;//参数
    int thre3 = atoi(argv[4]);//参数
    pcl::PointCloud<pcl::PointXYZI>::Ptr sor_cloud(new pcl::PointCloud<pcl::PointXYZI>);
    pcl::io::loadPCDFile("自己的点云路径/点云名字.pcd", *Cloud);//读入点云数据

    //滤波函数
    PointCloud<PointXYZI>::Ptr result = PreProcess(sor_cloud, thre2, thre3);

    visualization::PCLVisualizer::Ptr viewer(new visualization::PCLVisualizer("Result of RegionGrowing"));

    viewer->setBackgroundColor(0, 0, 0);
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(result, "z");//按照z字段进行渲染
    viewer->addPointCloud<pcl::PointXYZI>(result, fildColor, "sample");//显示点云,其中fildColor为颜色显示
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample");//设置点云大小
    viewer->spin();
    return 0;
}

おすすめ

転載: blog.csdn.net/gbz3300255/article/details/114996286