任意空间平面点云旋转投影至水平面—罗德里格旋转公式

news2024/9/21 20:36:14

1、背景介绍

       将三维空间中位于任意平面上的点云数据,通过一系列的坐标变换(平移+旋转),使其投影到XOY平面上,同时保证点云的几何中心与XOY平面的原点重合,同时点云形状保持不变。具体效果如下,具体来说,对于原始点集(红色点集),对其进行平移+旋转处理后,得到新的点云(白色点云),该点云与水平面平行,同时保持与原始点云形状相同。

三维空间动图前视图(白色点云水平)俯视图(两点云簇形状形同)

      为什么要将点云旋转,将其与水平面平行,这样做的好处体现在以下几方面:

  • 数据简化:将三维问题简化为二维问题,便于后续处理,如数据分析、可视化、特征提取等。
  • 算法适用性:某些算法可能在二维平面上表现得更好或更高效,投影可以使得这类算法得以应用。
  • 几何一致性:确保所有点云数据在同一参考平面上,便于比较和处理。

2、点云旋转投影流程与原理

2.1 流程介绍

     一般来说,点云旋转投影至水平面,包括如下步骤:

  • 中心化点云:首先计算点云的几何中心,然后将点云相对于其几何中心平移,使中心点与全局坐标系的原点重合。
  • 确定平面法向量:找出点云所在平面的法向量,这是点云所在平面垂直于三维空间的方向。
  • 旋转对齐:根据平面法向量与Z轴的偏差,构造旋转矩阵,旋转点云使之与XOY平面平行或重合。目的是消除Z坐标的影响,使所有点落在XOY平面上。
  • 投影:完成旋转后,可以安全地忽略所有点的Z坐标,只保留X和Y坐标,从而将点云投影到XOY平面上。

      上述四个步骤中,其实最为核心的步骤是求解旋转矩阵,本文介绍基于罗德里格旋转公式方法求解旋转矩阵。

