三维重建一: 相机几何

参考这位大佬:https://zhuanlan.zhihu.com/p/458000359

一. 基本的投影模型

正如上面所说,相机是一个将三维物体投影为二维图像的设备。

对于小孔相机,或者薄透镜相机来说,基础投影的数学模型可以表达为

我们把这个过程表达在笛卡尔坐标系中,是这样的:

对这个模型,有几个点需要注意:

第1, 为了数学计算的方便,将像平面移到了相机之前,如下图所示

第2,薄透镜成像模型中,假设了对焦距离和对应小孔相机的焦距一致

你在文献里面可能经常会看到focal length, focus distance等等概念,有时候会比较让人混淆。这里需要说明薄透镜成像模型的一些假设:

  1. 薄透镜成像时,通常只考虑了接近光轴的光线
  2. 薄透镜成像时,假设像距和对应的小孔相机的焦距一致
  3. 我们上图中的f,是指对焦距离,即清晰成像的像距(传感器到镜头间的距离)。而并非透镜的焦距。

第3,这里采用了齐次坐标

现在我们来谈谈点的坐标变换,以及齐次坐标,稍微补充一下这些知识,更有助于理解后面的内容。

二. 变换和齐次坐标

2.1 二维变换和齐次坐标表达

先来看看二维空间中的点,我们通常用一个二维向量来表示这个一个普通二维点p,一幅图像会由很多个二维点构成,如下图所示。

我们很容易用二维矩阵和点的乘法来表示对点(进而对图像)的缩放、旋转、错切等操作,如下图所示

不幸的是,用二维矩阵与点的乘法无法表达二维点的平移操作。你可以自己演算下,看看下图中是否能够找到合理的二维矩阵和点的乘法来表达平移。

现在让我们引入齐次坐标。当我们用齐次坐标表达一个点时,我们只需要加入一个不为0的第三个坐标,就很容易用1个三维矩阵来表达平移了。要注意的是,加入任何不为0的w后,以齐次坐标的规则按下图进行坐标的等比例变化,都表示的是同一个点。

采用齐次坐标,我们很容易将各种二维变换统一到一起,用矩阵来表达这种变换:

2.2 三维变换和齐次坐标表达

在讨论相机成像时,我们需要处理三维空间中的点。因此我们来看看三维点的齐次坐标和相关的变换。

三维点的齐次表达是二维点的齐次表达的自然衍生,依然是加入1个不为0的新维度

一些基本变换用齐次坐标的表达的形式也非常相似,这里面唯一不同的是3D旋转

三维空间中的旋转有可能是绕着任何一个旋转轴进行的,形式比较复杂。我们可以先看看绕着基本的坐标轴旋转的情况:

这样,绕着任何一个旋转轴的旋转,可以用上面这些基础旋转组合而成(绝大多数情况下是)

由于上面这些基础旋转都可以用4x4的变换矩阵表达,因此合并的旋转矩阵也就是1个4x4的矩阵。

最终,采用了齐次坐标,我们就可以把各种三维变换也用矩阵和点的乘法来表达了:

2.3 旋转矩阵的特别之处

看看下面这张图,我们把原图进行旋转 θ 度,再把结果旋转−θ 度。

很容易得到下面两个结论,这说明旋转矩阵是单位正交矩阵,这个性质对之后我们理解相机矩阵是很有用的。

基本上,理解投影和相机矩阵的基础数学知识就回顾到这里,差不多够了。下一节我们继续来看看投影和相机矩阵。

三. 投影及相机矩阵

3.1 基础小孔相机投影矩阵

回到我们的小孔成像模型,如下图所示。我们的问题是空间点X和虚拟像平面上的点x之间的投影矩阵是什么?

很明显这里可以利用相似三角形来求解这个关系

我们用齐次坐标来表达这个过程,注意点的二维齐次坐标的特性是任意等比例变换后,表示的是同一个点。

稍微思考一下,就可以用矩阵和点的乘法来表达,这里转换矩阵就是P

这个转换矩阵还可以进一步拆分成下面的样子:

这里面的归一化投影变换,可以按下图来理解,即将三维空间点投影到了一个对焦距离为1的标准像平面上。

3.2 从投影图像到像素坐标

当点X投影到虚拟像平面成为点x时,从三维上讲,依然是在和三维点X同一个坐标系中,原点位于光心,点x的Z值为对焦距离f。而从二维上讲,我们可以认为原点位于主点,如下图所示

这里面就牵涉出两个问题。

问题一:坐标原点问题

