2D-3D 转换中,为什么世界坐标要扩充成四维, 图像坐标要扩充成三维?

news2024/9/27 19:19:36

在这里插入图片描述

总结

在计算机视觉和图形学中,将世界坐标扩充成四维,以及图像坐标扩充成三维,是为了便于运用齐次坐标(homogeneous coordinates)进行坐标变换。这样的做法简化了投影变换的数学表示和计算,特别是在三维场景和二维图像间的转换中。

一、为什么世界坐标要扩充成四维, 图像坐标要扩充成三维

1. 世界坐标扩充成四维

世界坐标系统描述三维空间中的点。在使用三维坐标 (X, Y, Z) 进行表示时,转换操作(如平移和旋转)通常需要单独处理。为了统一这些操作,可以将三维坐标扩充到四维齐次坐标 (X, Y, Z, W)。在齐次坐标中:

平移、旋转、缩放 以及其他线性变换可以通过一个 4x4 矩阵来表示和处理。

当 W=1 时,(X, Y, Z, 1) 直接对应于 (X, Y, Z)。

使用四维坐标,可以通过矩阵乘法来组合多个变换,这在计算机图形和机器视觉中非常有用。

2. 图像坐标扩充成三维

图像坐标系通常是二维的,表示为 (x, y)。为了将这些坐标与三维世界坐标系中的点对应起来,并方便地进行透视投影变换,可以扩充图像坐标到三维齐次坐标 (x, y, w)。

在图像处理和计算机视觉中,使用齐次坐标可以简化相机的投影模型。例如,透视投影可以通过一个 3x4 投影矩阵与四维世界坐标的点相乘来实现。

三维齐次图像坐标允许通过简单的矩阵乘法实现从世界坐标到图像坐标的转换。w 分量在进行投影变换时起到了归一化的作用,使得变换后可以通过除以 w 来回到常规的二维坐标形式。

总的来说,使用齐次坐标系统是为了在处理几何变换时增加数学上的便利性和效率,特别是在涉及多步骤变换和不同坐标系之间的转换时。这种方法广泛应用于计算机图形、图像处理、计算机视觉以及机器人技术中。

二、几何变换的矩阵表示

在三维计算机图形中,使用 4x4 矩阵进行平移、旋转和缩放等变换是常见的方法,这些矩阵可以单独使用,也可以组合来表示复杂的变换序列。

1. 旋转变换矩阵(以 Z 轴为例)

