深度图像Range Image

news2024/12/29 11:04:50

从点云创建深度图并显示

函数原型

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

运行效果: 

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

运行效果:  

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leaflet Ant Path(水系流动效果)

一、源代码&#xff1a; 用leaflet库中的Leaflet.AntPath插件 将通量动画&#xff08;如蚂蚁行走&#xff09;放入折线中 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><…

【UE】运行游戏时就获取鼠标控制

问题描述 我们经常在点击运行游戏后运行再在视口界面点击一下才能让游戏获取鼠标控制。其实只需做一个设置就可以在游戏运行后自动获取鼠标控制。 解决步骤 点击编辑器偏好设置 如下图&#xff0c;点击“播放”&#xff0c;再勾选“游戏获取鼠标控制” 这样当你运行游戏后直…

12、k8s Namespaces 资源隔离

Kubernetes Namespaces _ Kubernetes(K8S)中文文档_Kubernetes中文社区 Kubernetes Namespaces 实现资源隔离和配额的隔离,比如下面的信息: 所有对象都在Namespace中? 大多数Kubernetes资源(例如pod、services、replication controllers或其他)都在某些Namespace中,…

【LeetCode热题100】打卡第36天:多数元素打家劫舍

文章目录 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍⛅前言 多数元素&#x1f512;题目&#x1f511;题解 打家劫舍&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第36天&#xff1a;多数元素&打家劫舍 ⛅前言 大家好&#xff0c;我是…

pytorch安装问题【超级简单版】

pytorch安装问题 当前遇到的问题&#xff1a; python3.9无法安装读取coco数据集的 pycocotools-windows,那么需要切换版本到3.6/7/8&#xff0c;但是切换到python 3.6之后&#xff0c;无法安装torchvision和pytorch【在python就叫torch】&#xff0c;显示没有这个版本 pip i…

MS1205N激光测距用高精度时间测量(TDC)电路

MS1205N 是一款高精度时间测量 (TDC) 电路&#xff0c;具有四通 道、多脉冲的采样能力、高速 SPI 通讯、多种测量模式&#xff0c;适合 于激光雷达和激光测距。 主要特点  单精度模式 60ps  双精度模式 30ps  非校准测量范围 3.5ns(0ns) 至 25μs  单…

案例分析:成功的APP开发背后的故事

如今&#xff0c;我们生活在一个信息化时代&#xff0c;在这个信息时代&#xff0c;不管是工作还是生活都离不开手机 APP。因为有了手机 APP&#xff0c;我们的生活变得更加便捷、智能。但随着移动 APP开发的火热&#xff0c;很多企业都想要制作一个自己的 APP。然而在众多的 A…

822. 走方格

链接&#xff1a; 链接 题目&#xff1a; 给定一个 nmnm 的方格阵&#xff0c;沿着方格的边线走&#xff0c;从左上角 (0,0)(0,0) 开始&#xff0c;每次只能往右或者往下走一个单位距离&#xff0c;问走到右下角 (n,m)(n,m) 一共有多少种不同的走法。 输入格式 共一行&#xff…

【Docker】简单的Linux安装Redis

目录 Docker 安装 Redis拉取镜像安装容器修改配置文件容器随docker启动自动运行redis客户端 史上最详细Docker安装Redis &#xff08;含每一步的图解&#xff09;实战 Docker 安装 Redis 拉取镜像 docker pull redis安装容器 创建redis配置文件目录&#xff1a;如果内部没有相…

数据结构初阶--顺序表

目录 一.顺序表的定义 二.顺序表的分类 2.1.静态顺序表 2.2.动态顺序表 三.顺序表的特点 四.顺序表的功能实现 4.1.顺序表的定义 4.2.顺序表的初始化 4.3.顺序表的销毁 4.4.顺序表的容量检查 4.5.顺序表的打印 4.6.顺序表的尾插 4.7.顺序表的头插 4.8.顺序表的尾…

