三维点云转换为二维图像

文章目录

    • 前言
    • 原理
    • 代码
    • 总结与反思
    • 实验结果展示

前言

目的:将三维点云转换为二维图像
作用:
a.给点云赋予彩色信息,增强点云所表达物体或对象的辨识度;
b.将三维点云中绘制的目标物体通过映射关系绘制到二维图像中,这个工作在点云标注邻域被广泛使用;
c.可以根据点云中绘制的结果提取二维图像中对应的物体

原理

  1. 确定要投影的平面,将点云投影至该平面,得到二维点坐标;
  2. 求得二维点云所在平面的极值,即x_max,x_min,y_max,y_min;
  3. 根据x_max,x_min,y_max,y_min确定点云范围;
  4. 根据点云范围即想得到图像分辨率的大小求得单个像素代表的实际长度L;
  5. 遍历点云,将点的坐标与极小值点的坐标做差之后除以L,即为该点在图像中的像素坐标
  6. RGB信息填充到对应的像素内;

代码

void pointcloud_to_image(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in, float x_max, float x_min, float y_max, float y_min)
{
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	cloud->points.resize(cloud_in->size());
	for (size_t i = 0; i < cloud->points.size(); i++)   //将三维点云投影到二维,这里为投影到XOY平面
	{
		cloud->points[i].x = cloud_in->points[i].x;
		cloud->points[i].y = cloud_in->points[i].y;
		cloud->points[i].z = 0;
		cloud->points[i].r = cloud_in->points[i].r;
		cloud->points[i].g = cloud_in->points[i].g;
		cloud->points[i].b = cloud_in->points[i].b;
	}
 
	Mat image(480, 640, CV_8UC3);
	for (int j = 0; j < image.rows; j++)
	{
		for (int i = 0; i < image.cols; i++)
		{
			image.at<Vec3b>(j, i)[0] = 0;
			image.at<Vec3b>(j, i)[1] = 0;
			image.at<Vec3b>(j, i)[2] = 0;
		}
	}
 
	float l; //单个像素代表的实际长度
	float a = (x_max - x_min) / 640;   //分辨率,根据实际需要设置,这里采用648*480
	float b = (y_max - y_min) / 480;
	if (a > b)
	{
		l = a;
	}
	else
	{
		l = b;
	}
 
	for (int i = 0; i < cloud->size(); i++)
	{
                                //计算点对应的像素坐标
		int x = (cloud->points[i].x - x_min) / l;
		int y = (cloud->points[i].y - y_min) / l;
 
                                //将颜色信息赋予像素
		if (x > 0 && x < 640 && y>0 && y < 480)
		{
			image.at<Vec3b>(y, x)[0] = cloud->points[i].r;
			image.at<Vec3b>(y, x)[1] = cloud->points[i].g;
			image.at<Vec3b>(y, x)[2] = cloud->points[i].b;
		}
	}
	imshow("image", image);
	waitKey(0);
}

总结与反思

在实际应用中,为使二维图像保留更多的点云信息,除了将颜色信息填充到对应的像素内,也可考虑将点云高度信息、法向量信息填充到图像像素内

实验结果展示

原始带部分噪声的点云数据
在这里插入图片描述
去除噪声,使用法向量信息将点云映射为法向量图像
代码参照上面改改,具体省略
在这里插入图片描述

欢迎交流,如有错误,请指正~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102273.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

报错处理:Disk space full

报错环境&#xff1a; Linux 具体报错&#xff1a; No space left on device&#xff0c;磁盘空间已满 排错思路&#xff1a; 当磁盘空间耗尽时&#xff0c;会出现磁盘空间已满的错误。这可能是由于磁盘上的文件过多或者某个文件系统占用了过多磁盘空间。 解决方法&#xff1a;…

UE5- c++ websocket客户端写法

# 实现目标 ue5 c 实现socket客户端&#xff0c;读取服务端数据&#xff0c;并进行解析 #实现步骤 {projectName}.Build.cs里增加 "WebSockets","JsonUtilities", "Json"配置信息&#xff0c;最终输出如下&#xff1a; using UnrealBuildTool;…

深入探讨梯度下降:优化机器学习的关键步骤(二)

文章目录 &#x1f340;引言&#x1f340;eta参数的调节&#x1f340;sklearn中的梯度下降 &#x1f340;引言 承接上篇&#xff0c;这篇主要有两个重点&#xff0c;一个是eta参数的调解&#xff1b;一个是在sklearn中实现梯度下降 在梯度下降算法中&#xff0c;学习率&#xf…

Maven 基础之安装和命令行使用

Maven 的安装和命令行使用 1. 下载安装 下载解压 maven 压缩包&#xff08;http://maven.apache.org/&#xff09; 配置环境变量 前提&#xff1a;需要安装 java 。 在命令行执行如下命令&#xff1a; mvn --version如出现类似如下结果&#xff0c;则证明 maven 安装正确…

无涯教程-Android - ImageButton函数

ImageButton是一个AbsoluteLayout,可让您指定其子级的确切位置。这显示了带有图像(而不是文本)的按钮,用户可以按下或单击该按钮。 Android button style set ImageButton属性 以下是与ImageButton控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以…

