PCL点云数据处理(一)3D点云转深度图像

1.原理介绍

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

2.PCL实现

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

#pragma warning(disable:4996)
#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>
typedef pcl::PointXYZ PointType;

int main(int argc, char** argv)
{
	pcl::PointCloud<PointType>::Ptr cloud(new pcl::PointCloud<PointType>);
	Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());
	pcl::io::loadPCDFile("Armadillo.pcd", *cloud);
	float angularResolution = pcl::deg2rad(1.0f);	
	float maxAngleWidth = pcl::deg2rad(360.0f);
	float maxAngleHeight = pcl::deg2rad(360.0f);
	Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);
	pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::LASER_FRAME;
	float noiseLevel = 0.00;
	float minRange = 0.0f;
	int borderSize = 1;
	pcl::RangeImage::Ptr range_image_ptr(new pcl::RangeImage);
	pcl::RangeImage& range_image = *range_image_ptr;
	range_image.createFromPointCloud(*cloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
	float* ranges = range_image.getRangesArray();
	unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, range_image.width, range_image.height);
	pcl::io::saveRgbPNGFile("RangeImage.png", rgb_image, range_image.width, range_image.height);
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
	viewer1->setBackgroundColor(0, 0, 0);
	viewer1->addPointCloud(cloud, "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(range_image_ptr, "z");
	viewer->addPointCloud(range_image_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(range_image);
	range_image_widget.setSize(800, 600);
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
	system("pause");
	return 0;
}

3.结果展示

生成的深度图有点小

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矛盾和规律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值