旋转矩阵可以围绕任意轴进行旋转,但最常见的是围绕主轴(X轴、Y轴、Z轴)的旋转。例如,围绕 Z 轴旋转 𝜃度的旋转矩阵是:
cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 0 sin ⁡ ( θ ) cos ⁡ ( θ ) 0 0 0 0 1 0 0 0 0 1 \begin{matrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{matrix} cos(θ)sin(θ)00sin(θ)cos(θ)0000100001

2. 缩放变换矩阵

如果你想改变一个物体的大小,缩放矩阵允许你在每个方向上独立地调整尺寸。缩放矩阵如下所示:

s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 \begin{matrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \end{matrix} sx0000sy0000sz00001

可以看到在旋转和缩放变换中,使用4*4的矩阵是毫无意义的,那为什么还要使用4*4的矩阵呢?
是因为另一个非常常用的变换–平移–需要使用到第四维。

3. 平移变换矩阵

1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 \begin{matrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{matrix} 100001000010txtytz1
其中 t x t y t z \begin{matrix} t_x\\t_y\\t_z \end{matrix} txtytz是沿 X, Y, Z 轴的平移距离。

4. 平移变换的矩阵乘法表示

1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ⋅ X Y Z 1 = X + t x Y + t y Z + t z 1 \begin{matrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{matrix} \cdot \begin{matrix} X \\ Y \\ Z \\ 1 \end{matrix}= \begin{matrix} X + t_x \\ Y + t_y \\ Z + t_z \\ 1 \end{matrix} 100001000010txtytz1XYZ1=X+txY+tyZ+tz1

在这里我们终于看到了第四维的应用,而且这里只能通过4*4方式来进行矩阵运算,不管是第四行还是第四列,对于平移变换来说都是必需的。

5. 组合运算

这些矩阵可以通过矩阵乘法组合来实现复杂的变换。例如,一个物体先围绕 Z 轴旋转 45 度,然后沿 X 轴平移 5 单位,最后在所有方向上缩放 2 倍,可以通过以下矩阵乘法来实现:
S c a l e × T r a n s l a t e × R o t a t e Scale×Translate×Rotate Scale×Translate×Rotate
计算出的结果矩阵将包含所有这些变换的效果。

这些变换的实际应用包括在计算机图形、机器人路径规划、空间分析等领域。在实践中,这样的矩阵运算可以通过各种图形API或数学库(如OpenGL、DirectX、glm库等)来实现。

那么使用4*4的矩阵结构来进行运算的优势已经很明显了,总的来说就是:
可以统一处理各种变换
在传统的三维坐标系统中,旋转和缩放可以通过乘以一个 3x3 矩阵来实现,但平移变换需要单独处理,通常是通过加上一个向量来完成。这意味着,如果你想要组合多种变换(例如,先旋转后平移),就必须单独计算每一种变换,这在编程和算法设计中会增加复杂性。

使用四维齐次坐标,多个变换可以组合成一个矩阵,这样一个物体的多个变换可以预先计算并存储为一个矩阵。这对于图形渲染效率至关重要,因为它减少了在渲染每个物体时需要执行的计算量。

另外,还有一个使用4*4结构的原因是关于透视投影的。

在三维计算机图形中,将三维场景投影到二维屏幕上是一个核心任务。齐次坐标使得透视投影(其中物体大小随距离变化)也可以通过矩阵乘法实现。透视投影通常涉及除以深度值(z坐标),在齐次坐标中,这可以通过简单地将坐标除以齐次坐标的最后一个分量(通常是 w)来自动完成。关于w分量的作用可以自行查询。

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

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

相关文章

vscode 侧边栏资源管理器图标消失解决方案

偶然操作导致,侧边栏资源管理器图标消失,用着及其难受 尝试在网上找解决方案,找了很久都是说右键侧边栏啥啥的,无法解决 尝试删除setting.json 也无法解决 最终解决方案: 打开查看 ,命令面板 输入 View: Reset View Locations 回车就解决了

自动化测试基础 --- Jmeter

前置环境安装 首先我们需要知道如何下载Jmeter 这里贴上下载网站Apache JMeter - Download Apache JMeter 我们直接解压,然后在bin目录下找到jemter.bat即可启动使用 成功打开之后就是这个界面 每次打开可以用这种方式切换成简体中文 或者直接修改properties文件修改对应的语言…

代码随想录第五十天|最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

题目链接:. - 力扣(LeetCode) 最佳买卖股票时机含冷冻期与打家劫舍的题目有异曲同工之妙,主要是出现了天数的间隔,一次需要在买卖股票的最佳时机II 题目上做一点调整,代码如下: 如代码所示&…

第12节 第二种shellcode编写实战(1)

我最近在做一个关于shellcode入门和开发的专题课👩🏻‍💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考…

一文扫盲(12):公寓/酒店管理系统的功能模块和界面设计

大千UI工场本次带来第12期:酒店管理系统,从系统定义、功能模块、界面构成和设计方向四个方面讲解,大千UI工场愿意持续和大家分享,欢迎关注、点赞、转发。 公寓管理系统是一种用于管理和运营公寓的软件系统。它通过集成各种功能模…

基于SpringBoot+Vue的笔记共享平台 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库:Mysql5.7/8.0 数据表:10张 开发语言:Java(jdk1.8) 开发工具:idea 前端技术:vue 后端技术:SpringBoot 功能简介 (有文档) 项目获取关键字&#…

使用vant-ui+vue3实现一个可复用的评星组件

如图所示 有两种情况 一种是5颗星 一种是3颗星 官网上只提供了图标类型的 并没有加文字 https://femessage-vant.netlify.app/#/zh-CN/ 自己结合两种情况 在全局注册了此组件(后续还会持续更新代码~) <template><div class"vant_rate_wrapper"><van…

Substrate 入门课第 14 期圆满结束,岗位内推直达知名 Web3 项目!

Substrate&#xff0c;一个完全免费且开源的框架&#xff0c;利用 Rust 语言的强大功能和安全性&#xff0c;为全球开发者提供了一个高效和灵活的开发环境。借助其模块化的设计&#xff0c;即使是新手开发者也能在短短 15 分钟内搭建起定制化的区块链。自 2020 年以来&#xff…

Att论文解读|ICLR 2018 《Graph attention networks》图注意力网络

论文地址 论文地址&#xff1a;https://arxiv.org/abs/1710.10903 github:PetarV-/GAT: Graph Attention Networks (https://arxiv.org/abs/1710.10903) (github.com) gordicaleksa/pytorch-GAT: My implementation of the original GAT paper (Veličković et al.). Ive addi…

ZFS 文件系统结构及 ZFS 文件系统数据恢复

ZFS是一种革命性的文件系统&#xff0c;它遵循完全不同的文件系统管理方法&#xff0c;同时提供目前其他文件系统无法提供的新功能和优势。ZFS 可靠、可扩展且易于管理。 它放弃了卷的概念&#xff0c;从而摆脱了传统的文件系统原则。另外&#xff0c;ZFS 提供更复杂的存储池&…

Java线程池:当核心线程数为 0 时,任务来了的执行流程

先说结论&#xff1a;创建一个临时线程直接执行 ThreadPoolExecutor.excute() public void execute(Runnable command) {if (command null)throw new NullPointerException();int c ctl.get();if (workerCountOf(c) < corePoolSize) {if (addWorker(command, true)) retu…

python + word文本框中文字识别并替换【真替换,不只是识别】

1. 简单描述 在一些转换场景下&#xff0c;文本框不会被转换&#xff0c;需要先识别成文字内容。 【识别的文字段落可能会和实际看到的效果有些差异&#xff0c;后续还需校对&#xff0c;如下图】。 不足&#xff1a;除了上面说的那个情况&#xff08;上图说的问题&#xff0…

pgAdmin 4 使用

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7,Microsoft Windows (64-bit) 10 版本&#xff1a;14 文档用途 本文介绍pgAdmin4使用技巧和工具所具有的比较好的功能。 详细信息 pgAdmin4是用于设计、维护和管理…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

Android APP读写外置SD卡无权限 java.io.IOException: Permission denied

在物联网应用里&#xff0c;app需要对挂载SD卡读写文件&#xff0c;从 Android 4.4&#xff08;KitKat&#xff09;版本开始&#xff0c;Google 引入了一项名为 "Storage Access Framework" 的新功能&#xff0c;该功能限制了应用对外部存储的直接读写权限,要不然就是…

Html + Express 实现大文件分片上传、断点续传、秒传

在日常的网页开发中&#xff0c;文件上传是一项常见操作。通过文件上传技术&#xff0c;用户可以将本地文件方便地传输到Web服务器上。这种功能在许多场景下都是必不可少的&#xff0c;比如上传文件到网盘或上传用户头像等。 然而&#xff0c;当需要上传大型文件时&#xff0c;…

构建第一个ArkTS应用之@AppStorage:应用全局的UI状态存储

AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和AppStorage不同的是&#xff0c;LocalStorage是页面级的&#xff0c;通常应用于页面内的数据共享。而AppStora…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…

导出QQ好友列表、群列表、群员列表

MENU 准备工作在浏览器地址栏中输入地址使用F12快捷键打开开发者工具(浏览器控制台)点击头像登入网站(推荐)或手机扫码登录获取群列表获取好友列表获取群员列表 准备工作 一台带有浏览器的电脑 在浏览器地址栏中输入地址 https://qun.qq.com/member.html 使用F12快捷键打开开发…

手机同步与数据安全:让手机和电脑完美结合!

在当今这个高度信息化的社会&#xff0c;手机和电脑不仅为我们提供了丰富的信息资源&#xff0c;让我们能够随时随地获取所需的信息&#xff0c;还为我们的生活带来了极大的便利。无论是工作、学习还是娱乐&#xff0c;手机和电脑都发挥着至关重要的作用。 然而&#xff0c;随…