webrtc 的Bundle group 和RTCP-MUX

1&#xff0c;最近调试程序的时候发现抱一个错误 max-bundle configured but session description has no BUNDLE group 最后发现是一个参数设置错误 config.bundle_policy webrtc::PeerConnectionInterface::BundlePolicy::kBundlePolicyMaxBundle; 2&#xff0c;rtcp-mu…

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…

SpringCloud(十)——ElasticSearch简单了解(一)初识ElasticSearch和RestClient

文章目录 1. 初始ElasticSearch1.1 ElasticSearch介绍1.2 安装并运行ElasticSearch1.3 运行kibana1.4 安装IK分词器 2. 操作索引库和文档2.1 mapping属性2.2 创建索引库2.3 对索引库的查、删、改2.4 操作文档 3. RestClient3.1 初始化RestClient3.2 操作索引库3.3 操作文档 1. …

A Mathematical Framework for Transformer Circuits—Part (1)

A Mathematical Framework for Transformer Circuits 前言Summary of ResultsREVERSE ENGINEERING RESULTSCONCEPTUAL TAKE-AWAYS Transformer OverviewModel SimplificationsHigh-Level ArchitectureVirtual Weights and the Residual Stream as a Communication ChannelVIRTU…

Tomcat安装与配置

文章目录 一,说明二,安装三:运行四,配置(若本地一个tomcat服务,可配置,若多个,可忽略)五:修改端口六:启动多tomcat(举例两个)七:Idea关联tomcat(由于老项目不是SpringBoot,这里贴下设置)八:启动服务CMD窗口和Idea关联启动中文乱码九:Linux环境下的部署流程 一,说明 本文主要介…

本地启动若依微服务版本

前置工作&#xff1a; 1.导入sql文件 2.安装完nacos 3.安装完redis 启动步骤&#xff1a; 1.开启nacos&#xff0c;在bin目录下 startup.cmd -m standalone 注意&#xff1a;在这之前要配置nacos持久化&#xff0c;修改conf/application.properties文件&#xff0c;增加支持…

BTC价格预测:灰度突如其来的胜利是否会打破“九月魔咒”?

加密市场即将进入第三季度交易的最后阶段&#xff0c;由于9月份被视为是比特币的下跌时期&#xff0c;大多数投资者都预测加密货币之王将会进一步下跌。然而&#xff0c;事情却发生了逆转&#xff0c;灰度突如其来的胜利是否会打破“九月魔咒”&#xff1f; 受该事件影响&#…

【从0学习Solidity】合约入门 Hello Web3

【学习Solidity的基础】入门智能合约开发 Hello Web3 &#x1f4f1;不写代码没饭吃上架主页 在强者的眼中&#xff0c;没有最好&#xff0c;只有更好。我们是全栈开发领域的优质创作者&#xff0c;同时也是阿里云专家博主。 ✨ 关注我们的主页&#xff0c;探索全栈开发的无限…

Linux下的系统编程——文件与目录操作(六)

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的操作非常灵活。用户可以通过命令行或者图形界面来进行操作。下面是Linux文件和目录操作的一些常见操作&#xff1a; 目录 一、文件系统 1.inode 2.dentry 二、文件操作 1.stat/lstat&#xff1a; 2.link/unlink…

运行命令出现错误 /bin/bash^M: bad interpreter: No such file or directory

在系统上运行一个 Linux 的命令的时候出现下面的错误信息&#xff1a; -bash: ./build.sh: /bin/bash^M: bad interpreter: No such file or directory 这个是在 Windows 作为 WSL 的时候出的错误。 原因和解决 出现问题的原因在于脚本在 Windows 中使用的回车换行和 Linux …

LLM学习笔记(1)

学习链接 ChatGPT Prompt Engineering for Developers - DeepLearning.AI 一、prompt engineering for developer 1、原则 prompting principles and iterative pattern 2、用于summarize 环境与helper functions import openai import osfrom dotenv import load_dotenv…

基于Kohonen网络的聚类算法

1.案例背景 1.1 Kohonen网络 Kohonen网络是自组织竞争型神经网络的一种,该网络为无监督学习网络,能够识别环境特征并自动聚类。Kohonen神经网络是芬兰赫尔辛基大学教授Teuvo Kohonen 提出的,该网络通过自组织特征映射调整网络权值,使神经网络收敛于一种表示形态。在这一形态中…

【LeetCode】1654:到家的最少跳跃次数的解题思路 关于力扣无法return的BUG的讨论

文章目录 一、题目二、题解与代码三、神奇的BUG3.1 无法执行的 return 和 break 语句3.2 通过另一个 break 解决 一、题目 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

spring高级源码50讲-37-42(springBoot)

Boot 37) Boot 骨架项目 如果是 linux 环境&#xff0c;用以下命令即可获取 spring boot 的骨架 pom.xml curl -G https://start.spring.io/pom.xml -d dependenciesweb,mysql,mybatis -o pom.xml也可以使用 Postman 等工具实现 若想获取更多用法&#xff0c;请参考 curl …