几何角度理解相机成像过程
本笔记从几何角度来理解相机的成像过程,我们生活在三维世界中,相机所捕捉到的画面是2D的,3D空间中的点是如何投影到2D平面的过程是本笔记关注的。
预设场景
本笔记讨论的东西基于以下场景:
在一个房间内放了一台相机,在相机视野范围内有一个点P(3D空间坐标)。我们来看这个3D空间坐标下的P点是如何变成相机成像平面上的像素2D坐标的。
图1:世界坐标系、相机坐标系。两者通过旋转变换和平移变换联系起来。
世界坐标系(World Coordinate System)
我们不考虑房间具体在外部世界中的位置,而是把房间当成是一个世界。在这个房间里,为了能够表示出物体的位置信息,我们首先要为这个房间定义一个坐标系,这个坐标系包含两个最重要的东西:
1. 原点:可以将原点放在房间正中心,也可以放在某个角落作为原点(本笔记使用这种方式),原点坐标(0,0,0)
2. XYZ轴:本例中X和Y轴表示沿着房间地面的两个维度,Z轴是沿着墙的垂直方向的维度。
定义好了坐标系后,房间中的任意一个点的位置,用3D坐标都能够被表示出来,坐标形式为(x,y,z),三个值分别代表了这个点距离X、Y和Z轴的距离。在本例中,这个坐标系就是世界坐标系。
图中加粗的字体(Xw,Yw,Zw)表示世界坐标系的X,Y,Z轴,对于某个点的坐标用普通字体表示比如案例的P点坐标我们记为(Xw,Yw,Zw)。
相机坐标系(Camera Coordinate System)
接下来我们在房间里摆放一台相机。如果相机被放置到了房间的原点位置,并且让相机的X.Y.Z轴对齐到Xw,Yw,Zw轴,那么这两个坐标系就完全一样了。
当然,相机的位置是可以随意摆放的,这种情况下,我们需要找到世界坐标和相机坐标之间的关系。
假设相机在世界坐标系中的位置为(Tx,Ty,Tz),这个坐标其实可以看成在世界坐标系下,相机从原点位置平移到了(Tx,Ty,Tz)。
相机本身也可以看向任意方向,也就是说在世界坐标系下,相机进行了旋转。3D旋转本身可以用三个参数表达,yaw,pitch,roll,这三个参数表示了沿着三个轴的旋转,如下图所示:
通常为了数学计算的方便,旋转是通过一个3x3的矩阵来表示的,虽然这个矩阵有9个元素,但只有三个元素用于旋转参数。
关于旋转矩阵的细节和推导,可以参考这里:
旋转矩阵(Rotation Matrix)的推导及其应用 - meteoric_cry - 博客园向量的平移,比较简单。 Xnew = Xold + Tx Ynew = Yold + Ty 缩放也较为简单 矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片https://www.cnblogs.com/meteoric_cry/p/7987548.html 综上,世界坐标系和相机坐标系通过一个旋转矩阵R和一个3个元素的平移向量t产生联系。
这也意味着,对于世界坐标系下的点P(Xw,Yw,Zw),在相机坐标系中会有不同的位置坐标值(Xc,Yc,Zc),见图1中使用红色表示的相机坐标系。
这两个坐标系的值的关系通过下面的等式表示:
从上面这个等式可以看到,如果要将世界坐标转为相机坐标,需要做一次矩阵相乘和一次矩阵相加。这种方式虽然可行,但如果能用一个矩阵相乘完成旋转和平移操作的话岂不是更加方便吗。但从上面的等式可以看出,对于一个只有三个维度的向量而言,是无法做到旋转和平移写成一个3X3矩阵的。为了能够统一旋转和平移到一个矩阵里,需要对三维向量增加一个维度w,此时这个四维的点坐标就叫做齐次坐标,增加了一个维度后就能用一个4x4矩阵来统一旋转和平移操作了。
关于齐次坐标的更详细的参考资料,可以看这里:
齐次坐标 - 简书H.C.(Homogeneous Coordinates) are a system of coordiantes used in projective geometry--...https://www.jianshu.com/p/eb85abbdc0ad 使用齐次坐标后,旋转和平移操作就可以放到一个统一的4X4矩阵里了,这个矩阵P称为相机的外参矩阵(Extrinisic Matrix)。
空间某个点p,其在世界坐标系下表示为[xw,yw,zw,1],在相机坐标系下表示为[xc,yc,zc,1]:
图像坐标系(Image Coordinate System)
图2:点P透视投影到图像平面示意
前面我们使用外参矩阵将世界坐标系的P点坐标转换到了相机坐标系里的值,拿到这个值之后,就可以在相机坐标系下做投影得到该点在图像平面上的位置了。
关于图2,需要做一点说明。图2是以一个简单的小孔成像的相机模型为基础来说明的,真实情况下,图像平面是在光心Oc后面,所产生的图像是一个颠倒的画面。为了讨论方便,这里是将图像平面放到了Oc前面。图像平面离光心Oc的距离为f(焦距)。
下图来自于CSDN的某个博主的图,非常直观地说明了图像坐标系上的点是如何得到的。原文链接如下:
世界坐标系,相机坐标系和图像坐标系的转换(Python)_AI吃大瓜的博客-CSDN博客世界坐标系,相机坐标系和图像坐标系的转换(Python)相机内参外参说明:https://panjinquan.blog.csdn.net/article/details/102502213计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换:https://blog.csdn.net/chentravelling/article/details/535580...https://blog.csdn.net/guyuealian/article/details/104184551
具体推导很简单,利用两个相似三角形的边长比例关系就可以得到图像平面的x,y。用齐次坐标形式写出的矩阵相乘等式为:
像素坐标系(Pixel Coordinate System)
像素坐标系和图像坐标系都以图像平面为基础,但是两者的原点位置和轴的单位是不同的。图像坐标系的原点是是相机光轴和图像平面的交点,通常为图像平面的中心点(principal point),单位是毫米mm。而像素坐标系的原点在图像平面左上角,单位是像素pixel。这两者的转换如上图所示。转换关系相对简单,需要注意图中的dx,dy分别表示一个像素(看成矩形)的横向长度和纵向长度(简单理解就是宽和高),dx,dy单位是mm。
总结
综合前面所有步骤,一个世界坐标系中的点P先从世界坐标系转换到相机坐标系,然后再转到图像坐标系,最后转换到像素坐标系。这些变换过程写成完整的矩阵相乘的式子如下:
其中为外参矩阵,
为内参矩阵。相机标定就是为了得到这两个矩阵的值。
几何角度理解相机成像过程相关推荐
- 九七的视觉工程 | 普通单目相机成像过程及相机内参详解
相机成像过程及相机内参详解 一.定义介绍 本节以小孔成像模型为例,详细介绍了普通单目相机的成像过程,相机内参及内参矩阵的详细含义.本节所述的成像原理与大部分相机成像原理类似,读懂此节可满足大部分与 ...
- 从几何角度理解反函数的导数
从几何角度理解反函数的导数 在同一个函数图像中,反函数和函数表达式是对同一个函数的不同表示 tan(π2−α)=tanβcotα=tanβ1tanα=tanβ1f′(x)=φ′(y)\ta ...
- 向量范数的几何直观理解和等价定义——如何从几何上定义向量范数?
[一.向量范数的几何直观理解] \quad 我们知道,一个函数: f : R n ↦ R f:R^n\mapsto R f:Rn↦R 被称为 R n R^n Rn空间的一个范数,如果它满足以下三条性质 ...
- 单目相机成像模型——针孔相机模型
高翔:SLAM十二讲阅读笔记 本节主要注意四个坐标:世界,相机,归一化相机,像素. 针孔相机模型 相机坐标转换成像素坐标,由内参数矩阵决定. 相机位姿决定世界坐标转换成相机坐标:即外参数矩阵 内参数矩 ...
- 从几何角度全新理解线性代数
油管上看到的非常好的一个线性代数教程(还有其他系列) 油管链接 B站也有的贴心不用上外网链接 1. 矩阵与线性变化 从线性变化的角度理解矩阵的意义. 线性变化:可以看作对空间的挤压伸展.它保持网格线平 ...
- ORB-SLAM2从理论到代码实现(四):相机成像原理、基本矩阵、本质矩阵、单应矩阵、三角测量详解
由于ORBmatcher.cc中有三角化和重投影等内容,所有我先写相机成像等多视图几何内容. 1. 相机的成像原理 假设空间中有一点P,它在世界坐标系中的坐标为,在相机坐标系中的坐标为,在图片中的像素 ...
- 相机成像与校正原理:将外部世界进行降维
简 介: 本文根据 相机标定(三)-相机成像模型 中的内容整理而成,初步介绍了相机的成像模型.最后介绍了利用OpenCV中的 calibrateCamera函数进行相机参数校正的过程. 关键词: 相机 ...
- 从像素坐标到相机坐标_多视图几何基础——深入理解相机内外参数
上一篇:前言(comming soon) 关键词:相机模型,多视图几何,相机内参数,相机外参数,skew畸变 1. 针孔相机模型 Figure 1 针孔相机模型是一种理想化的简单相机模型,也是成像的最 ...
- 相机标定(三)-相机成像模型
>>>文章索引<<< 相机标定(一)-原理及内参.外参 相机标定(二)-畸变校正,张正友标定法 相机标定(三)-相机成像模型 1 人眼&相机结构 1.1 类 ...
最新文章
- open source license主流的开源软件协议介绍
- iOS: JS和Native交互的两种方法,iosjsnative交互
- android富文本图片自适应,Android 图片混排富文本编辑器控件
- 浅析软件工程中的UML建模技术
- icf表格_ICF企业教练实践大奖案例——建立改变和拯救生命的教练文化
- java mvc 导入_Java SpringMVC文件导入和导出
- recv和send函数
- at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验
- Java-String类常用方法汇总
- 旧手机物联网_为了能让你的智能手机用十年,他们给旧手机做了一个操作系统...
- Namenode服务挂
- 中考英语听说计算机考试满分,关于做好北京2018年中考英语听说计算机考试工作的通知...
- android中读取svg文件,Android如何加载SVG格式的矢量图
- unity换装骨骼、蒙皮、动作之美
- 3.24 | Crypto Tech Night第十二期,Web3——属于Gen Z的社交网络时代
- Vue UI组件库(Element UI库)
- 调试大普RTC芯片驱动-ins5699s
- stm32驱动 ov7670发送到串口上位机显示图像
- 【计网】TCP协议(四)
- 关于mysql的国际化