深度图像Range Image

这篇具有很好参考价值的文章主要介绍了深度图像Range Image。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从点云创建深度图并显示

函数原型

RangeImage::createFromPointCloud (const PointCloudType& point_cloud,

                                                             float angular_resolution,
                                                             float max_angle_width,

                                                             float max_angle_height,
                                                             const Eigen::Affine3f& sensor_pose,                                                              RangeImage::CoordinateFrame coordinate_frame,
                                                             float noise_level,

                                                             float min_range,

                                                             int border_size)

参数说明:

  • point_cloud:创建深度图像所需要的点云的引用
  • angular_resolution:角分辨率,以弧度表示。它表示在水平和垂直方向上每个像素点之间的角度差。
  • max_angle_width:进行模拟的距离传感器对周围的环境拥有一个完整的360°视角,无论任何数据集都推荐使用此设置,因为最终获取的深度图像将被裁剪到有空间物体存在的区域范围。
  • max_angle_height:当传感器后面没有可以观测的点时,设置一个水平视角为180°的激光扫描仪即可,因为需要观察距离传感器前面就可以了。
  • sensor_pose:定义了模拟深度图像获取传感器的6DOF(6自由度)位置,其原始值为横滚角roll、俯仰角 pitch、偏航角 yaw 都为 0
  • coordinate_frame:设置为CAMERA_FRAME说明系统的X轴是向右的、Y轴是向下的、Z轴是向前的。如果参数值是LASER_FRAME,其X轴向前、Y轴向左、Z轴向上。
  • noise_level:获取深度图像深度时,近邻点对查询点距离值的影响水平。例如 noiseLevel = 0.05 可以理解为深度距离值是通过查询点半径为 5cm 的圆内包含的点用来平均计算得到的 。
  • min_range:设置最小的获取距离,小于最小获取距离的位置为传感器的盲区。
  • border_size:获得深度图像的边缘的宽度 默认为0;如果设置>0 ,在裁剪图像时,将在图像周围留下当前视点不可见点的边界 。

创建 矩形点云

#include <pcl/range_image/range_image.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/range_image_visualizer.h>

int main(int argc, char** argv) {
    pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloudPtr(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>& pointCloud = *pointCloudPtr;

    // 创建一个矩形形状的点云
    // Generate the data
    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
    // 根据之前得到的点云图,通过1deg的分辨率生成深度图。
    float angularResolution = (float)(1.0f * (M_PI / 180.0f));//   弧度1°
    float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));  //  弧度360°
    float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f)); // 弧度180°
    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;

    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";

    // 添加原始点云
    pcl::visualization::PCLVisualizer viewer("3D Viewer");
    viewer.setBackgroundColor(1, 1, 1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> org_image_color_handler(pointCloudPtr, 255, 100, 0);
    viewer.addPointCloud(pointCloudPtr, org_image_color_handler, "orginal image");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "orginal image");

    viewer.initCameraParameters();
    viewer.addCoordinateSystem(1.0);
   
    // 添加深度图点云
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("RangeImage Viewer"));
    viewer1->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointWithRange> range_image_color_handler(rangeImage_ptr, "z");
    viewer1->addPointCloud(rangeImage_ptr, range_image_color_handler, "range image");
    viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image");
    viewer1->initCameraParameters();
   
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }

    return (0);
}

运行效果: 

深度图像Range Image,PCL,pcl 深度图像Range Image,PCL,pcl
深度图像Range Image,PCL,pcl

Explanation :

pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloudPtr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>& pointCloud = *pointCloudPtr;

        这段代码创建了一个指向pcl::PointCloudpcl::PointXYZ类型的指针pointCloudPtr,并通过关键字new实例化了一个新的PointCloud对象。然后,通过将指针解引用并赋值给pointCloud变量,将其引用指向了pointCloudPtr所指向的PointCloud对象。

pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
pcl::RangeImage& rangeImage = *rangeImage_ptr; 

         这段代码创建了一个指向pcl::RangeImage类型的指针rangeImage_ptr,并通过关键字new实例化了一个新的RangeImage对象。然后,通过将指针解引用并赋值给rangeImage变量,将其引用指向了rangeImage_ptr所指向的RangeImage对象。

viewer.initCameraParameters();

        通过调用viewer.initCameraParameters()方法,初始化了相机参数,即设置了默认相机姿态和投影参数,以便在可视化中正确显示点云或三维对象。


加载已有的点云数据 

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/png_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/range_image/range_image.h>
#include <pcl/visualization/common/float_image_utils.h>//保存深度图像
#include <pcl/visualization/range_image_visualizer.h> //深度图像可视化
#include <pcl/visualization/pcl_visualizer.h>//点云可视化


