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

本文介绍了点云数据的获取方式,包括双目相机、RGBD相机、LiDAR和SAR系统。重点讲解了RGBD相机生成深度图的原理,并通过代码展示了如何使用PCL库将点云转换为深度图,完成保存和可视化的步骤。
部署运行你感兴趣的模型镜像

三维数据的获取方式

在计算机视觉和遥感领域,点云可以通过四种主要的技术获得,
(1)根据图像衍生而得,比如通过双目相机,
(2)基于RGBD相机获取点云
(3)基于光探测距离和测距系统比如lidar,
(4)Synthetic Aperture Radar (SAR)系统获取,基于这些不同的原理系统获取的点云数据,其数据的特征和应用的范围也是多种多样

RGBD相机和深度图

(1)深度图的原理:用深度值z值 当作像素值
(2)深度图获取原理:
在这里插入图片描述
在这里插入图片描述

代码展示:在pcl中,把点云转为深度图,并保存和可视化

#include <iostream>
#include <pcl/io/pcd_io.h> 
#include <pcl/common/common_headers.h>
#include <pcl/range_image/range_image.h> //点云转深度头文件
#include <pcl/visualization/range_image_visualizer.h> //深度图像可视化
#include <pcl/visualization/pcl_visualizer.h>//点云可视化
#include <boost/thread/thread.hpp>//多线程
#include <pcl/io/png_io.h>//保存深度图像
#include <pcl/visualization/common/float_image_utils.h>//保存深度图像
int main(int argc, char** argv) {
	pcl::PointCloud<pcl::PointXYZ>::Ptr pointCloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile("D:/zmy_719/vs_pcl/bun0.pcd", *pointCloud);

	//以1度为角分辨率,从上面创建的点云创建深度图像。
	//深度图像中的一个像素对应的角度大小1°,角度转弧度
	float angularResolution = (float)(1.0f * (M_PI / 180.0f));
	
	// 360.0度转弧度,扫描的水平宽度是360°
	float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));

	// 180.0度转弧度,扫描的垂直高度是180°
	float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));

	//采集位置,传感器的初始位姿
	Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
	
	//选择的系统 X轴是向右,Y轴向下,Z轴向前
	//如果选择是LASER_FRAME,则X轴向前,Y轴向左,Z轴向上
	pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
	
	//noiseLevel如果设置为0.05就是5cm为半径的圆内的所有点的平均值,得到的深度值为准
	float noiseLevel = 0.00;

	//minRange大于0,假设为r,那么r内的所有点被忽略,为盲区
	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";

	//-------------------深度图的保存------------------------
	float* ranges = rangeImage.getRangesArray();
	unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
	pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, rangeImage.width, rangeImage.height);

	//------------------可视化点云----------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
	//设置背景颜色
	viewer1->setBackgroundColor(0, 0, 0);
	//添加点云
	viewer1->addPointCloud(pointCloud, "point cloud");
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 1, "point cloud");
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "point cloud");
		
	//------------------可视化深度图像----------------------
	//方法一:从点云中可视化深度图像
	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();

	//方法二:以图像的形式显示深度图像,深度值作为颜色显示
	pcl::visualization::RangeImageVisualizer range_image_widget("Range image");
	range_image_widget.setWindowTitle("RangeImage");
	range_image_widget.showRangeImage(rangeImage);
	range_image_widget.setSize(1000, 1000);

		while (!viewer->wasStopped())
		{
			viewer->spinOnce(100);
			boost::this_thread::sleep(boost::posix_time::microseconds(100000));
		}

	system("pause");
	return 0;
}

结果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码参考:PCL官网
版权声明:本文为优快云博主「点云处理Zzz」的原创文章,遵循CC 4.0 BY - SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/adfjadsklf/article/details/119082844

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值