zoukankan      html  css  js  c++  java
  • 如何从点云创建深度图像

     博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=202

    本小节一起学习如何从点云和给定的传感器位置来创建深度图像,下面的程序,首先是生成一个矩形点云,然后基于该点云创建深度图像。

    代码

    首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第9章例1文件夹中,打开名为range_image_creation.cpp的代码文件。

    解释说明

    下面来解析打开源代码中的关键语句。

    #include <pcl/range_image/range_image.h>          //深度图像头文件
    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;                            //设置点云对象的头信息

    这段程序首先创建一组数据作为点云的数据内容,再设置文件头的信息,整个实现生成一个呈矩形形状的点云。

     float angularResolution = (float) (  1.0f * (M_PI/180.0f)); // 按弧度1度
      float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f)); // 按弧度360.0度
      float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f)); // 按弧度180.0度
      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;
      float minRange = 0.0f;
      int borderSize = 1;

    这部分定义了创建深度图像时需要的设置参数,将角度分辨率定义为1度,意味着由邻近的像素点所对应的每个光束之间相差1度,maxAngleWidth=360和maxAngleHeight=180意味着,我们进行模拟的距离传感器对周围的环境拥有一个完整的360度视角,用户在任何数据集下都可以使用此设置,因为最终获取的深度图像将被裁剪到有空间物体存在的区域范围。但是,用户可以通过减小数值来节省一些计算资源,例如:对于传感器后面没有可以观测的点时,一个水平视角为180度的激光扫描仪,即maxAngleWidth=180就足够了,这样只需要观察距离传感器前面就可以了,因为后面没有需要观察的场景。sensorPose定义了模拟深度图像获取传感器的6自由度位置,其原始值为横滚角roll、俯仰角pitch、偏航角yaw都为0coordinate_frame=CAMERA_FRAME说明系统的X轴是向右的,Y轴是向下的,Z轴是向前的,另外一个选择是LASER_FRAME,其X轴向前,Y轴向左,Z轴向上。noiseLevel=0是指使用一个归一化的Z缓冲器来创建深度图像,但是如果想让邻近点集都落在同一个像素单元,用户可以设置一个较高的值,例如noiseLevel=0.05可以理解为,深度距离值是通过查询点半径为5cm的圆内包含的点用来平均计算而得到的。如果minRange>0,则所有模拟器所在位置半径minRange内的邻近点都将被忽略,即为盲区。在裁剪图像时,如果borderSize>0,将在图像周围留下当前视点不可见点的边界。

     pcl::RangeImage rangeImage;
     rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
     std::cout << rangeImage << "
    ";

    其余的代码是使用那些用户给定的参数,从点云创建深度图像,并且在终端下打印出一些信息。深度图像继承于PointCloud类,它的点类型具有x,y,z和range距离字段,共有三种类型的点集,有效点集是距离大于零的点集,当前视点不可见点集x=y=z=NAN且值域为负无穷大,远距离点集x=y=z=NAN且值域为无穷大。

    编译和运行程序

    利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件。生成执行文件后,就可以运行了,在cmd中键入命令:

    ...>range_image_creation.exe

    1 从点云创建深度图像示例

    运行结果如图1所示,打印出深度图像的宽高、分辨率等信息。

     

    敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。

    参考文献:

    1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社2012-10

  • 相关阅读:
    ubuntu 14.04 下试用Sublime Text 3
    闲来无事,温习一下快速排序法
    学艺不精,又被shell的管道给坑了
    ssh登录失败处理步骤
    linux文件权限整理
    使用ssh远程执行命令批量导出数据库到本地
    leetcode-easy-design-384 Shuffle an Array
    leetcode-easy-dynamic-198 House Robber-NO
    leetcode-easy-dynamic-53 Maximum Subarray
    leetcode-easy-dynamic-121 Best Time to Buy and Sell Stock
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8597534.html
Copyright © 2011-2022 走看看