processPointClouds.cpp中滤波部分我单独拿出进行学习,滤波后只考虑每一帧点云中汽车周围部分点云
原始点云如下:
滤波后点云如下:
之后在对其进行分割检测等操作,滤波代码如下:
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/crop_box.h>
#include <pcl/visualization/cloud_viewer.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read("D:\\SFND_Lidar_Obstacle_Detection\\SFND_Lidar_Obstacle_Detection\\data\\pcd\\data_1\\0000000000.pcd", *cloud);
pcl::VoxelGrid<pcl::PointXYZ> vg; //滤波对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudFiltered(new pcl::PointCloud<pcl::PointXYZ>);
vg.setInputCloud(cloud);
vg.setLeafSize(0.4, 0.4, 0.4);
vg.filter(*cloudFiltered);
//过滤掉在用户给定立方体内的点云数据
//理解:将自身车辆作为坐标轴的中心点,然后在身边自身为中心 ,圈出范围,成为每一次运动时候的感兴趣区域,也就是只关心区域内点的聚类等后续操作
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudRegion(new pcl::PointCloud<pcl::PointXYZ>);
pcl::CropBox<pcl::PointXYZ> region(true);
//Eigen::Vector4f minpoint(-10, -6.5, -2, 1);
//Eigen::Vector4f maxpoint(30, 6.5, 1, 1);
region.setMin(Eigen::Vector4f(-10, -6.5, -2, 1));
region.setMax(Eigen::Vector4f(30, 6.5, 1, 1));
region.setInputCloud(cloudFiltered);
region.filter(*cloudRegion);
//提取车身周围范围内的所有的点,并将提取到的所有点保存在indices中
std::vector<int> indices;
pcl::CropBox<pcl::PointXYZ> roof(true);
roof.setMin(Eigen::Vector4f(-1.5, -1.7, -1, 1));
roof.setMax(Eigen::Vector4f(2.6, 1.7, -0.4, 1));
roof.setInputCloud(cloudRegion);
roof.filter(indices);
pcl::PointIndices::Ptr inliers{ new pcl::PointIndices }; //创建一个内点对象,将提取到车身周围点,放到内点对象中
for (int point : indices)
{
inliers->indices.push_back(point);
}
//创建点云提取函数
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloudRegion);
extract.setIndices(inliers);
extract.setNegative(true); //false 提取内点也就是提取车身周围的几个点,, true提取出了车身周围的点
extract.filter(*cloudRegion);
/*pcl::PCDWriter writer;
writer.write("C:\\Users\\Administrator\\Downloads\\求助\\求助\\tree-2-Rend.pcd", *cloud_filtered1);*/
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("显示窗口")); //窗口显示点云
viewer->addPointCloud(cloudRegion, "*cloud");
viewer->resetCamera(); //相机点重置
viewer->spin();
system("pause");
return (0);
}