体素滤波器(下采样):
体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能,但是会移动点的位置。 此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。
(1)它的原理是根据输入的点云,首先计算一个能够刚好包裹住该点云的立方体,然后根据设定的分辨率,将该大 立方体分割成不同的小立方体。对于每一个小立方体内的点,计算他们的质心,并用该质心的坐标来近似该立方体内的若干点。
(2)ApproximateVoxelGrid的不同在于这种方法是利用每一个小立方体的中心来近似该立方体内的若干点。相比于 VoxelGrid,计算速度稍快,但也损失了原始点云局部形态的精细度。
#include <iostream>
#include <pcl/filters/voxel_grid.h>//体素滤波器头文件
#include <pcl/io/pcd_io.h> //PCD 读写类相关的头文件
#include <pcl/point_types.h> //点类型相关定义
#include <pcl/visualization/cloud_viewer.h> //点云可视化相关定义 可视化支持头文件
#include <pcl/common/common.h> //common模块,common.h的函数有pcl::getMinMax3D
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>());
// 填入点云数据
pcl::PCDReader reader;
// 把路径改为自己存放文件的路径
reader.read ("D:\\pclcode\\filter\\voxel_grid\\source\\scan_003.pcd", *cloud); //读取文件夹里面的scan_003.pcd点云文件
//pcl::visualization::CloudViewer viewer("cloud viewer");//显示
//viewer.showCloud(cloud);//显示cloud
std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
<< " data points (" << pcl::getFieldsList(*cloud) << ").";//输出滤波前点的总个数
//system("pause");//暂停
// 创建滤波器对象
pcl::VoxelGrid<pcl::PointXYZ> sor;//创建滤波器对象
sor.setInputCloud (cloud);//设置输入点云
sor.setLeafSize (0.03f, 0.03f, 0.03f); //体素大小设置为3*3*3cm
sor.filter (*cloud_filtered);//执行滤波,保存过滤结果在cloud_filtered
std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
<< " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";//输出滤波后的总个数
pcl::PCDWriter writer;//pcd写操作
writer.write ("scan_003_filter.pcd", *cloud_filtered);//将滤波后的点云存储在build文件夹里,并命名为2f.pcd
//pcl::visualization::CloudViewer viewer("cloud viewer");//显示
//viewer.showCloud(cloud_filterd);//显示cloud
system("pause");//暂停
return (0);
}
//请按任意键继续. . .
//there are 2057209 points before filtering.
//there are 395805 points after filtering.
//请按任意键继续. . .
CmakeLists文件如下:具体的点云文件可以根据自己的需要自行选择
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(voxel_grid)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (voxel_grid voxel_grid.cpp)
target_link_libraries (voxel_grid ${PCL_LIBRARIES})
具体的颜色信息可以自己用可视化进行修改,这里我就不进行修改了
滤波前
滤波后