之前halcon3d中是这么做的;
1,先查找点云中每个点最近第15个最近点的距离
2,将距离进行排序
3,求排序后在距离数组70%位置的距离 d
4,筛选点云中每个点半径为d,近邻点的数量大于14的点
用pcl实现的代码如下(我是个中年pcl小学生,有更好 的方法的大佬,请留言)
#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <pcl/pcl_config.h>
#include<pcl/io/ply_io.h>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
#include<pcl/visualization/cloud_viewer.h>
#include<pcl/visualization/pcl_visualizer.h>
#include<pcl/filters/passthrough.h>
#include<pcl/filters/voxel_grid.h>
#include<pcl/filters/radius_outlier_removal.h>
#include<pcl/features/normal_3d.h>
#include<pcl/filters/statistical_outlier_removal.h>
#include<pcl/common/common.h>
#include "tolls.h"
using namespace std;int main(int argc, char* argv)
{pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);std::string filename = "D:\\Desktop\\pacl_learning\\pointcloud\\table\\table_scene_mug_stereo_textured.pcd";pcl::io::loadPCDFile(filename, *cloud);cout << cloud->points.size() << endl;vector<int> a;pcl::removeNaNFromPointCloud(*cloud, *cloud, a);cout << cloud->points.size() << endl;pcl::search::KdTree < pcl::PointXYZRGB > tree;tree.setInputCloud(cloud);vector<float> max_distance_15;for (int i=0;i<cloud->points.size();i++){vector<int> indexs;vector<float> distacne_s;tree.nearestKSearch(cloud->points[i],15,indexs,distacne_s);auto max_it = std::max_element(distacne_s.begin(), distacne_s.end());max_distance_15.push_back(sqrt(*max_it));//cout << *max_it << endl;}int length1 = max_distance_15.size();cout << length1 << endl;cout << max_distance_15[length1-1] << endl;std::sort(max_distance_15.begin(), max_distance_15.end());cout << max_distance_15[length1 - 1] << endl;float distance_thr = max_distance_15[int(length1*0.7)];cout << distance_thr << endl;//开始做半径滤波//初始化一个接受点云pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filter(new pcl::PointCloud<pcl::PointXYZRGB>);pcl::RadiusOutlierRemoval<pcl::PointXYZRGB> r_filter;r_filter.setInputCloud(cloud);r_filter.setRadiusSearch(distance_thr);r_filter.setMinNeighborsInRadius(14);r_filter.filter(*cloud_filter);//cout << "滤波后点云的数量--" << cloud_filter->points.size() << endl;pcl::visualization::PCLVisualizer::Ptr show(new pcl::visualization::PCLVisualizer(""));show->setBackgroundColor(0.1, 0.1, 0.1);pcl::visualization::PointCloudColorHandlerRGBField < pcl::PointXYZRGB > rgb(cloud_filter);show->addPointCloud(cloud, rgb, "cloud_normal");show->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "cloud_normal");show->addCoordinateSystem(0.5);while (!show->wasStopped()){show->spinOnce(100);}}