有些点云比较大,需要进行体素滤波后才方便使用,这里收录了一个实现方法
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
int main (int argc, char** argv)
{
pcl::PCLPointCloud2::Ptr
cloud(new pcl::PCLPointCloud2());
pcl::PCLPointCloud2::Ptr
cloud_filtered(new pcl::PCLPointCloud2());
// 填入点云数据
pcl::PCDReader reader; //点云读取对象
// 把路径改为自己存放文件的路径,或者将该文件与生成的可执行文件放在同一目录下
// reader.read ("/media/jy/新加卷/pointlines数据集/00final.pcd", *cloud); // 读取点云文件中的数据到cloud对象
reader.read ("/home/jy/Desktop/2011_09_30/2011_09_30_drive_0027_sync/velodyne_points/out.pcd", *cloud); // 读取点云文件中的数据到cloud对象
std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height << " data points (" << pcl::getFieldsList(*cloud) << ")." <<std::endl;
pcl::VoxelGrid<pcl::PCLPointCloud2> sor; // 创建滤波器对象
sor.setInputCloud (cloud); //给滤波器对象设置需要过滤的点云
sor.setLeafSize (0.10f, 0.10f, 0.10f); //设置滤波时创建的体素大小为10cm立方体
sor.filter (*cloud_filtered); //执行滤波处理
std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";
//将数据写入磁盘
pcl::PCDWriter writer;
// writer.write ("/home/jy/Desktop/pcd2txt/build/00_flitered_010.pcd", *cloud_filtered, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);
writer.write ("/home/jy/Desktop/2011_09_30/2011_09_30_drive_0027_sync/velodyne_points/out_fliter.pcd", *cloud_filtered, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);
return (0);
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE "Release")
# 添加c++ 11标准支持
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
# Eigen
include_directories("/usr/include/eigen3")
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_executable (voexlfliter src/voxelfliter.cpp) #注意这里不能替换
target_link_libraries(voexlfliter ${PCL_LIBRARIES})
这个代码在网上还是可以找到挺多资源的,不再赘述,有问题可留言
溜~