体素滤波器可以达到向下采样同时不破坏点云本身几何结构的功能,但是会移动点的位置。
此外体素滤波器可以去除一定程度的噪音点及离群点。主要功能是用来进行降采样。
(1)它的原理是根据输入的点云,首先计算一个能够刚好包裹住该点云的立方体,然后根据设定的分辨率,将该立方体分割成不同的小立方体。类似于octree里的立方体划分,对于每一个小立方体内的点,计算他们的质心(重心),并用该质心的坐标来近似该立方体内的若干点。
(2)ApproximateVoxelGrid的不同在于这种方法是利用每一个小立方体的中心来近似该立方体内的若干点。相比于 VoxelGrid,计算速度稍快,但也损失了原始点云局部形态的精细度。
原理不多讲,直接上代码:
c++代码如下:
#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\\table_scene_lms400.pcd", *cloud); //读取文件夹里面的table_scene_lms400.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.01f, 0.01f, 0.01f);//体素大小设置为10*10*10cm
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 ("2f.pcd", *cloud_filtered);//将滤波后的点云存储在build文件夹里,并命名为2f.pcd
//pcl::visualization::CloudViewer viewer("cloud viewer");//显示
//viewer.showCloud(cloud_filterd);//显示cloud
system("pause");//暂停
return (0);
}
//PointCloud before filtering : 460400 data points(x y z).
//PointCloud after filtering : 41049 data points(x y z).
//请按任意键继续. . .
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})
具体的执行结果如下(在cloudcompare中查看):ps:试着用cloudviewer在c++代码中实现,但没成功
滤波前
滤波后