一般来说,实际图像的坐标系原点并不是在主点。 常见的设定是将原点放置于左上角或左下角,就像下图所示

这意味着我们按照3.1节所示进行投影,得到的坐标值需要按照新老原点的相对位置进行偏移。

这样,我们的投影矩阵需要加入偏移量:

问题二:坐标单位问题

当我们投影到虚拟像平面时,所有的单位都是不变的。 例如我们采用毫米来描述三维点相对相机光心(原点)的位置时,虚拟像平面上的像点的坐标就依然用毫米来描述。然而,真正转换成最终的图像时,我们习惯于用像素来描述相关的坐标。这意味着我们按照3.1节所示投影得到的坐标值,里面相关元素都需要按照毫米到像素的比例进行等比例的变化。

那么,投影矩阵进一步变为:

3.3 从世界坐标到相机坐标

我们当前在表达小孔相机的投影模型时,认为三维空间点X的坐标是位于相机坐标系的,如下图所示:

然而,在实际的投影时,我们有时很难用相对于光心的位置来表达坐标。比如在拍摄下面这个美女时,除非经过精确的相机于她的脸部的空间关系的测量,否则我们很难表达她的右眼角相对于相机光心的物理坐标。而且就算能够测量出来,但实际表达时也会很不自然。但如果把坐标原点定位于她的鼻尖,我们就能较为自然的表达出她脸上的任何一点的坐标了。

我们把这种方式表达的坐标叫做世界坐标,而原来相对于相机光心表达的则是相机坐标。如果你知道了一个点X的世界坐标,想知道它投影到图像上的像素坐标,你是不能直接采用上面描述的相机投影矩阵来计算的。而是需要先把世界坐标转换为相机坐标值。比如,上面鼻尖的世界坐标值(非齐次表达)是[0, 0, 0](单位mm),而它相对于光心的坐标值可能是[50, 50, 500](单位mm)。

因此,为了构成一个从世界坐标系到图像像素坐标系的完整投影矩阵,还需要考虑到上面这种坐标系的转换。

从世界坐标系到相机坐标系的变化包括两步:

- 坐标原点平移到光心

- 各个世界坐标轴经3维旋转到和相机坐标轴对齐

所以这是一个先平移,再旋转的操作,用非齐次坐标表示时,是这样的:

而如果用齐次坐标表达,则是:

现在我们整合前面所有的变换分量,可以把从世界坐标系到图像坐标系的变换表达如下:

所以投影矩阵就是一个3x4的矩阵,而这个式子还可以简洁的表示为:

其中我们把K称为内参,P的其余部分是外参:

3.4 错切的影响

现在的传感器工艺已经非常好了,很少出现长宽不等的像素。但某些时候,我们依然要考虑这种情况,这样K就需要另外一个元素来描述,表示如下:

既然传感器工艺已经不再有不方正的像素了,那么什么情况下s不为0?其中一种情况就是当我们拍摄一个已经拍摄好的照片时,比如拍一个杂志封面,如果相机和杂志间不是平行的,那么整体的投影矩阵会出现不为0的s。

总之,考虑到这个情况,整个3x4的投影矩阵的自由度就变成了11个,其中包括了5个内参数,3个旋转分量,3个平移分量。

3.5 透视现象

前面我们已经看到,当物体投影的虚拟像平面时,坐标会等比例的变化,形成“近大远小”的现象

我在文章手机中的计算摄影4-超广角畸变校正中已经为你展示了透视现象的特点,现在引用其中内容如下:

人们很早就学会了利用透视效应来拍摄有趣的摄影作品:

透视投影还会使得三维空间中的平行线在画面中相交,其交点称作为消失点。

艺术家早就会使用透视技术,来突出主体了,例如下面这幅画是荷兰著名画家约翰内斯·维米尔(Johannes Vermeer)的作品钢琴课。画家利用透视效应,将主人公安排在了整个画面几条直线的消失点上,从而实现了突出主体的作用。

然而,透视效应也会导致画面的形变,我们看到拍摄同一个姑娘时,短焦镜头(广角镜头)出现了强烈的透视畸变。这是因为为了拍出同样尺寸的像,短焦镜头拍摄时物距更近,因为透视效应的近大远小法则,这种形变显得更加明显。尤其是在近距离拍摄时,人脸上鼻子相比脸侧面距离镜头更近,所以鼻子成像时放大得更大,于是人脸就显得更加诡异了。

除了上面这种因为近距离拍摄导致的形变,透视效应还会导致远离相机中心的物体被拉伸,比如下面这张用iPhone13 Mini的广角镜头拍摄的照片。相比起上面因为近距离拍摄导致的形变,这种边缘物体被拉伸的现象是我们更常见的情况。

