用PCL将生成的点云转换为深度图像并以png格式保存

这是一个最简单的有关PCL生成深度图像的程序,代码如下:

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl\point_cloud.h>
#include <pcl\range_image\range_image.h>
#include <vector>
#include <pcl/visualization/common/float_image_utils.h>//保存深度图像
#include <pcl/io/png_io.h>//保存深度图像

int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ> pointcloud;
	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.0 - y;
			point.y = y;
			point.z = z;
			pointcloud.points.push_back(point);
		}
	}
	pointcloud.width = (uint32_t)pointcloud.points.size();
	pointcloud.height = 1;


	float angularResolution = (float)(1.0f * (M_PI / 180.0f));//角分辨率是1度,也就是说由相邻像素表示的光束相差一弧度
	float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
	float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));//模拟的范围传感器有一个完整的360度全景图
	Eigen::Affine3f sensorPose = (Eigen::Affine3f) Eigen::Translation3f(0.0f, 0.0f, 0.0f);//传感器的位置定义了虚拟传感器的6 DOF位置,它的原点是滚动=俯仰=偏航=0。
	pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;//x朝向右,y向下,z轴是向前的,另一种选择是激光框架,x面向前方,y向左,z向上。
	float noiseLevel = 0.00;//对于噪声,噪声是0,范围图像是使用普通的z缓冲区创建的
	float minRange = 0.0f;// minRange >0 ,所有更近的点都将被忽略
	int borderSize = 1;//边界大小>0,边界将会在裁剪时留下一个未被观察到的点的边界。

	pcl::RangeImage rangeImage;
	rangeImage.createFromPointCloud(pointcloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose,
		coordinate_frame, noiseLevel, minRange, borderSize);

	float* ranges = rangeImage.getRangesArray();
	unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
	pcl::io::saveRgbPNGFile("saveRangeImageRGB.png", rgb_image, rangeImage.width, rangeImage.height);
	
	std::cout << rangeImage << "\n";
 
    return (0);
}

代码主要有3各部分,第一步:生成点云;第二步:将点云转换为深度图像;第三步:将生成的深度图像以png格式保存至该程序所在目录下。

其中第三步的独立代码如下,主要借鉴:https://blog.csdn.net/suyunzzz/article/details/99107931

#include <pcl/visualization/common/float_image_utils.h>//保存深度图像
#include <pcl/io/png_io.h>//保存深度图像
	float* ranges = rangeImage.getRangesArray();
	unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
	pcl::io::saveRgbPNGFile("saveRangeImageRGB.png", rgb_image, rangeImage.width, rangeImage.height);

我的C++程序项目保存在E盘,项目名叫project1,所有生成的深度图像也存储在这个文件下,名字就是saveRangeImageRGB:
在这里插入图片描述

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
PCL点云转换为ROS点云格式需要进行以下步骤: 1. 创建一个ROS节点和发布者对象。 ```cpp ros::NodeHandle nh; ros::Publisher cloud_pub = nh.advertise<sensor_msgs::PointCloud2>("point_cloud", 1); ``` 2. 创建一个PCL点云对象和ROS点云对象。 ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_cloud(new pcl::PointCloud<pcl::PointXYZ>); sensor_msgs::PointCloud2 ros_cloud; ``` 3. 将PCL点云对象转换为ROS点云对象。 ```cpp pcl::toROSMsg(*pcl_cloud, ros_cloud); ``` 4. 设置ROS点云对象的header信息。 ```cpp ros_cloud.header.frame_id = "base_link"; ros_cloud.header.stamp = ros::Time::now(); ``` 5. 发布ROS点云对象。 ```cpp cloud_pub.publish(ros_cloud); ``` 完整代码示例: ```cpp #include <ros/ros.h> #include <sensor_msgs/PointCloud2.h> #include <pcl_conversions/pcl_conversions.h> #include <pcl/point_cloud.h> #include <pcl/point_types.h> int main(int argc, char **argv) { // 初始化ROS节点 ros::init(argc, argv, "pcl_to_ros_publisher"); ros::NodeHandle nh; // 创建发布者对象 ros::Publisher cloud_pub = nh.advertise<sensor_msgs::PointCloud2>("point_cloud", 1); // 创建PCL点云对象 pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_cloud(new pcl::PointCloud<pcl::PointXYZ>); // 填充PCL点云对象 // 将PCL点云对象转换为ROS点云对象 sensor_msgs::PointCloud2 ros_cloud; pcl::toROSMsg(*pcl_cloud, ros_cloud); // 设置ROS点云对象的header信息 ros_cloud.header.frame_id = "base_link"; ros_cloud.header.stamp = ros::Time::now(); // 发布ROS点云对象 cloud_pub.publish(ros_cloud); // 循环等待 ros::spin(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值