之前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);}}