那么问题来了,有没有相机在成像时没有透视效应呢?下一小节我们就来探讨这个问题。

四. 其他相机模型

我们知道小孔相机因为透视效应,会呈现近大远小的情况。下图你可以看到Z在像坐标的分母,这也说明了这一点。

现在想想,如果我们能不断增大Z,同时还让f也不断增大,并且f/Z始终是一个常量,那会怎么样呢?

很明显,这个时候就不再有近大远小的现象了,不管远近所成的像的大小都一样!当成像系统物距很大且像距也很大时,此时的投影关系就变成了弱透视投影,成像的几何尺寸与物距的关系就非常弱甚至没有了。《计算机视觉中的多视角几何》一书中的插图形象的说明了这一点:

比如,当我们拍摄远景时,此时的成像系统可以近似认为满足弱透视投影关系

另外如果成像系统满足如下几何关系,也能形成弱透视投影,只要物距大于Zo,那么不管远近成像的尺寸都与物距无关了,只与图中中间平面的物距Zo相关。

要构成这样的投影关系也比较容易,只需要用透镜成像+小孔成像即可。这种相机我们称为仿射相机

那么仿射相机的投影矩阵是什么呢?

仿射相机的投影矩阵的最后一行可以转换为[0 0 0 1],这是它最大的特点。

如果上图中Zo=1,会如何呢?我们看到

Zo=1,意味着S' = 2f,这时候小孔相机放大倍率为1, 于是投影关系就变成了所谓的正交投影

事实上,还有很多种投影方式,限于篇幅,我就不再详述了。大家可看《计算机视觉:算法与应用》中的下图,感受一下:

五. 总结

今天这篇文章主要回顾了小孔相机和薄透镜成像相机的几何模型,结合2D、3D齐次坐标和坐标变换的知识,讲解了相机矩阵。我们知道了相机矩阵由几个部分组成:内参矩阵K,以及外参矩阵,后者由投影矩阵、世界坐标系到相机坐标转换的矩阵组合而成。对于普通的透视成像,一共有11个自由度。它包括了5个内参,3个旋转角度,以及3个平移量。

当我们知道一个点在世界坐标系的坐标,同时又知道了投影矩阵P时,可以很容易的计算出它在图像中的坐标。

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

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

相关文章

mysql 字符集不一致导致索引失效问题

mysql 字符集不一致导致索引失效问题 问题: 两张表,同一个字段,由于字符集不一致,导致虽然都有索引,在关联查询时,索引失效身份表 identity_info ,查询索引信息 show index from identity_info …

Linux内核设计与实现 - 第6章 内核数据结构

目录1. 链表 (Linked Lists)2. 队列 (Queues)3. 映射 (Maps)4. 二叉树 (Binary Trees)5. 位图 (Bitmaps)6. 其他数据结构性能考量1. 链表 (Linked Lists) 单向链表 vs 双向链表 struct list_head 标准实现内核链表API:LIST_HEAD(), list_add(), list_del() 环形链表…

十五、K8s可观测能力:日志收集

十五、K8s可观测能力:日志收集 文章目录十五、K8s可观测能力:日志收集1、云原生日志框架-ECK介绍1.1 什么是ECK?1.2 ECK核心资源:1.3 生产级日志收集架构2、日志收集-ECK2.1 集群规划2.2 ECK 安装2.3 一键部署高可用 ES 集群2.4 一…

微服务变更?自动化测试利器Parasoft SOAtest修复快、准、稳!

微服务架构凭借灵活和可扩展的优势越来越普及,但随之而来的变更也成了开发团队的“心头大患”。服务之间依赖复杂,接口改来改去,不仅让开发更费劲,还容易导致测试用例失效、测试效率下降,甚至埋下系统不稳的隐患。 自…

将Android Studio创建的一个apk工程放到Android15源码中构建

背景描述:起初Android Studio创建的apk工程,为了方便系统版本发布和后期维护需要同时支持两种构建方式:Android Studio Gradle构建 IDE界面环境,对习惯java环境变成的友好、UI设计方便看效果Android15系统构建时自动构建 So…

yolo8目标检测+训练(识别和平精英人物)

✅步骤一:安装 PyTorch(M1 专用)# 推荐使用官方 MPS 后端(Apple Metal 加速) pip install torch torchvision torchaudio确认是否使用了 Apple MPS:import torch print(torch.backends.mps.is_available()…

