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

举报
风吹稻花香 发表于 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中,把点云转为深度图,并保存和可视化


  
  1. #include <iostream>
  2. #include <pcl/io/pcd_io.h> 
  3. #include <pcl/common/common_headers.h>
  4. #include <pcl/range_image/range_image.h> //点云转深度头文件
  5. #include <pcl/visualization/range_image_visualizer.h> //深度图像可视化
  6. #include <pcl/visualization/pcl_visualizer.h>//点云可视化
  7. #include <boost/thread/thread.hpp>//多线程
  8. #include <pcl/io/png_io.h>//保存深度图像
  9. #include <pcl/visualization/common/float_image_utils.h>//保存深度图像
  10. int main(int argc, char** argv) {
  11.     pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud(new pcl::PointCloud<pcl::PointXYZ>);
  12.     pcl::io::loadPCDFile("D:/zmy_719/vs_pcl/bun0.pcd", *pointCloud);
  13.     //以1度为角分辨率,从上面创建的点云创建深度图像。
  14.     //深度图像中的一个像素对应的角度大小1°,角度转弧度
  15.     float angularResolution = (float)(1.0f * (M_PI / 180.0f));
  16.     
  17.     // 360.0度转弧度,扫描的水平宽度是360°
  18.     float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
  19.     // 180.0度转弧度,扫描的垂直高度是180°
  20.     float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));
  21.     //采集位置,传感器的初始位姿
  22.     Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
  23.     
  24.     //选择的系统 X轴是向右,Y轴向下,Z轴向前
  25.     //如果选择是LASER_FRAME,则X轴向前,Y轴向左,Z轴向上
  26.     pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
  27.     
  28.     //noiseLevel如果设置为0.05就是5cm为半径的圆内的所有点的平均值,得到的深度值为准
  29.     float noiseLevel = 0.00;
  30.     //minRange大于0,假设为r,那么r内的所有点被忽略,为盲区
  31.     float minRange = 0.0f;
  32.     int borderSize = 1;
  33.     //-------------------生成深度图像------------------------
  34.     pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
  35.     pcl::RangeImage& rangeImage = *rangeImage_ptr;
  36.     rangeImage.createFromPointCloud(*pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
  37.     //-------------------读取深度图像信息------------------------
  38.     std::cout << rangeImage << "\n";
  39.     //-------------------深度图的保存------------------------
  40.     float* ranges = rangeImage.getRangesArray();
  41.     unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
  42.     pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, rangeImage.width, rangeImage.height);
  43.     //------------------可视化点云----------------------
  44.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
  45.     //设置背景颜色
  46.     viewer1->setBackgroundColor(0, 0, 0);
  47.     //添加点云
  48.     viewer1->addPointCloud(pointCloud, "point cloud");
  49.     viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
  50.     viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
  51.         
  52.     //------------------可视化深度图像----------------------
  53.     //方法一:从点云中可视化深度图像
  54.     boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
  55.     viewer->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
  56.     pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointWithRange> range_image_color_handler(rangeImage_ptr, "z");
  57.     viewer->addPointCloud(rangeImage_ptr, range_image_color_handler, "range image");
  58.     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
  59.     viewer->initCameraParameters();
  60.     //方法二:以图像的形式显示深度图像,深度值作为颜色显示
  61.     pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
  62.     range_image_widget.setWindowTitle("RangeImage");
  63.     range_image_widget.showRangeImage(rangeImage);
  64.     range_image_widget.setSize(1000, 1000);
  65.         while (!viewer->wasStopped())
  66.         {
  67.             viewer->spinOnce(100);
  68.             boost::this_thread::sleep(boost::posix_time::microseconds(100000));
  69.         }
  70.     system("pause");
  71.     return 0;
  72. }



结果展示:

 

 

 

代码参考: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个月内不可修改。