# 相机参数
针孔相机模型,包含四个坐标系:物理成像坐标系、像素坐标系、相机坐标系、世界坐标系。
相机参数包含:内参、外参、畸变参数
内参
【Intrinsics】

物理成像坐标系:O′−x′−y′
像素坐标系:O−u−v
相机坐标系:O−x−y
世界坐标系:O−X−Y−Z
在世界坐标系下的点P[X,Y,Z]T,通过相机坐标系下的光心O投影到物理成像平面上的P′[X′,Y′,Z′]T,对应到像素坐标系下的[u,v]T。
由相似三角形可以得到:
Zf=−XX′=−YY′
带负号是因为小孔成像成的是倒像。为了简化模型,可以把物理成像平面看作为放到了相机的前方,这样可以直观的认为成立的正像(虚像),就像下图:

可以得到:
Zf=XX′=YY′X′=fXZY′=fYZ(1)(2)(3)
从物理成像坐标系到像素坐标系之前,相差了一个缩放和平移。缩放是因为两个坐标系之前的表示的单位长度不一致,平移是因为两个坐标系的原点不一致。
假设,像素坐标在u方向上缩放了α倍,在v方向上缩放了β倍,同时,原点平移了[cx,cy]T。那么点P′[X′,Y′,Z′]T与像素坐标系下[u,v]T的关系为:
{u=αX′+cxv=βY′+cy⇓fx=αffy=βf⇓{u=fxXZ+cxv=fyYZ+cy
其中,变量的单位是f→mm;α,β→像素/mm;fx,fy→像素。将坐标进行归一化,写成矩阵形式,并对左侧像素坐标进行齐次化,方便后面的运算:
⎡⎢⎣uv1⎤⎥⎦=1Z⎡⎢⎣fx0cx0fycy001⎤⎥⎦△=1ZKP⇓Z⎡⎢⎣uv1⎤⎥⎦=⎡⎢⎣fx0cx0fycy001⎤⎥⎦△=KP
把中间的量组成的矩阵称为相机的内参矩阵(Camera Intrinsics)K。
内参矩阵参数获取

图像大小[w,h],单位pixel;相机焦距f,单位mm;视场角FOV−α,单位弧度;像素单元长度dx,dy,单位mm/pixel;内参fx,fx,单位pixel:
fx=fdxfy=fdycx=w2 (假设相机主点在图像中央)cy=h2 (假设相机主点在图像中央)
fx就相当于用x方向的像素数去量化物理焦距f;
fy就相当于用y方向的像素数去量化物理焦距f;

已知相机的硬件参数求内参
相机的内参出厂后就是固定不变的,如果知晓相机的出厂参数,可以计算相机的内参。
如成像传感器是m×n(μm),图像尺寸是w×h(pixel),那么图像像素单元就是
dx=mw(μm/pixel)dy=nh(μm/pixel)cx=w2cy=h2
如果dx=dy,则图像像素单元是一个正方形,此时fx=fy;
如果dx≠dy,则图像像素单元是一个矩形,此时fx≠fy。
如成像传感器是2000×1000(μm),图像尺寸是1000×500(pixel),那么图像像素单元就是dx=dy=2(μm/pixel),cx=500,cy=250(pixel)
求视场角FOV
这里只是求水平方向上的FOV,垂直方向上的FOV求法和水平是一致的。

其中,成像传感器是m×n(μm),图像尺寸是w×h(pixel),像素单元x轴方向长度dx=mw(μm/pixel),可以看到:
tan(α2⋅π180)=m/2f⇓FOV=α=2arctan(m/2f)⋅180π⇓m=w⋅dx⇓FOV=α=2arctan(w⋅dx/2f)⋅180π⇓fx=fdx⇓FOV=α=2arctan(w2fx)⋅180π(4)(5)(1.1)(6)(7)(8)(9)(10)(11)(12)(1.2)
如果已知相机传感器尺寸,通过公式1.1可以计算出相机的视场角FOV;
如果已知相机内参,通过公式(1.2)可以计算出相机的视场角FOV。
通过FOV计算内参
由公式(1.2),可得:
w2fx=tan(FOV2⋅π180)⇓fx=w2tan(FOV2⋅π180)fy=h2tan(FOV2⋅π180)(13)(14)(15)(16)
如果dx=dy,则图像像素单元是一个正方形,此时fx=fy;cx=w2;cy=h2。
外参
【Extrinsics】
相机内参描述的是在相机坐标系下的点到像素坐标系下的对应关系,上文内提到的P也是在相机坐标系下的点。相机在三维空间中运动,记点P在世界坐标系下的点为Pw,在相机坐标系下的坐标为Pc。
相机在世界坐标系下的位姿,由相机的旋转矩阵R和平移向量t来描述。此时有:
Z⋅Puv|3×1=Z⋅⎡⎢⎣uv1⎤⎥⎦=K(RPw+t)=K|3×3⋅T|3×4⋅Pw|4×1(1.3)
两侧都是齐次坐标,同时因为齐次坐标乘上非零常数后表达同样的含义,所以可以简单地把Z去掉
:
Puv=KTPw
但这样等号意义就变了,成为在齐次坐标下相等的概念,相差了一个非零常数。为了避免麻烦,我们还是从传统意义下来定义书写等号。
(《SLAM十四讲》)
式1.3表明,我们可以把一个世界坐标点先转换到相机坐标系,再除掉它最后一维的数值(该点距离相机成像平面的深度),这就相当于把最后一维进行了归一化处理,得到点P在相机归一化平面上的投影:
(RPw+t)=[X,Y,Z]T→ [X/Z,Y/Z,1]T 相机坐标 归一化坐标(17)(18)
归一化坐标可以看成相机前方z=1处的平面上的一个点,这个z=1平面也称为归一化平面。归一化坐标左称内参K就得到了像素坐标,因此可以把像素坐标[u,v]T看成对归一化平面上的点进行量化测量的结果。
同时可以看到,如果对相机坐标同时乘上任意非零常数,归一化坐标都是一样的,也就是点的深度信息在投影的过程中丢失了,所以在单目视觉中没法得到像素点的深度值。
通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的 zc(深度值)的值。来源
参考博客:
高翔.《视觉SLAM十四讲》
关于相机成像焦距的像素表示fx、fy的解释(VSLAM14讲Chp5)
由相机的自身参数求解内参矩阵
关于FOV与焦距
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构