【PCL】pcl中从点云得到二维图像

本文介绍了如何使用PCL和OpenCV处理点云数据,通过投影到xoy平面并计算极值,确定二维图像的坐标范围,最后生成包含点云RGB信息的二维图像。给出了一个C++示例程序和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

点云文件具有三维空间的坐标,可以投影至任何需要的平面。得到二维图像。这里以投影到xoy平面为例。其进行投影的步骤如下:
(1)确定所要投影的平面,将点云投影至该平面,得到二维点坐标;
(2)求得二维点云所在平面的极值,即x_max,x_min,y_max,y_min,;
(3)根据x_max - x_min,y_max - y_min和x方向的采样精度,y方向的采样精度,确定二维图像的坐标范围;
(4)遍历点云,将点的坐标与极小值点的坐标做差之后乘以采样精度,即为该点在图像中的像素坐标;
(5)将点的RGB信息或者填充到对应的像素内。

示例程序


#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h> 
#include "opencv2/opencv.hpp"
#include <pcl/common/common.h>

int main()
{
	
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointXYZ p_max, p_min;
	pcl::io::loadPCDFile("lucy.pcd", *cloud);
	//这里向xoy平面投影
	pcl::getMinMax3D(*cloud, p_min, p_max);
	float xScale = 2, yScale = 2;
	 auto rows = static_cast<int>(round(yScale*(p_max.y - p_min.y)));
	 auto cols = static_cast<int>(round(xScale*(p_max.x - p_min.x)));

	if (rows < 1 || cols < 1) 
	{
		return -1;
	}
	cv::Mat img = cv::Mat::zeros(rows, cols, CV_8UC1);
	for ( auto& p : cloud->points) 
	{
		 int r = static_cast<int>(round(yScale*(p.y - p_min.y)));
		if (r < 0 || r >=img.rows)
			continue;
		 int c = static_cast<int>(round(xScale*(p.x -p_min.x)));
		if (c < 0 || c >=img.cols)
			continue;

		img.at<uchar>(r, c) = 255;
	}
	
	cv::imwrite("result.png",img);

	return 0;
}

测试结果

原点云

在这里插入图片描述

二维图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shanhedian2013

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

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

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

打赏作者

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

抵扣说明:

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

余额充值