ポイントクラウドライブラリPCL学習 - いくつかのフィルタリング方法

まず、ダウンサンプリング

ダウンサンプリングは、一般に、三次元ボクセルグリッドで構成され、そのようにボクセルの他の点の各々内の全ての点は、ボクセルが重心をで表すことができるボクセルにボクセル内の全ての点の重心のほぼ中央に表示されています、フィルタリングの効果を達成するためのサンプリングは、大幅にデータの量を減少させる、前処理として事前登録など、表面再構成に特によく走行速度を増加させることができます。

#pragma warning(disable:4996)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/pcl_visualizer.h>

int
main()
{
	// 创建点云对象
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr filteredCloud(new pcl::PointCloud<pcl::PointXYZ>);

	// 读取PCD文件
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("F:\\C++project\\pig.pcd", *cloud) != 0)
	{
		return -1;
	}
	//typedef pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZI> ColorHandlerT3;
	// 创建滤波对象
	pcl::VoxelGrid<pcl::PointXYZ> filter;
	filter.setInputCloud(cloud);
	// 设置体素栅格的大小为 2x2x2cm
	filter.setLeafSize(0.02f, 0.02f, 0.02f);
	filter.filter(*filteredCloud);
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->initCameraParameters();
	int v1(0);
	viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
	int v2(0);
	viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
	viewer->setBackgroundColor(255, 255, 255,v1);
	viewer->setBackgroundColor(255, 255, 255,v2);
	viewer->addPointCloud(filteredCloud,  "filtered_points",v1);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "filtered_points");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "filtered_points");
	viewer->addPointCloud(cloud, "input_cloud",v2);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "input_cloud");
	viewer->spin();

}

コードをコピー

第二に、均一なサンプリング

制服サンプリング:このクラスは、本質的に同じであるが、その出力点群のインデックスキーは仕方共通コンピューティング・ディスクリプタで選択されています。

	pcl::UniformSampling<pcl::PointXYZ> filter;
	filter.setInputCloud(cloud);
	filter.setRadiusSearch(0.02f);
	filter.filter(*filteredCloud);

次のようにいくつかのバージョンが使用されます。

    pcl::UniformSampling<pcl::PointXYZ> filter;
    filter.setInputCloud(cloud);
    filter.setRadiusSearch(0.01f);
    pcl::PointCloud<int> keypointIndices;
    filter.compute(keypointIndices);
    pcl::copyPointCloud(*cloud, keypointIndices.points, *filteredCloud);

私のバージョン1.8は、この関数Aを計算していません。

第三に、サンプリングによって

あなたが考えるよりはるかに少ない点群データを持っているとき、サンプリングにより、表面再構成法をサンプリングすることにより点群データの補間によって、あなたが現在持っているが、元の表面(S)を復元するためにあなたを助けることができ、その私は仮定が複雑なプロセスであると思います。だから、結果が正確で百パーセントを構築しませんが、時にはそれが代替ソリューションです。だから、あなたのサンプリングポイントにおけるので、元のデータのコピーを保存してください!

ダウンサンプリングを使用して第1のポイントクラウドは、サンプリング動作をすることにより行われます。

#pragma warning(disable:4996)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <pcl/io/pcd_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/pcl_visualizer.h>
#include<pcl/keypoints/uniform_sampling.h>
#include<pcl/surface/mls.h>


int
main()
{
	// 创建点云对象
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr filteredCloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr filteredCloud2(new pcl::PointCloud<pcl::PointXYZ>);

	// 读取PCD文件
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("F:\\C++project\\pig.pcd", *cloud) != 0)
	{
		return -1;
	}
	// 创建滤波对象
	pcl::VoxelGrid<pcl::PointXYZ> filter;
	filter.setInputCloud(cloud);
	// 设置体素栅格的大小为 2x2x2cm
	filter.setLeafSize(0.02f, 0.02f, 0.02f);
	filter.filter(*filteredCloud);	

	pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ> filter2;
	filter2.setInputCloud(filteredCloud);
	pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree;
	filter2.setSearchMethod(kdtree);
	filter2.setSearchRadius(0.03);
	filter2.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ>::SAMPLE_LOCAL_PLANE);
	// 采样的半径是
	filter2.setUpsamplingRadius(0.03);
	// 采样步数的大小
	filter2.setUpsamplingStepSize(0.02);
	filter2.process(*filteredCloud2);



	/*pcl::UniformSampling<pcl::PointXYZ> filter;
	filter.setInputCloud(cloud);
	filter.setRadiusSearch(0.02f);
	filter.filter(*filteredCloud);*/
 	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->initCameraParameters();
	int v1(0);
	viewer->createViewPort(0.0, 0.0, 0.33, 1.0, v1);
	int v2(0);
	viewer->createViewPort(0.33, 0.0, 0.66, 1.0, v2);
	int v3(0);
	viewer->createViewPort(0.66, 0.0, 1.0, 1.0, v3);

	viewer->setBackgroundColor(255, 255, 255,v1);
	viewer->setBackgroundColor(255, 255, 255,v2);
	viewer->setBackgroundColor(255, 255, 255,v3);
	viewer->addPointCloud(filteredCloud,  "filtered_points",v1);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "filtered_points");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "filtered_points");
	viewer->addPointCloud(cloud, "input_cloud",v2);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "input_cloud");
	viewer->addPointCloud(filteredCloud2, "filtered2_points", v3);
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "filtered2_points");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "filtered2_points");
	viewer->spin();
}

サンプリングによるオリジナル1. 2. 3.ダウンサンプリングした後、

おすすめ

転載: blog.csdn.net/zzh_AI/article/details/93042852