点群フィルタリングの概要

1. はじめに

1、PassThrough フィルターを使用した PointCloud のフィルター処理

2、VoxelGridフィルターを使用したPointCloudのダウンサンプリング

3、StatisticalOutlierRemovalを使用して疎な外れ値を除去する

4、パラメトリックモデルを使用した点の投影

データセット:リンク: https://pan.baidu.com/s/1jR7k5iI-acVyyehKcYbetA?pwd=mr16
     抽出コード: mr16

2. コード

1、パススルーフィルター

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (-1 == pcl::io::loadPCDFile("rabbit.pcd", *cloud))
	{
		std::cout << "read pcd file error!" << std::endl;
	}
	std::cout << "cloud1 size = " << cloud->points.size() << std::endl;

	pcl::PointCloud<pcl::PointXYZ>::Ptr filter(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PassThrough<pcl::PointXYZ> pass;
	pass.setInputCloud(cloud);
	pass.setFilterFieldName("x");
	pass.setFilterLimits(-10.0f, 0.0f);
	pass.filter(*filter);
	std::cout << "filter size = " << filter->points.size() << std::endl;

	pcl::visualization::CloudViewer viewer("Cloud Viewer");
	viewer.showCloud(filter);
	while (!viewer.wasStopped())
	{
	}

	return 0;
}

 

 

2、ボクセルグリッドフィルター

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int main()
{
    pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
	pcl::PCDReader reader;
    reader.read("rabbit.pcd", *cloud);
	std::cout << "cloud size = " << cloud->data.size() << std::endl;

	pcl::PCLPointCloud2::Ptr filter(new pcl::PCLPointCloud2());
	pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
	sor.setInputCloud(cloud);
	sor.setLeafSize(0.5f, 0.5f, 0.5f);
	sor.filter(*filter);
	std::cout << "filter size = " << filter->data.size() << std::endl;

	pcl::PCDWriter writer;
	writer.write("rabbit_down.pcd", *filter, Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);

	return 0;
}

 

 

3、統計的外れ値の除去

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/statistical_outlier_removal.h>

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (-1 == pcl::io::loadPCDFile("filtered1.pcd", *cloud))
	{
		std::cout << "read pcd file error!" << std::endl;
	}
	std::cout << "cloud1 size = " << cloud->points.size() << std::endl;

	pcl::PointCloud<pcl::PointXYZ>::Ptr filter(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
	sor.setInputCloud(cloud);
	sor.setMeanK(80);
	sor.setStddevMulThresh(1.0);
	sor.filter(*filter);
	std::cout << "filter size = " << filter->points.size() << std::endl;

	pcl::visualization::CloudViewer viewer("Cloud Viewer");
	viewer.showCloud(filter);
	while (!viewer.wasStopped())
	{
	}

	return 0;
}

  

4、突起点

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/visualization/cloud_viewer.h>

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (-1 == pcl::io::loadPCDFile("filtered1.pcd", *cloud))
	{
		std::cout << "read pcd file error!" << std::endl;
	}
	std::cout << "cloud1 size = " << cloud->points.size() << std::endl;

	
	// z=0 plane
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
	coefficients->values.resize(4);
	coefficients->values[0] = coefficients->values[1] = 0;
	coefficients->values[2] = 1.0;
	coefficients->values[3] = 0;

    pcl::PointCloud<pcl::PointXYZ>::Ptr filter(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::ProjectInliers<pcl::PointXYZ> proj;
	proj.setModelType(pcl::SACMODEL_PLANE);
	proj.setInputCloud(cloud);
	proj.setModelCoefficients(coefficients);
	proj.filter(*filter);
	std::cout << "filter size = " << filter->points.size() << std::endl;

	pcl::visualization::CloudViewer viewer("Cloud Viewer");
	viewer.showCloud(filter);
	while (!viewer.wasStopped())
	{
	}

	return 0;
}

 

 

3. 参考資料

はじめに — 点群ライブラリ 0.0 ドキュメント

おすすめ

転載: blog.csdn.net/Goodness2020/article/details/132333217