做机器人、自动驾驶视觉开发,相机标定是绕不开的第一步。
很多人会敲命令、会拍棋盘格、能跑出参数。
但90%的人,一辈子没搞懂最底层逻辑:
相机为什么一定要用球面镜头?不能用平面玻璃吗?
画面畸变到底是怎么产生的?物理根源是什么?
所有摄像头都是同款出厂,为什么官方参数不能直接用?
fx、fy、cx、cy内参分别代表什么?怎么用来算真实尺寸?
棋盘格标定工具靠什么原理,一次性算出所有相机参数?
我们手动标定,到底在修正什么误差?
今天这篇,完全从最基础的物理成像逻辑讲起,层层递进,落地讲透。
一、最基础:相机成像的本质(和人眼一模一样)
相机成像原理,就是仿生人类眼睛。
人眼核心结构:球状晶状体 + 视网膜感光
相机核心结构:球面镜头 + 感光芯片
成像逻辑非常简单:
现实物体反射光线 → 穿过透镜 → 汇聚到感光平面 → 形成画面。
如果我们想要完美无误差、无畸变的画面,最理想模型是「针孔成像」。
针孔的特点:
光线直线穿过
没有任何折射
现实直线拍出来绝对是直线
画面不会弯曲、不会变形
如果相机是纯针孔,根本不需要标定。
但针孔有一个致命缺陷:进光量极少,画面极暗、无法实用。
所以为了亮度、清晰度、实用性,人类必须给相机加上「镜头」。
二、关键问题:为什么镜头必须是「球面」,不能是平板玻璃?
很多人都会疑惑:
既然球面会畸变,那我直接用一块平面透明玻璃不行吗?
答案:不行,平板玻璃做不了相机镜头。
1. 平板玻璃:光线只平移、不汇聚
平行光线穿过平整玻璃,只会偏移位置,不会收拢、不会聚成一个焦点。
没有焦点,光线就是散开的。
光线散开 → 感光芯片整片乱亮 → 画面白茫茫、完全不成像。
2. 球面透镜:唯一能“聚光成像”
球面弧形玻璃有一个核心能力:
越靠近边缘弧度越大,折射角度越大,能把所有散开光线强行收拢到一个中心点。
这个收拢的中心点,就是光学焦点。
只有做到光线汇聚焦点,才能在感光芯片上形成清晰、明亮、缩小的画面。
3. 和人眼完全对应
人眼的晶状体就是球状弧形结构。
就是为了把大自然千万条光线,精准汇聚到视网膜上。
总结一句话:
想要看得清、看得亮,必须球面聚光;
只要是球面聚光,就必然产生畸变。
这是光学物理注定的取舍。
三、彻底讲懂:畸变到底是怎么来的?
畸变不是软件问题,是硬件物理天生缺陷。
1. 径向畸变(最主要畸变)
镜头是球面,中间平缓、边缘弧度更大。
从镜头正中心穿过的光线:折射很小,成像完全正常
从镜头边缘穿过的光线:球面弧度大、折射角度大,画面像素会被强行拉扯
结果就是:画面中心正常,四边、四角全部变形,直线变弧线、墙面鼓包、道路外翻,也就是桶形、枕形畸变。
你可以这样理解:
球面镜头天然把画面“扯变形了”,k1/k2/k3畸变系数就是反向滤波参数,用来抵消曲率、把弯曲画面重新拉直。
2. 切向畸变(装配误差畸变)
工厂组装不可能百分百完美:
镜头轻微装歪、镜头和感光芯片不绝对平行、卡扣螺丝微小偏移。
只要偏一点点,画面就会产生倾斜、错位偏移,靠p1/p2修正。
人眼靠大脑自动抹平边缘畸变、自动修正偏移。
相机没有大脑,只能靠我们手动标定、数学修正。
四、灵魂问题:同款摄像头,为什么出厂参数不准?
明明都是一个模具、一个型号、一条流水线,为什么厂家不给精准参数,非要我们自己标定?
真实工厂现状:
每一颗球面镜头曲率都不一样
模具出来的玻璃,冷却、打磨、成型存在细微差异,没有两颗镜头弧度完全一致,折射强度各不相同。每一颗镜头装配歪斜度都不一样
每一颗摄像头,镜头装歪的角度都是独一无二的微小误差。感光芯片粘贴位置有微米级偏差
导致真正的光学中心点,每台相机都不一样。
厂家能给的,只是所有相机的平均值、理论模拟值。
它只能勉强满足肉眼看画面,适配不了测距、传感器融合、视觉算法,所以必须我们手动标定获取本机专属参数。
五、深度拆解:内参到底包含什么?分别修正什么?
内参 = 这一颗镜头「天生独有的成像特征」,不换镜头、不调焦距,终身不变。
1. fx / fy:横向、纵向像素焦距
fx = 水平方向焦距,对应图像X轴(画面左右),控制横向物体缩放比例;
fy = 垂直方向焦距,对应图像Y轴(画面上下),控制纵向物体缩放比例。
常规对称镜头fx≈fy;广角、鱼眼镜头二者差值明显,不能混用。
重点补充:仅依靠fx、fy,无法单独算出真实物理长度
fx、fy只能建立像素和实际尺寸之间的换算比例,想要通过图片里一段像素线段,推算出它在现实世界对应的真实长度,还必须引入深度信息——也就是物体到相机的垂直距离Z。
底层原理是相似三角形:
1个像素对应的真实长度 ≈ 物体距离Z ÷ 对应方向焦距(横向用fx,纵向用fy)
举个例子:物体离相机1米(Z=1000mm),fx=500像素
1个横向像素 ≈ 1000 / 500 = 2mm
简单总结:fx/fy提供换算比例,深度Z是必要条件,二者缺一不可。单目相机没有深度信息,没法单独靠内参测量真实尺寸。
2. cx / cy:真实光学焦点中心
所有人最容易踩坑:以为图片几何中点就是成像中心。
比如1280×720画面,理论中点(640,360),但受装配误差影响,真实光学焦点cx、cy一定偏移。
3. k1、k2、k3 径向畸变系数
专门抵消球面镜头带来的边缘弯曲,相当于图像的「曲率矫正滤波参数」,把弯图拉直。
普通摄像头仅k1作用明显,鱼眼镜头才需要k3。
4. p1、p2 切向畸变系数
专门抵消镜头装歪、装配不平带来的倾斜偏移。
一句话彻底总结内参
fx/fy:修正远近缩放比例,负责像素与真实尺寸换算(必须搭配深度)
cx/cy:修正真实成像中心基准
k1/k2/k3:修正球面镜头弯曲畸变
p1/p2:修正装配倾斜误差
这9个参数,合起来,就是你这台相机专属的光学数据。
六、外参是什么?(和镜头无关)
内参是镜头天生的,外参是你装机装出来的。
外参只描述两件事:
相机装在车身的位置偏移(上下、前后、左右)
相机的角度偏移(低头、抬头、左右倾斜)
外参核心用途:
相机图像对齐激光雷达点云
图像像素坐标转换到底盘世界坐标系
BEV鸟瞰俯视投影
多传感器融合、真实空间换算
直观区分内外参作用:
内参不准:图片本身变形、测距飘;
外参不准:图片和真实世界坐标对不上,融合完全乱套。
七、核心补充:棋盘格标定工具底层原理
前面讲清楚了我们需要fx/fy/cx/cy、畸变系数、外参三组参数,很多人会疑惑:一张黑白格子棋盘,为什么就能算出全部参数?
1. 棋盘格的先天优势:世界坐标完全已知
棋盘格是人为制作的标准参照物,我们提前精确测量每一个方格的边长,每一个内角点在三维空间里的坐标是固定、无误差的。
比如2cm方格9×6棋盘,任意一个交叉点,我们都能直接写出它在棋盘平面上真实的X、Y、Z三维坐标。
2. 工具的核心逻辑:匹配真实三维点 + 图像二维像素点
程序自动识别画面里棋盘所有内角点,提取每个点在图片上的像素坐标(二维);
我们输入棋盘规格,程序直接拿到这些点在现实中的标准三维坐标;
理想针孔模型存在固定数学映射关系:真实三维空间的点,经过相机光学投影,会落在图像某个像素位置。
工具的目标,就是求解一套相机参数,让「三维坐标投影算出的像素位置」和「图片里实际检测到的像素位置」尽可能重合。
3. 多角度、多距离拍摄的意义
只拍一张棋盘格,能拟合出无数组满足条件的参数,结果完全不可用。
我们移动、倾斜、远近切换棋盘拍摄几十张,就能提供海量的三维-二维匹配点。程序通过迭代优化,不断调整fx/fy/cx/cy、畸变系数、每张图片对应的相机外参,把整体投影误差降到最低,最终得到唯一、贴合真实硬件的整套参数。
4. 顺带同步求解三类参数
畸变系数k1/k2/k3/p1/p2:修正画面弯曲带来的像素偏移,降低投影误差;
内参fx/fy/cx/cy:镜头固定属性,所有图片共用同一套;
每张图片独立外参R、T:记录拍摄这张图时,相机相对棋盘的位置、角度,拍摄结束后这套单张外参我们不用,但求解内参和畸变必须依靠它。
5. RMS误差是什么?
全部参数计算完成后,程序会统计所有三维点投影后的像素偏差总和,也就是RMS重投影误差。误差越低,代表这套参数越贴合真实相机光学特性,工程上要求RMS<0.1才算合格标定。
简单概括棋盘格标定原理:用坐标完全已知的标准平面参照物,采集大量空间-像素匹配点,通过迭代优化算法反向拟合出相机全部光学参数,一次性消除畸变、焦距、中心点、安装姿态带来的全部误差。
八、全文终极总结
为什么不用平板玻璃做镜头?
平板玻璃无法汇聚光线,不能成像。只有球面透镜能收拢光线,保证画面明亮清晰。为什么画面会产生畸变?
球面镜头边缘光线折射更强,天生拉扯画面;叠加镜头装配歪斜,畸变无法避免。为什么出厂通用参数不能用于算法开发?
每一颗镜头曲率、装配偏差、芯片偏移都是独一无二的,厂家仅提供平均理论值,没有本机真实光学参数。fx、fy能单独算出像素对应的真实长度吗?
不能。fx、fy仅提供像素与物理尺寸的换算比例,必须搭配物体到相机的深度(距离Z),才能算出现实真实长度,单目无深度相机无法精准测距。黑白棋盘格凭什么完成标定?
棋盘格三维坐标完全可控,多视角采集海量匹配点,算法迭代拟合最优的内参、畸变系数、外参,还原相机真实光学特性。为什么必须手动做相机标定?
标定就是测出这台相机专属的焦距、光学中心点、畸变曲率、安装姿态,把扭曲的画面、偏移的坐标、错误的测距比例全部还原成真实物理世界。
人眼靠大脑自动修正畸变、换算空间尺寸;相机没有智能处理能力,标定参数就是给相机装上一套精准的视觉计算逻辑。标定,是所有机器人、自动驾驶视觉算法的地基。

