当前位置:   article > 正文

PCL点云数据处理(一)3D点云转深度图像_点云图如何转化为深度图

点云图如何转化为深度图

1.原理介绍

   深度图像也叫高度图像,距离图像,由传感器采集场景的距离作为图像像素值,是一种3D图像格式,有些情况下,需要把3D点云转成深度图来处理,转换原理本质上是坐标系的变换。

2.PCL实现

   PCL中实现3D点云到深度图转换的代码如下:

  1. #pragma warning(disable:4996)
  2. #include <iostream>
  3. #include <pcl/io/pcd_io.h>
  4. #include <pcl/common/common_headers.h>
  5. #include <pcl/range_image/range_image.h>
  6. #include <pcl/visualization/range_image_visualizer.h>
  7. #include <pcl/visualization/pcl_visualizer.h>
  8. #include <boost/thread/thread.hpp>
  9. #include <pcl/io/png_io.h>
  10. #include <pcl/visualization/common/float_image_utils.h>
  11. typedef pcl::PointXYZ PointType;
  12. int main(int argc, char** argv)
  13. {
  14. pcl::PointCloud<PointType>::Ptr cloud(new pcl::PointCloud<PointType>);
  15. Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());
  16. pcl::io::loadPCDFile("Armadillo.pcd", *cloud);
  17. float angularResolution = pcl::deg2rad(1.0f);
  18. float maxAngleWidth = pcl::deg2rad(360.0f);
  19. float maxAngleHeight = pcl::deg2rad(360.0f);
  20. Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
  21. pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::LASER_FRAME;
  22. float noiseLevel = 0.00;
  23. float minRange = 0.0f;
  24. int borderSize = 1;
  25. pcl::RangeImage::Ptr range_image_ptr(new pcl::RangeImage);
  26. pcl::RangeImage& range_image = *range_image_ptr;
  27. range_image.createFromPointCloud(*cloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
  28. float* ranges = range_image.getRangesArray();
  29. unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, range_image.width, range_image.height);
  30. pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, range_image.width, range_image.height);
  31. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
  32. viewer1->setBackgroundColor(0, 0, 0);
  33. viewer1->addPointCloud(cloud, "point cloud");
  34. viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
  35. viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
  36. boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
  37. viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
  38. pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointWithRange> range_image_color_handler(range_image_ptr, "z");
  39. viewer->addPointCloud(range_image_ptr, range_image_color_handler, "range image");
  40. viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
  41. viewer->initCameraParameters();
  42. pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
  43. range_image_widget.setWindowTitle("RangeImage");
  44. range_image_widget.showRangeImage(range_image);
  45. range_image_widget.setSize(800, 600);
  46. while (!viewer->wasStopped())
  47. {
  48. viewer->spinOnce(100);
  49. boost::this_thread::sleep(boost::posix_time::microseconds(100000));
  50. }
  51. system("pause");
  52. return 0;
  53. }

3.结果展示

生成的深度图有点小

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/267950
推荐阅读
相关标签
  

闽ICP备14008679号