当前位置:网站首页>相机标定(标定目的、原理)
相机标定(标定目的、原理)
2022-06-24 06:43:00 【没李不邢】
1.相机标定的目的:
(1)一个就是矫正由于镜头畸变造成的图片的变形,例如,现实中的直线,拍摄成图像后会外凸或内凹,进行相机标定后可以对这种情况进行校正;
(2)另一个是根据拍摄获得的二维图像来重构三维场景,因为标定的过程就是通过一系列的三维点和它对应的二维图像点进行数学变换,求出相机的内参数和外参数。
标定之后的相机,可以进行测距、三维场景的重建等。
2.四个坐标系
相机标定的目的之一是为了建立物体从三维世界到成像平面上各坐标点的对应关系,所以首先要了解以下四个坐标系:
世界坐标系:用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置以及相机所在的位置而被引入。
相机坐标系:在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。
图像坐标系:为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。
像素坐标系:为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系,单位为个(像素数目)。
3.坐标之间的转换

世界坐标系:Xw、Yw、Zw。
相机坐标系: Xc、Yc、Zc。
图像坐标系:x、y。
像素坐标系:u、v。
其中,相机坐标系的Z轴与光轴重合,且垂直于图像坐标系平面并通过图像坐标系的原点,相机坐标系与图像坐标系之间的距离为焦距f。像素坐标系平面u-v和图像坐标系平面x-y重合,但像素坐标系原点位于图中左上角。
3.1世界坐标系到相机坐标系
假设绕x轴旋转(逆时针)


以此类推,绕其它轴旋转(顺时针)


世界坐标系到相机坐标系要6个自由度,除了旋转还要进行平移

3.2相机坐标系转图像坐标系


3.3图像坐标系转像素坐标系

图像坐标系的原点在图像的中央,单位mm。
像素坐标系的原点在图像的左上角,单位是像素Pixel(个)。
dx,dy:是传感器固有的参数,代表每个像素的毫米数。
u0,v0:代表图像坐标系原点相对于像素坐标系的偏移量,单位是像素。


3.4 世界坐标系到像素坐标系转换的全过程
至此,要想通过拍摄到的二维图像重建三维场景,那么就要求得内参M1和外参M2。
3.5张正友标定法




单应性(Homography)变换。可以简单的理解为它用来描述物体在世界坐标系和像素坐标系之间的位置映射关系。对应的变换矩阵称为单应性矩阵。




![]()
如何根据标定图得到单应矩阵?
经过前面一系列的介绍,我们应该大致明白如何根据打印的棋盘标定图和拍摄的照片来计算单应矩阵H。我们来总结一下大致过程。
1. 打印一张棋盘格标定图纸,将其贴在平面物体的表面。
2. 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。
3. 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点,四个对角(红黄蓝绿)是最特别的角点)。我们定义打印的棋盘图纸位于世界坐标系Zw=0的平面上,世界坐标系的原点位于左图棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于右图图片左上角。

因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到这个视角下的单应矩阵H。当然计算单应矩阵一般不需要自己写函数实现,OpenCV中就有现成的函数可以调用。
但是,以上只是理论推导,在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。另外上述方程组采用直接线性解法通常很难得到最优解,所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-Marquarat(LM)算法
通过以上方法求得的单应性矩阵H后,以下是通过H反推相机的内外参



通过上面2.28与2.29得:

可以自行计算B为对角矩阵,所以B只有6个未知数,所以向量b设置6个参数即可



部分图片来自B站视频截图,欢迎交流学习。
强烈建议看这个文章:相机标定之张正友标定法数学原理详解(含python源码) - 知乎
边栏推荐
- Outils de débogage JVM - Arthas
- JVM debugging tool -jps
- JVM debugging tool -jstack
- Spark project Packaging Optimization Practice
- 0 foundation a literature club low code development member management applet (I)
- 1. go deep into tidb: see tidb for the first time
- Canal installation configuration
- [Proteus] Arduino uno + ds1307+lcd1602 time display
- 0 foundation a literature club low code development member management applet (II)
- JVM debugging tool -jvisualvm
猜你喜欢

【信号识别】基于深度学习CNN实现信号调制分类附matlab代码

在js中正则表达式验证小时分钟,将输入的字符串转换为对应的小时和分钟

Functions in setinterval cannot have parentheses
![[cloud based co creation] overview of the IOT of Huawei cloud HCIA IOT v2.5 training series](/img/80/1be6a87639ac8da41bc881b3341646.png)
[cloud based co creation] overview of the IOT of Huawei cloud HCIA IOT v2.5 training series

華為雲數據庫進階學習

前缀和专题训练

基因检测,如何帮助患者对抗疾病?
![[Proteus] Arduino uno + ds1307+lcd1602 time display](/img/96/d8c1cacc8a633c679b1a58a1eb8cb9.png)
[Proteus] Arduino uno + ds1307+lcd1602 time display

JVM debugging tool -arthas
![[GUET-CTF2019]zips](/img/79/22ff5d4a3cdc3fa9e0957ccc9bad4b.png)
[GUET-CTF2019]zips
随机推荐
What is an intrusion detection system?
1. go deep into tidb: see tidb for the first time
0 foundation a literature club low code development member management applet (4)
Face pincher: a hot meta universe stylist
简单使用Modbus转BACnet网关教程
JVM调试工具-Arthas
I failed to delete the database and run away
二分专题训练
How can genetic testing help patients fight disease?
【帧率倍频】基于FPGA的视频帧率倍频系统verilog开发实现
Prefix and topic training
JVM debugging tool -jmap
学会使用楼宇控制系统BACnet网关没那么难
什么是CC攻击?如何判断网站是否被CC攻击? CC攻击怎么防御?
Win11分磁盘怎么分?Win11系统怎么分磁盘?
MySQL enable binlog
The initial user names and passwords of Huawei devices are a large collection that engineers involved in Huawei business should keep in mind and collect!
超宽带脉冲定位方案,UWB精准定位技术,无线室内定位应用
Audio knowledge (V) -- data processing
PIP install XXX on the terminal but no module named XXX on pycharm