2.2 推导过程

      假设待旋转的点云集,其拟合平面对应的法向量为vectorBefore(x1,y1,z1),经过旋转处理后,最终要得到的平面法向量为 vectorAfter(x2,y2,z2),将这两个向量转为单位向量。

  得到 va = normalize(vectorBefore), vb = normalize(vectorAfter)

  ② vs = vb × va, 叉乘得到旋转轴vs

  ③ v = normalize(vs), vs转为单位向量得到v

  ④ ca = vb · va, 点乘得到旋转角的余弦值 ca, 即cos(angle)

  ⑤ vt = v * scale, 对v进行缩放,方便后面计算, scale = 1 - ca

  ⑥ 旋转矩阵rm为 [3,3]矩阵, 计算原理为罗德里格旋转公式(Rodrigues' rotation formula)

    rm[0,0] = vt.x * v.x + ca    

    rm[1,1] = vt.y * v.y + ca

    rm[2,2] = vt.z * v.z + ca

    vt.x *= v.y

    vt.z *= v.x

    vt.y *= v.z

    rm[0,1] = vt.x - vs.z

    rm[0,2] = vt.z - vs.y

    rm[1,0] = vt.x - vs.z

    rm[1,2] = vt.y - vs.x

    rm[2,0] = vt.z - vs.y

    rm[2,1] = vt.y - vs.x

3、测试与结果

      基于上述步骤原理,使用C++进行编程,使用Eigen库进行向量点乘、叉乘。源代码下载链接:

https://download.csdn.net/download/qq_32867925/89552493

  随机生成10000个位于同一平面点集,其中可以根据需要修改平面方程,从而生成不同平面上点集。

for (int i = 0; i < numpt; i++)
	{
		double x = rand() % 500;
		double y = rand() % 500;
		double z = 1 * x + 1 * y - 5;//假设平面方程类型 x+y-z-5=0

		Vector3d temp(x, y, z);
		points.push_back(temp);
	}

     不进行中心化处理进行旋转,即旋转中心随机,结果如下,平面方程为:x+y-z-5=0。其中,红色点集为原始点云,白色点集为旋转后点集。可以发现,白色点集均处于水平,即旋转成功,与水平面平行。通过解算参数也可以看出,z轴方向的法向量分量为-1,x轴、y轴分量为0。

未中心化旋转前视图
中心化后旋转前视图

4、总结

     介绍了三维空间内平面点云旋转平移,投影至水平面过程,并展示程序测试效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机8(LED闪烁)

一、软件设计&#xff1a; 1、本章所要实现的功能是&#xff1a;点亮D1指示灯&#xff0c;即让P2.0管脚输出一个低电平。完成后可再控制D1指示灯闪烁&#xff0c;即间隔一段时间点亮和熄灭D1指示灯。那么如何让LED进行闪烁&#xff0c;那么只需要循环的让这个低指针先亮一会&a…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日&#xff0c;其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础&#xff0c;提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

地图项目涉及知识点总结

序&#xff1a;最近做了一个在地图上标记点的项目&#xff0c;用户要求是在地图上显示百万量级的标记点&#xff0c;并且地图仍要可用&#xff08;能拖拽&#xff0c;能缩放&#xff09;。调研了不少方法和方案&#xff0c;最终实现了相对流畅的地图系统&#xff0c;加载耗时用…

LLaMA 数据集

LLaMA的训练数据集来源多样&#xff0c;涵盖了多个不同的数据集和预处理步骤。以下是详细的描述&#xff1a; 公开数据来源和预处理 CommonCrawl [67%]&#xff1a; 使用CCNet管道&#xff08;Wenzek等人&#xff0c;2020年&#xff09;对2017年至2020年间的五个CommonCrawl转…

基于 Springboot + vue + java 美食分享平台(美食管理系统)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; E-R表 &#x1f4ac; 用户表 &#x1f4ac; 美食分享文章表 &#x1f4ac;个人博客表 &#x1f4ac; 美食分类表 &#x1f4ac; …

如何根据项目需求选择采集卡及相关硬件

在选择适合的采集卡和硬件设备时&#xff0c;尤其是在要求高精度的应用场景中&#xff08;如压机测试中的1μm位移计&#xff09;&#xff0c;需要综合考虑多个因素。以下是选择硬件的几个关键原则&#xff1a; 1. 精度要求 对于需要高精度的应用&#xff0c;硬件的精度必须能…

Java代码批量处理sql语句

背景&#xff1a;数据源迁移&#xff0c;目标数据源和原始数据源的语法不同&#xff0c;要把建表语句全都改成新的语法。 一个个sql文件去替换实在是麻烦&#xff0c;可以把原始的sql文件放在一个文件夹&#xff0c;然后用程序一跑&#xff0c;改完语法的sql语句就放在新的文件…

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中&#xff0c;战锤入侵是一个重要的游戏环节&#xff0c;了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧&#xff0c;帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…

miniconda+xinference的大模型推理部署指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

【视觉SLAM】 十四讲ch5习题

1.*寻找一个相机&#xff08;你手机或笔记本的摄像头即可&#xff09;&#xff0c;标定它的内参。你可能会用到标定板&#xff0c;或者自己打印一张标定用的棋盘格。 参考我之前写过的这篇博客&#xff1a;【OpenCV】 相机标定 calibrateCamera Code来源是《学习OpenCV3》18.…

喜报!CACTER实力入选《嘶吼2024网络安全产业图谱》多项领域

CACTER实力入选多项细分领域 7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff0c;旨在全面展示网络安全产业的构成及其重要组成部分&#xff0c;探索网络安全产业的竞争格局和发展前景。 CACTER凭借卓越的技术实力和可靠的产品服务&#…

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2

Add MPI Support for tp-comm-overlap and Cpu-Offload for Mcore Distrib… by jerryli1981 Pull Request #283 alibaba/Pai-Megatron-Patch GitHub 以上是在 llama-70B 上实现的 cpu-offload 方法。 下面是在主分支上&#xff0c;仿照 LLaMA-70B&#xff0c;在 Qwen2 上…

手把手教你搭建Docker私有仓库Harbor

1、什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Docker Hub不同&#xff0c;私有仓库是受限访问的&#xff0c;只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部署…

HarmonyOS工程目录结构

应用级配置文件app.json5 应用唯一标识、版本号、应用图标、应用名称等信息 模块级配置文件module.json5 oh-package.json5 三方库的管理 其他配置 用于编译构建&#xff0c;包括构建配置文件、编译构建任务脚本、混淆规则文件、依赖的共享包信息等。 build-profile.json…

Java学习Day9之数据库链接java

package aboutdb1; import java.sql.*; import java.util.Scanner; public class newDBsystem {private static Connection getConnection() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver"); // 加载MySQL JDBC驱动Connection con DriverManager.get…

阿尔泰科技工业电脑IPC-8363工控机

概述&#xff1a; IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存&#xff0c;最大可扩展至128GB。 主要技术指标&#xff1a; 产品图示&#xff1a; 系…

php 小白新手从入门到精通教程(第3版)

前言 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&#xff0c;并根…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑&#xff0c;输入框能提示相关项。 主要借助qt的QCompleter 类&#xff08; Qt 框架中提供的一个用于自动补全和模糊搜索的类&#xff09;&#xff0c;结合一些控件&#xff0c;比如QComboBox和QLineEdit&#xff0c;实现模糊查询的功能。 1&…

在线实习项目|泰迪智能科技企业级项目学习,暑期大数据人工智能学习

在线实习介绍 实习时间&#xff1a;每个项目周期七周左右 面向对象&#xff1a;大数据、计算机相关专业学生&#xff1b;大三、大四毕业年度学生 在线实习收获 1、获得项目实战技能&#xff0c;积累项目经验 2、获得在线实习证明 项目特点…

能源化工5G防爆终端能给行业带来什么重要作用?

在能源化工领域&#xff0c;5G防爆终端的引入无疑为行业带来了革命性的变革与重要作用。这些集成了先进5G通信技术和防爆设计的高端设备&#xff0c;不仅提升了生产作业的安全性&#xff0c;还极大地增强了运营效率与智能化水平。 高速、低延迟的5G网络为防爆终端提供了前所未有…