点云滤波之使用VoxelGrid滤波器对点云进行下采样

本文目的

使用 VoxelGrid 滤波器(体素化网格滤波器)对含有大量点的点云进行下采样,方便后续处理。

最近采集点云数据,需要很高的分辨率和精度(大概0.1mm),就使用了号称是世界上精度和分辨率最高的 photoneo 深度相机:

img

采集一张点云图的大小,就达到了即将100MB的大小:

img

在后续使用 semantic-segmentation-editor点云标注工具 的时候根本操作不了或者异常卡顿:

img

能读取,但是卡死

所以点云降采样的需求就来了,使用体素化网格方法实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。

Get Started

原理

PCL实现的 VoxelGrid 类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即三维立方体)内,用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。

代码

#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)
{
    std::string pcd_read_in_path = argv[1];
    std::string pcd_write_out_path = argv[2];

    pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());

    // Fill in the cloud data
    pcl::PCDReader reader;
    // Replace the path below with the path where you saved your file
    reader.read(pcd_read_in_path, *cloud);

    std::cerr << "点云滤波前:" << cloud->width * cloud->height
              << " data points (" << pcl::getFieldsList(*cloud) << ")." << std::endl;

    // Create the filtering object
    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
    sor.setInputCloud(cloud);
    sor.setLeafSize(0.01f, 0.01f, 0.01f);
    sor.filter(*cloud_filtered);

    std::cerr << "点云滤波后:" << cloud_filtered->width * cloud_filtered->height
              << " data points (" << pcl::getFieldsList(*cloud_filtered) << ")." << std::endl;

    pcl::PCDWriter writer;
    writer.write(pcd_write_out_path, *cloud_filtered,
                 Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);

    return (0);
}

CMakeLists.txt 文件如下:

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})

编译运行,

img

原点云含有约318万个点,经过降采样后保留了约11万个点,而且很好保留了原点云的特征:

img

👆原点云图

img

👆降采样后的点云图

img

👆局部放大
链图片转存中…(img-hn4JFDPi-1667478255725)]

👆降采样后的点云图

[外链图片转存中…(img-JLqkiOeG-1667478255726)]

👆局部放大

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值