体素栅格对点云下采样(从基础写起)——源码解析C++

本文详细介绍了点云下采样的基础概念,特别是使用体素栅格进行滤波的方法。通过将点云空间划分为小格子,对每个格子内的点进行平均或加权平均处理,以减少点云数量同时尽量保留原始信息。代码解析部分展示了如何实现这一过程,包括获取点云包围盒和处理点云数据的步骤。

在这里插入图片描述

一、前言
所谓下采样是对点云的一种滤波,目的是减少点云数目由尽可能保持点云原有状态,从而减少计算量。
所谓体素栅格是将点云空间划分为一个个极小的格子,格子里包含几个点。
对体素栅格里面的点取平均或者加权平均,得到一个点,代替原来的几个点。
显然,栅格选的越大,滤波后点云点数越少,速度快,但是会对原来的点云过度模糊;
栅格选的越小,作用反之。

以下代码作者是
@author Tolga Birdal <tbirdal AT gmail.com>
看了一晚上搞明白,解释一下
二、代码实现
输入点云pc,提前计算好点云的包围盒子(三坐标边界点保存在xrange[2])
这个mat型的pc,pc.rows,代表点数pc.cols为6(点坐标及法线方向)

Mat samplePCByQuantization(Mat pc, float xrange[2], float yrange[2], float zrange[2], float sampleStep, int weightByCenter)
{
   
   
  std::vector< std::vector<int> > map;
//map.size()为体素栅格个数
//map[i].size()为当前体素栅格包含的点数,里面存的是pc的点索引
  int numSamplesDim = (int)(1.0/sampleStep);
//numSamplesDim:采样个数。sampleStep:相对采样长度
//sampleStep×D=实际采样距离
//同时,D/实际采样距离=采样个数=numSamplesDim
  float xr = xrange[1] - xrange[0];//包围盒子的边长
  float yr = yrange[1] - yrange[0];
  float zr = zrange[1] - zrange[0];

  int numPoints = 0;

  map.resize((numSamplesDim+1)*(numSamplesDim+1)*(numSamplesDim+1));
//此处resize的是map的size,表示体素栅格的个数
//map.size():体素栅格的个数

  // OpenMP might seem like a good idea, but it didn't speed this up for me
  //#pragma omp parallel for
  for (int i=0; i<pc.rows; i++)//遍历pc中每一个点i
  {
   
   
    const float* point = pc.ptr<float>(i);
//定义指针* point指向pc的第i个元素(六维)
    // quantize a point
//  xr/numSamplesDim=xr×sampleStep=实际采样距离
//(point[0]-xrange[0])/实际采样距离:代表当前坐标point[0]在第(int) 几个采样距离处
    const int xCell =(int) ((float)numSamplesDim*(point[0]-xrange[0])/xr);
    const int yCell =
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值