#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
//pcl::PCDReader my_reader;
//my_reader.read<pcl::PointXYZ>("E:\\vs_code\\hello_pcl\\hello_pcl\\table_scene_lms400.pcd",*my_cloud);
my_cloud->width = 1000;
my_cloud->height = 1;
my_cloud->points.resize(my_cloud->width*my_cloud->height);
for (size_t i = 0; i < my_cloud->points.size(); ++i)
{
my_cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
my_cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
my_cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
for (size_t i = 0; i < my_cloud->points.size(); ++i)
{
std::cout<<my_cloud->points[i].x<<" "
<<my_cloud->points[i].y<<" "
<<my_cloud->points[i].z<<std::endl;
}
pcl::RadiusOutlierRemoval<pcl::PointXYZ> routrem;
routrem.setInputCloud(my_cloud);
routrem.setRadiusSearch(100);
routrem.setMinNeighborsInRadius(3);
routrem.filter(*my_cloud_filtered);
std::cout<<"输入的点云个数: "<<my_cloud->points.size()<<std::endl;
std::cout<<"输出的点云个数: "<<my_cloud_filtered->points.size()<<std::endl;
pcl::visualization::PCLVisualizer my_viewer1;
pcl::visualization::PCLVisualizer my_viewer2;
my_viewer1.addPointCloud(my_cloud);
my_viewer2.addPointCloud(my_cloud_filtered);
while(!my_viewer1.wasStopped())
{
my_viewer1.spinOnce(100);
my_viewer1.spinOnce(100);
}
return (0);
}
虽然代码不多,但是还是遇到了一些坑,这里做个简单的记录,写写心得
pcl::RadiusOutlierRemoval<pcl::PointXYZ> routrem;
routrem.setInputCloud(my_cloud);
routrem.setRadiusSearch(100);
routrem.setMinNeighborsInRadius(3);
routrem.filter(*my_cloud_filtered);
这一块就是核心的内容了,依旧是设置点云、计算结果,不同之处就是设置了:搜索半径范围、半径内最小的点数,就是说:在设置的100的半径范围内,对于临近点少于3个的点,进行去除
这里记录一点心得,起初我是按照别人的教程来的,设置的搜索半径太小,记得是0.3吧,然后运行好几次都没有点显示,最后我就加了循环,看看生成的点的半径是什么样子,这确实是一个调试的好方法,及时看看输出的结果!
另外的话,可以看到,我每次都是利用可视化把结果显示了,我觉得这也是一个很好的调试方法
最后放一下输出的结果