概述
以下是一些个人在工作中对相机内参的学习和理解
首先要了解一下数码相机的大致成像原理
1.光聚焦在CCD或CMOS上。
2.CCD或CMOS完成光/电转换。
3.A/D将模拟信号转换成数字信号。
4.最后由DSP将数字信号转换成数码图像
这里引用《SLAM十四讲》中的图片,图中物理成像平面可以等同于上面所说的CCD或者CMOS
根据相似三角形关系可以得到:
在左右两边都为 f 的情况下可以得到等大的图像
则上述公式变为:
根据公式可以知道 归一化成像平面是怎么定义的,根据对称得到的虚像
左边除以 f 右边除以 f,最后右边在Z=1的平面上,左边在f=1的平面得到的图像
将公式整理可得:
则这个公式表示:
归一化坐标点,[X/Z,Y/Z,1] 即在Z=1的平面上所成的像和[ X’/f , Y’/f , 1] 即在f=1的成像平面上所得到的像,离开光轴(即原点,Z轴)的距离是相同的,再这个基础上再乘 f 即可得到,[X, Y, Z]在焦距为f的成像平面上所成的像离开光轴的距离(即成像大小)
所以一般想通过相机坐标得到图像坐标,首先会将相机坐标归一化
经过了这个变换,我们就将相机坐标系的坐标(归一化),投影到了成像平面上。
但是投影到成像平面上之后,在成像平面上的图像的单位还依旧是长度单位
最后变成我们的像素图像以像素为单位
那么成像平面到像素平面还会有一层转换关系,
这一层转换关系 就是我们所说的 相机内参:
此时我们需要将 长度单位 转换为 以像素为单位的像素坐标,这个转换主要由相机内参中的fx与fy来进行确定
物理成像平面其实是由一个个像素单元组成的,每个像素单元就会有 大小,
即这个小单元格像素的宽高,所以 像素单元 的单位是 微米/像素(米,毫米单位并不固定)
举个例子:
通过投影到成像平面上时
整个图像长5376μm 宽为 3024μm
最后显示在1280*720的图像内 那么每个 物理成像平面每个像素单元的
宽度为 5376/1280 为4.2μm
高度为 3024/720 为4.2 μm
此时像素单元 是正方形的, 此时为 4.2 单位是 μm/像素(若像素单元不是正方形则fx和fy就不同了,所以会存在fx和fy因为大部分都不会是正方形)
根据 opencv中 对于内参 fx与fy的定义:(f是焦距,引用于《学习opencv》–P409)
fx = fsx
fy = fsy
sx的单位是像素/毫米 就是我们上面求得 像素单元size的倒数
转换一下 可以得到 1/4.2 = 0.238095 像素/μm
(到这基本可以明白如何通过长度转换为像素了)
这里有个疑问 为什么 fx的定义是 fx = f*sx ?
举个例子:
假设现在我们有一个世界坐标(相机坐标系) P = [X,Y,Z]
根据小孔成像公式
我们得到坐标 X’ = fX/Z Y’ = fY/Z (成像平面坐标)
但是实际使用矩阵乘法中我们是这样用
假设内参矩阵时K
由opencv的定义 fx = f*sx f是焦距 sx单位是像素/μm
那么这个点转换到像素坐标的为:
Px = K * (P/Z) 即先归一化在左乘内参矩阵
将乘法分解开来
可以得到 Px = fx*(X/Z) + cx (这里CX是光心 暂不做解释)
Px = fsx (X/Z) +cx
Px = fsx * (X/Z) = f(X/Z) * sx +cx
所以为什么相机内参会定义为 f*sx就是这个原因
因为坐标在一开始就除以Z进行归一化了
按照小孔成像公式应该乘f 只不过在opencv中将f移到了内参来进行表达 所以fx和fy的本质是 :
将世界坐标归一化后的在成像平面上的像(长度单位) 转换为像素平面上的像素(像素单位)
fx的物理意义: 因为fx 其实 是 f*sx ,sx是像素/μm(该单位并不固定) 加上f之后就变成像素,所以fx的物理意义是 :
在焦距为 f 的成像平面上,每 f 的长度表示多少个像素
最后说明一下CX和CY
在这个图上可以看到,物理成像平面的中心在光轴上,所以一般在成像平面的中心,但我们最后得到的图像面试以左上角为原点的像素图像,所以CX和CY其实是将物理成像平面的原点,做了一个偏移,将以光轴点为原点转换到以左上角为原点。
原文链接:https://blog.csdn.net/cjh666/article/details/106326257
最后
以上就是要减肥花卷为你收集整理的相机内参详解的全部内容,希望文章能够帮你解决相机内参详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复