点云转深度图:转化,保存,可视化

举报
风吹稻花香 发表于 2022/06/22 23:43:16 2022/06/22
【摘要】 三维数据的获取方式 RGBD相机和深度图 代码展示:在pcl中,把点云转为深度图,并保存和可视化 三维数据的获取方式 在计算机视觉和遥感领域,点云可以通过四种主要的技术获得, (1)根据图像衍生而得,比如通过双目相机, (2)基于RGBD相机获取点云 (3)基于光探测距离和测距系统比如lidar, (4)Synthetic Aper...

三维数据的获取方式
RGBD相机和深度图
代码展示:在pcl中,把点云转为深度图,并保存和可视化
三维数据的获取方式
在计算机视觉和遥感领域,点云可以通过四种主要的技术获得,
(1)根据图像衍生而得,比如通过双目相机,
(2)基于RGBD相机获取点云
(3)基于光探测距离和测距系统比如lidar,
(4)Synthetic Aperture Radar (SAR)系统获取,基于这些不同的原理系统获取的点云数据,其数据的特征和应用的范围也是多种多样

RGBD相机和深度图
(1)深度图的原理:用深度值z值 当作像素值
(2)深度图获取原理:

 

 

代码展示:在pcl中,把点云转为深度图,并保存和可视化


      #include <iostream>
      #include <pcl/io/pcd_io.h> 
      #include <pcl/common/common_headers.h>
      #include <pcl/range_image/range_image.h> //点云转深度头文件
      #include <pcl/visualization/range_image_visualizer.h> //深度图像可视化
      #include <pcl/visualization/pcl_visualizer.h>//点云可视化
      #include <boost/thread/thread.hpp>//多线程
      #include <pcl/io/png_io.h>//保存深度图像
      #include <pcl/visualization/common/float_image_utils.h>//保存深度图像
      int main(int argc, char** argv) {
          pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud(new pcl::PointCloud<pcl::PointXYZ>);
          pcl::io::loadPCDFile("D:/zmy_719/vs_pcl/bun0.pcd", *pointCloud);
          //以1度为角分辨率,从上面创建的点云创建深度图像。
          //深度图像中的一个像素对应的角度大小1°,角度转弧度
          float angularResolution = (float)(1.0f * (M_PI / 180.0f));
          // 360.0度转弧度,扫描的水平宽度是360°
          float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
          // 180.0度转弧度,扫描的垂直高度是180°
          float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));
          //采集位置,传感器的初始位姿
          Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
          //选择的系统 X轴是向右,Y轴向下,Z轴向前
          //如果选择是LASER_FRAME,则X轴向前,Y轴向左,Z轴向上
          pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
          //noiseLevel如果设置为0.05就是5cm为半径的圆内的所有点的平均值,得到的深度值为准
          float noiseLevel = 0.00;
          //minRange大于0,假设为r,那么r内的所有点被忽略,为盲区
          float minRange = 0.0f;
          int borderSize = 1;
          //-------------------生成深度图像------------------------
          pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
          pcl::RangeImage& rangeImage = *rangeImage_ptr;
          rangeImage.createFromPointCloud(*pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
          //-------------------读取深度图像信息------------------------
          std::cout << rangeImage << "\n";
          //-------------------深度图的保存------------------------
          float* ranges = rangeImage.getRangesArray();
          unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
          pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, rangeImage.width, rangeImage.height);
          //------------------可视化点云----------------------
          boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
          //设置背景颜色
          viewer1->setBackgroundColor(0, 0, 0);
          //添加点云
          viewer1->addPointCloud(pointCloud, "point cloud");
          viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
          viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
          //------------------可视化深度图像----------------------
          //方法一:从点云中可视化深度图像
          boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
          viewer->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
          pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointWithRange> range_image_color_handler(rangeImage_ptr, "z");
          viewer->addPointCloud(rangeImage_ptr, range_image_color_handler, "range image");
          viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
          viewer->initCameraParameters();
          //方法二:以图像的形式显示深度图像,深度值作为颜色显示
          pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
          range_image_widget.setWindowTitle("RangeImage");
          range_image_widget.showRangeImage(rangeImage);
          range_image_widget.setSize(1000, 1000);
              while (!viewer->wasStopped())
              {
                  viewer->spinOnce(100);
                  boost::this_thread::sleep(boost::posix_time::microseconds(100000));
              }
          system("pause");
          return 0;
      }
  
 



结果展示:

 

 

 

代码参考:PCL官网

原文链接:https://blog.csdn.net/adfjadsklf/article/details/119082844

文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/125396255

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。