用ChatGPT搞定12 种编程语言:看看它如何表现

众所周知ChatGPT可以写代码&#xff0c;但当有一堆语言一起抛向它时&#xff0c;它的表现如何呢&#xff1f;答案是&#xff1a;还不错&#xff08;但并不完美&#xff09;。 在过去的几个月里&#xff0c;我们已经领教了ChatGPT的编码能力。我对它进行了PHP和WordPress的测试…

前端学习——Web API (Day6)

正则表达式 语法 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…

SPEC CPU 2017 1.0.5 不同版本CentOS 7 8 安装笔记

CentOS 7.9.2009 x86_64 gcc版本 安装成功 runcpu编译报错 gcc版本太低&#xff0c;不识别-fno-tree-loop-vectorize 去掉config/gcc.cfg中 -fno-tree-loop-vectorize编译优化参数。 用例编译中 CentOS 8.3.2011 x86_64 gcc版本 安装失败&#xff0c;需要自行编译tools 手动…

#{} 和 ${} 的区别?

一、区别概述 1.1、主要区别&#xff1a; 1、#{} 是预编译处理&#xff0c;${} 是直接替换&#xff1b;2、${} 存在SQL注入的问题&#xff0c;而 #{} 不存在&#xff1b;Ps&#xff1a;这也是面试主要考察的部分~ 1.2、细节上&#xff1a; 1、${} 可以实现排序查询&#xff…

亚马逊云科技联合Nolibox定制工业设计AIGC解决方案

从机器学习算法到深度学习再到强化学习&#xff0c;AI创新浪潮奔流不息。而AIGC&#xff08;AI-generated Content&#xff0c;人工智能生成内容&#xff09;的到来&#xff0c;更是让AI成为众多企业的得力助手&#xff0c;开拓了文本、图像、音视频等领域的天花板。 在洞悉到…

企业云性能监控是一项关键的任务

企业云性能监控是一项关键的任务&#xff0c;它不仅可以保障企业云服务的稳定性和可靠性&#xff0c;还可以加强企业对云服务的掌控和管理&#xff0c;提供卓越的用户体验。 首先&#xff0c;企业云性能监控可以保障云服务的稳定和可靠。在云计算环境下&#xff0c;企业的核心业…

#1336 .「找树根和孩子」. [树的基本使用](内附封面)

【题目描述】 给定一棵树&#xff0c;输出树的根root&#xff0c;孩子最多的结点max以及他的孩子。 【输入】 第一行&#xff1a;n&#xff08;结点个数≤100&#xff09;&#xff0c;m&#xff08;边数≤200&#xff09;。 以下m行&#xff1a;每行两个结点x和y&#xff0…

Hyperledger Fabric测试网络运行官方Java链码[简约版]

文章目录 启动测试网络使用peer CLI测试链码调用链码 启动测试网络 cd fabric-samples/test-networknetwork.sh的脚本语法是&#xff1a;network.sh <mode> [flag] ./network.sh up./network.sh createChannel在java源码路径下 chmod 744 gradlew vim gradlew :set ffu…

PostgreSQL技术内幕(九)libpq通信协议

libpq通信协议是基于TCP/IP 协议的一套消息通信协议&#xff0c;它允许 psql、JDBC、PgAdmin等客户端程序传递查询给PostgreSQL后端服务器&#xff0c;并接收返回查询的结果。 在这次的直播中&#xff0c;我们为大家介绍了libpq通信协议的实现原理和执行机制&#xff0c;以下内…

发挥AMS、PMS和WMS在框架层服务作用,简化开发过程

Framework底层服务是Android操作系统提供的一组核心服务和功能&#xff0c;用于支持应用程序的开发和运行。这些底层服务提供了许多功能和特性&#xff0c;帮助开发者构建稳定、高效和功能丰富的Android应用程序。 Framework底层服务作用&#xff1a; 管理应用程序的生命周期…