深度图像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 datafor (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 radiansfloat maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));  // 360.0 degree in radiansfloat maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));  // 180.0 degree in radiansEigen::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.hqwc.cn/news/20596.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM 调优测试Jmeter 压测

Jmeter 内存不足了&#xff0c;修个5个线程吧 测试结果&#xff1a; Jmeter配置参数 5个线程&#xff0c;每个线程1秒跑1000次 测试串行吞吐量 -XX:PrintGCDetails -Xmx128M -Xms128M -XX:HeapDumpOnOutOfMemoryError -XX:UseSerialGC -XX:PermSize32M GC回收4次 吞吐量138…

菜鸡shader:L10 帧序列动画和极坐标的使用

文章目录 帧序列动画代码最后效果 极坐标代码最后效果 顶点色 这次笔记就直接放最后的效果了&#xff0c;因为课程上老师也没有给代码图片或是什么技巧说明。 下图左边是帧序列动画(鬼火)&#xff0c;右边是极坐标。 帧序列动画 帧序列的原理是对一张有规律行列排序的序列帧…

Pyhon学习之条件判断和循环语句

1.if flag 1 if 1:print(type(True)) if 0:print(name) if flag:print("flag的类型&#xff1a;"str(type(flag)))根据这个结果&#xff0c;可以看出来&#xff0c;这里没有进行类型转换&#xff0c;bool就是int true 就是1 false 就是0 flag 0 if 1:print(type(…

ESP32连接云服务器【WebSocket】

ESP32连接云服务器【ESP32宝塔面板】 文章目录 ESP32连接云服务器【ESP32宝塔面板】&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;服务器配置&#x1f468;‍&#x1f4bb;内容3&#xff1a;ESP32配置 &#x1f468;‍&#x1f3eb;…

C++教程——list容器、set容器、map容器

list容器 list构造函数 list赋值与交换 list大小操作 list插入和删除 list数据存取 list反转与排序 set/multiset容器 set大小和交换 set插入与删除 set查找和统计 set和multiset区别 pair对组创建 set容器排序&#xff1a;用仿函数改变默认排序方式 set容器排序&#xff0c;存…

Android :Activity生命周期

MainActivity .java import android.app.Activity; import android.os.Bundle; import android.util.Log; import java.util.function.LongToDoubleFunction; public class MainActivity extends Activity { //日志标记 private String TAG this.getClass().getSimpleNa…

【C#】并行编程实战:同步原语(2)

在第4章中讨论了并行编程的潜在问题&#xff0c;其中之一就是同步开销。当将工作分解为多个工作项并由任务处理时&#xff0c;就需要同步每个线程的结果。线程局部存储和分区局部存储&#xff0c;某种程度上可以解决同步问题。但是&#xff0c;当数据共享时&#xff0c;就需要用…

elasticsearch插件ik分词器,无法启动解决方案

首先7以后的版本一定要与es的版本保持一致下载包只能下载这个路径的文件&#xff0c;版本号与自己的es版本保持一致 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.6.0/elasticsearch-analysis-ik-8.6.0.zip这里可以直接替换 docker容器无法启动&…

Spark-用IDEA编写wordcount demo

配置 Spark版本&#xff1a;3.2.0 Scala版本&#xff1a;2.12.12 JDK&#xff1a;1.8 Maven&#xff1a;3.6.3 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&quo…

Coggle 30 Days of ML (23年7月)任务二:数据可视化

Coggle 30 Days of ML (23年7月&#xff09;任务二&#xff1a;数据可视化 任务二&#xff1a;对数据集字符进行可视化&#xff0c;统计标签和字符分布 说明&#xff1a;在这个任务中&#xff0c;需要使用Pandas库对数据集的字符进行可视化&#xff0c;并统计数据集中的标签和…

[PyTorch][chapter 44][时间序列表示方法4]

前言&#xff1a; 训练复杂度 OE*T*Q 参数 全称 E 迭代次数 Number of the training epochs T数据集大小 Number of the words in the training set Q 模型计算复杂度 Model computational complexity E,T 一般都认为相同&#xff0c;所以这里面主要讨论Q&#xff0c;模…

驱动day6

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/of_gpio.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> #include …