PCL——(8)从点云数据生成深度图像

文章目录

  • 一、深度图像的获取方法
  • 二、深度图像简介
  • 三、PCL中的模块RangeImage相关类的介绍
    • 3.1 class pcl::RangeImage
    • 3.2 class pcl::RangeImagePlanner
    • 3.3 从点云数据生成深度图像

一、深度图像的获取方法

目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基于不同视点的多幅深度图像的配准技术,基于深度数据的三维重建技术,基于三维深度图像的三维目标识别技术,深度图像的多分辨率建模和几何压缩技术等等,在PCL 中深度图像与点云最主要的区别在于 其近邻的检索方式的不同,并且可以互相转换。

二、深度图像简介

深度图像(Depth Images)也被称为距离影像(Range Image),是指将从图像采集器到场景中各点的距离值作为像素值的图像,它直接反应了景物可见表面的几何形状,利用它可以很方便的解决3D目标描述中的许多问题,深度图像经过点云变换可以计算为点云数据,有规则及有必要信息的点云数据可以反算为深度图像数据。
在这里插入图片描述不同视角获得深度图像的过程:
PCL——(8)从点云数据生成深度图像_第1张图片

三、PCL中的模块RangeImage相关类的介绍

pcl_range_image库中包含两个表达深度图像和对深度图像进行操作的类,其依赖于pcl::common模块,深度图像(距离图像)的像素值代表从传感器到物体的距离以及深度, 深度图像是物体的三维表示形式,一般通过立体照相机或者ToF照相机获取,如果具备照相机的内标定参数,就可以将深度图像转换为点云。

3.1 class pcl::RangeImage

RangeImage类继承于PointCloud,主要功能是实现一个特定视点得到一个三维场景的深度图像。其继承关系如下:
PCL——(8)从点云数据生成深度图像_第2张图片

类RangeImage的成员有:
PCL——(8)从点云数据生成深度图像_第3张图片PCL——(8)从点云数据生成深度图像_第4张图片PCL——(8)从点云数据生成深度图像_第5张图片

3.2 class pcl::RangeImagePlanner

RangeImagePlanner 来源于最原始的深度图像,但又区别于原始的深度图像,因为该类不使用球类投影方式,而是通过一个平面投影方式进行投影(相机一一般采用这种投影方式),因此对于已有的利用深度传感器获取的深度图像来说比较实用,类的继承关系如下:
PCL——(8)从点云数据生成深度图像_第6张图片
PCL——(8)从点云数据生成深度图像_第7张图片

3.3 从点云数据生成深度图像

下面的例子从点云和给定的传感器的位置来创建深度图像,此程序是生成一个矩形的点云,然后基于该点云创建深度图像

#include     //深度图像的头文件

int main (int argc, char** argv) {
  pcl::PointCloud<pcl::PointXYZ> pointCloud;   //定义点云的对象
  
  // 循环产生点云的数据
  for (float y=-0.5f; y<=0.5f; y+=0.01f) {
    for (float z=-0.5f; z<=0.5f; z+=0.01f) {
      pcl::PointXYZ point;
      point.x = 2.0f - y;
      point.y = y;
      point.z = z;
      pointCloud.points.push_back(point); //循环添加点数据到点云对象
    }
  }
  pointCloud.width = (uint32_t) pointCloud.points.size();
  pointCloud.height = 1;                                        //设置点云对象的头信息
    //实现一个呈矩形形状的点云
  // We now want to create a range image from the above point cloud, with a 1deg angular resolution
   //angular_resolution为模拟的深度传感器的角度分辨率,即深度图像中一个像素对应的角度大小
  float angularResolution = (float) (  1.0f * (M_PI/180.0f));  //   1.0 degree in radians
   //max_angle_width为模拟的深度传感器的水平最大采样角度,
  float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f));  // 360.0 degree in radians
  //max_angle_height为模拟传感器的垂直方向最大采样角度  都转为弧度
  float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f));  // 180.0 degree in radians
   //传感器的采集位置
  Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
   //深度图像遵循坐标系统
  pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
  float noiseLevel=0.00;    //noise_level获取深度图像深度时,近邻点对查询点距离值的影响水平
  float minRange = 0.0f;     //min_range设置最小的获取距离,小于最小获取距离的位置为传感器的盲区
  int borderSize = 1;        //border_size获得深度图像的边缘的宽度
  
  pcl::RangeImage rangeImage;
  rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
                                  sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
  
  std::cout << rangeImage << "\n";
}

参考链接:https://www.cnblogs.com/li-yao7758258/p/6474699.html

你可能感兴趣的:(激光Slam)