【ArcGISPro】修改conda虚拟安装包路径

问题在ArcGISPro中经常使用克隆,导致C盘默认虚拟安装包内存越来越大,导致电脑很卡解决方案打开ArcGISPro所在conda文件夹D:\Program Files\ArcGIS\Pro\bin\Python\Scripts打开命令行工具(如 CMD 或终端)。输入以下命令&#xff0c…

三格电子—西门子PLC串口转网口模块

一、功能概述本文档是西门子PLC串口转以太网系列产品,包含SG-S7-200-ETH、S7-200-ETH(2P),SG-S7-300-ETH,SG-S7-300-ETH(2P)共四个产品。使用框图如下图所示意。1.1 产品功能本系列产品用来给西门子S7-200/300 PLC串口扩展出网口来&#xff0…

Python—requests模块

Python requests 模块代码演示 requests 是 Python 中一个简单易用的 HTTP 库,用于发送各种 HTTP 请求。下面是一些常见的使用示例: 1. 基本 GET 请求 import requests# 发送 GET 请求 response requests.get(https://api.github.com)# 检查请求是否成功…

华为仓颉编程语言语法简介与示例

华为仓颉编程语言语法简介与示例 仓颉编程语言是华为自主研发的新一代通用编程语言,由南京大学冯新宇教授团队主导设计,于 2024 年华为开发者大会(HDC)正式发布,并在 2025 年 7 月推出首个长期支持版本(LTS…

触发器的创建

- 建立product表,操作方式operate表要求1.定义触发器实现在产品表(product)中每多一个产品,就在操作表(operate)中记录操作方式和时间以及编号记录。注:操作说明:标记执行delete 、insert、update2.定义触发器实现在产品表(product)中每更新一…

论文略读: RASA: RANK-SHARING LOW-RANK ADAPTATION

ICLR 2025尽管 LoRA 有诸多优势,但近期研究表明,它在大规模训练数据集和复杂任务(如数学推理和代码生成)中,仍然落后于全参数微调(FFT)一个合理的解释是:低秩约束限制了 LoRA 的表达…

VSCode - VSCode 查找中文字符

VSCode 查找中文字符 1、查找中文字符使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5],这个范围涵盖了基本的中文字符2、查找中文字符串使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5]&a…

SQL基础操作指南:增删改查入门

前言 在日常数据库操作中,掌握增删查改是每个开发者必备的技能。下面我将通过实例解析SQL的核心操作要点,帮你避开常见陷阱。一、新增数据(INSERT) 单行插入:明确指定字段和值 INSERT INTO 表名(字段1, 字段2) VALUES …

Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南

前言:在应用项目部署中,“环境不一致”往往是开发与运维的痛点——本地能跑的代码到了服务器就报错,依赖版本、系统配置差异都可能成为隐患。而Docker的容器化技术恰好能解决这一问题,通过“一次构建,到处运行”的特性…

python的多线程无法并行只能并发,why?

标题python的多线程无法并行只能并发,why?python的多线程无法并行只能并发,why? 在 Python 中,特别是使用 CPython 解释器时,由于存在 全局解释器锁(GIL),即使在多核处理…

Kotlin比较接口

在 Kotlin 中,Comparable 和 Comparator 是两个允许开发者对相同或不同类的对象进行比较的接口。这两个接口通常用于基于一个或多个属性对对象集合进行排序与排序操作。本文将概述 Kotlin 的 Comparable 和 Comparator 接口,解释它们的用法,并…

day41 简单CNN

DAY 41 首先回顾下昨天的代码。 # import torch # import torch.nn as nn # import torch.optim as optim # from torchvision import datasets, transforms # from torch.utils.data import DataLoader # import matplotlib.pyplot as plt # import numpy as np# # 设置中文字…

[实战]巴特沃斯滤波器全流程解析:从数学原理到硬件实现

巴特沃斯滤波器全流程解析:从数学原理到硬件实现 文章目录巴特沃斯滤波器全流程解析:从数学原理到硬件实现1. 数学原理2. 工程实现梯形网络结构3. Python理论仿真4. 硬件仿真与PCB考虑5. 完整设计工具6. 输出结果示例7. 设计注意事项巴特沃斯滤波器是特别…

《机器学习数学基础》补充资料:标准差与标准化

1 标准差 我们经常使用平均数来大致了解一组数据,例如平均成绩、平均身高、平均寿命等等。但是如果只看平均数,不一定能充分了解整体情况。比如说你和某首富住同一个社区,你们社区平均每户年收入两千万,那么你家是有钱还是没钱&am…