int main(int argc, char** argv) {
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // 从PCD文件中加载点云数据
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("../data/DKdata2.pcd", *cloud) == -1) {
        PCL_ERROR("无法读取 PCD 文件!\n");
        return -1;
    }

    // 创建深度图参数
    float angularResolution = (float)(1.0f * (M_PI / 180.0f));  //   1.0 degree in radians
    float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));  // 360.0 degree in radians
    float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));  // 180.0 degree in radians
    Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(135.75f, -99.18f, 52.64f);
    pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
    float noiseLevel = 0.00;
    float minRange = 0.0f;
    int borderSize = 1;

    pcl::RangeImage::Ptr rangeImage_ptr(new pcl::RangeImage);
    pcl::RangeImage& rangeImage = *rangeImage_ptr;
    //pcl::RangeImage rangeImage;
    rangeImage.createFromPointCloud(*cloud, angularResolution, maxAngleWidth, maxAngleHeight,
        sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);

    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();

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
    return 0;
}

运行效果:  

深度图像Range Image,PCL,pcl

参考:点云转深度图:转换,保存,可视化文章来源地址https://www.toymoban.com/news/detail-555762.html

到了这里,关于深度图像Range Image的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习PCL库:PCL库中surface模块

    公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。未经作者允许请勿转载,欢迎各位同学积极分享和交流。 surface模块介绍 PCL库中的surface模块提供了各种表面重建和拟合算法,根据任务的不同包含

    2024年01月22日
    浏览(36)
  • 【PCL】mac下安装PCL的安装与配置

    PCL官方文档 PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平

    2024年04月29日
    浏览(40)
  • [python][pcl]python-pcl案例之kdtree搜索

    测试环境: pcl==1.12.1 python-pcl==0.3.1 python==3.7 代码: 运行结果:

    2024年02月11日
    浏览(40)
  • 【PCL自学:目录】PCL简介及主要功能模块介绍 (持续更新)

    当你知道一切都不重要时,世界就是你的了。 ——《瑞克和莫蒂》S3E8   对于从事计算机视觉、机器视觉领域的从业者来说,OpenCV库并不陌生,甚至是我们入门这个领域时的学习的第一个开源库,如果说OpenCV是二维信息处理方面的工兵铲,那PCL(Point Cloud Library)就是在三维

    2024年02月06日
    浏览(51)
  • 【PCL】ubuntu20.04安装 VTK7.1与PCL1.8(PCL依赖VTK,要先装且最好源码安装)

    Ref: 源码安装 (apt安装的方式会出现.so文件缺失的情况!!!)) ubuntu16.04 安装Qt5 + VTK7.1.1 + PCL1.8.0 第二部分 Ubuntu20.04安装VTK 下载 下载地址 依赖安装 VTK安装 方法一出现的错误: make过程中出现的 错误: Could not find  a package configuration file provided by \\\"Qt5X11Extras\\\" with any of the followi

    2024年02月03日
    浏览(47)
  • 编译报错pcl_conversions、及pcl_rosConfig解决方法

    1、报错1 CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):   Could not find a package configuration file provided by \\\"pcl_conversions\\\"   with any of the following names:     pcl_conversionsConfig.cmake     pcl_conversions-config.cmake   Add the installation prefix of \\\"pcl_conversions\\\" to CMAKE_PREFIX_PATH or

    2024年02月13日
    浏览(39)
  • [python][pcl]python-pcl案例之为平面模型构造凹凸外壳多边形

    测试环境: pcl==1.12.1 python-pcl==0.3.1 python==3.7 代码: 运行结果: PointCloud after filtering has: 139656 data points. PointCloud after segmentation has: built-in method count of list object at 0x0000028CA3429A48 inliers. PointCloud after projection has: 139656 data points. Concave hull has: 281 data points. table_scene_mug_stereo_textured.p

    2024年02月11日
    浏览(47)
  • PCL 点云变换

    一、原理简述 两片点云的刚体变换包含旋转和平移,变换矩阵的含义如下: 1、旋转矩阵 绕 x x

    2023年04月25日
    浏览(35)
  • PCL setCameraPosition 参数讲解

            cloudcompare 中正视的的坐标显示如下图,Z轴朝上(up_x=0 up_y=0 up_z=1)而Y轴背离 所以相机位置 pos_y为负值. 如果坐标系看起来不直观,建议拿个盒子画好正视的坐标系 . 以下是切换自动计算相机位置、焦点位置、相机朝向的计算函数

    2024年02月08日
    浏览(30)
  • PCL学习之点云重建

    离散点云 • 数据量大 • 渲染显示大 • 模型操作计算不方便 网格模型 • 数据量小 • 渲染方便 • 模型操作计算方便 凸包 • 平面凸包:平面的一个子集S被称为是“ 凸”的,当且仅当对于任意两点 p, 𝑞 ∈ 𝑆 ,线段𝑝𝑞都完全属于S。 • 二维的凸包称为凸多边形,三

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包