组员:刘欣楠、翟国辰
实验内容 #
利用棋盘格平面模式对定焦相机进行标定,目标包括相机内参、各视图的外参和镜头畸变参数。
本文保留实验中的矩阵、参数、对比数据与示例图片。现有材料未附完整的 46 张采集图像、标定脚本、畸变系数和误差计算代码,尚不能独立复现整次实验;涉及这些材料的结论在下文注明范围。
实验目的 #
- 掌握针孔相机成像的原理与透视特点。
- 理解世界坐标、相机坐标、成像平面坐标与图像像素坐标之间的关系。
- 理解内参、外参的含义,以及径向、切向畸变的模型。
- 掌握基于平面模式的张氏标定法。
- 分析标定误差的来源,区分参数稳定性、拟合误差与独立验证精度。
实验环境与实验器材 #
硬件记录:NVIDIA 4090 Laptop、Intel i9-13900HX、华谷动力相机 WP-YTUT230M、镜头 WP-5M1614-C、平面棋盘格 9×12,单格边长 100 mm。
软件记录:华谷动力相机驱动、Python,以及以下依赖版本。命令仅记录依赖,不是完整标定程序。
pip install numpy==1.26.0 scipy==1.11.1 matplotlib==3.8.0 opencv-python==4.8.0.76
“9×12”指方格数还是内角点数尚未注明,不能直接据此填写 patternSize;还需核实 Python 版本、标定点数组中是否实际乘入 100 mm、角点细化设置与标定 flags。这些条件分别影响角点对应、平移量单位和所估计的畸变模型。
实验原理 #
针孔相机成像模型 #
以光心为原点,取相机前方为 Zc>0。本文采用位于 z=f、f>0 的前置虚拟像平面。相机坐标为 (Xc,Yc,Zc) 的点,在该平面上的米制坐标满足
⎩⎨⎧xm=fZcXc,ym=fZcYc.
这里 f,xm,ym 使用相同的长度单位。固定物体尺寸、姿态且沿光轴改变距离时,像的尺寸随深度增大而减小。
若改用光心后方 z=−f 的物理像平面,并保持横纵轴方向不变,则交点为 xm=−fXc/Zc、ym=−fYc/Zc,表现为倒像。前、后像平面是两种坐标约定,不能在已经采用 z=f 的公式后再次翻转焦距符号。
成像系统的多坐标系关系 #
- 世界坐标系:以棋盘格等参照物建立,空间点记为 Xw。
- 相机坐标系:原点在光心,Zc 沿视线朝前;外参约定为 Xc=RXw+t。
- 成像平面坐标:前置像平面上的 (xm,ym) 以主点为原点,单位可为 mm 或 m。将其除以焦距得到规范化坐标 x=Xc/Zc、y=Yc/Zc;后者无量纲,对应 z=1 的规范化平面,不能再称为米制坐标。
- 图像像素坐标:通常以图像左上角为原点,u 向右、v 向下,坐标单位为 pixel;主点像素位置记为 (cx,cy),也记作 (u0,v0)。

在无畸变模型下,规范化坐标通过内参转为像素坐标:
uv1=Kxy1,K=fx00γfy0cxcy1.
γ 是 skew 参数。零 skew、像素间距为 px,py 时,fx=f/px、fy=f/py。世界点先经刚体变换,再作透视除法,最后由内参映射到像素;三维到二维的投影不是一个可逆的刚体变换。OpenCV 常规针孔模型采用零 skew 的内参形式;本文先保留一般 γ 以说明约束数量。OpenCV 相机模型
基于平面棋盘格的相机标定原理(张氏标定法) #
相机从不同方向观察已知平面图案,先估计平面与图像的单应关系,再求内参和各视图外参,最后进行非线性优化。“最少几张”取决于已知条件:一般五参数内参需要至少三幅非退化视图;若预设 γ=0,两幅适当视图在理想条件下可以提供足够约束。重复同一姿态不等于增加独立约束。这里的下限不保证含噪实验的稳定性。张正友原论文,第 3.1 节

1. 棋盘格平面与图像平面之间的单应性 #
把世界坐标系建立在棋盘格上,使板上各点满足 Zw=0。令 x~=(u,v,1)T,则无畸变投影满足
Zcx~=K[R∣t]XwYw01=K[r1 r2 t]XwYw1.
单应矩阵只确定到一个非零整体比例。若选择代表矩阵
H=λK[r1 r2 t],ζx~=HXwYw1,ζ=λZc,
则齐次向量应按比例相等理解;不能直接把末分量为 1 的像素向量与未经归一化的乘积写成普通等号。λ 是每幅图单应矩阵的尺度选择,ζ 随点深度变化。畸变存在时,原始像素点与单应模型仅近似一致,后续还需估计畸变并优化。
2. 从单应矩阵估计内参 #
写 H=[h1 h2 h3]。由旋转矩阵前两列正交且均为单位向量,得到
{r1=λ−1K−1h1,r2=λ−1K−1h2,{h1TK−TK−1h2=0,h1TK−TK−1h1=h2TK−TK−1h2.
令
B=K−TK−1=B11B12B13B12B22B23B13B23B33,b=(B11,B12,B22,B13,B23,B33)T.
每幅图给出关于 b 的两条齐次线性约束。将各视图的约束堆叠为 Vb=0,用 SVD 取最小奇异值对应的右奇异向量,再恢复 K。六维 b 只确定到比例,因此一般需要五个独立约束;零 skew 时另有 B12=0。含噪情形还需检查恢复出的 B 能否对应正定内参模型,不能只依据图片数量认定求解成功。
3. 估计相机外参 #
沿用上述 λ 定义,理想条件下
λr1r3=∥K−1h1∥=∥K−1h2∥,=λ−1K−1h1,r2=λ−1K−1h2,=r1×r2,t=λ−1K−1h3.
先选取单应矩阵的符号,使棋盘位于相机前方,再采用正尺度。含噪时两个范数通常不完全相等,可用其平均值初始化尺度,并将初始旋转矩阵投影到 SO(3),保证 RTR=I、detR=1。这些是求解步骤,不表示本次实验脚本已核实采用相同实现。
4. 径向与切向畸变 #
设 (x,y) 为理想规范化坐标,r2=x2+y2。三参数径向模型为
x~y~=x(1+k1r2+k2r4+k3r6),=y(1+k1r2+k2r4+k3r6).
若再加入常用切向项,畸变坐标为
xdyd=x~+2p1xy+p2(r2+2x2),=y~+p1(r2+2y2)+2p2xy.
再由 K(xd,yd,1)T 得到畸变像素位置。这是理想点到畸变点的正向模型;去畸变需要求对应的逆映射。实际参数选择应与标定 flags 和输出系数对应,不能由下面的简化推导反推本次实验用了哪一种模型。OpenCV 畸变模型及系数约定
下面保留仅估计两个径向参数的线性初始化推导,明确设 k3=p1=p2=0。令 (u,v) 为理想像素坐标、(u~,v~) 为畸变后的像素坐标,则
u~v~=u+(u−u0)(k1r2+k2r4),=v+(v−v0)(k1r2+k2r4).
每个对应点给出两行:
Dj[(u−u0)r2(v−v0)r2(u−u0)r4(v−v0)r4]k[k1k2]=dj[u~−uv~−v].
将各点堆叠成 Dk≈d。当 D 满列秩时,最小二乘解为
k=(DTD)−1DTd.
数值实现宜用 QR 或 SVD 求解,而非显式求逆。若保留第三径向参数,需要在 D 中增加 r6 对应的一列;若估计切向参数,也必须增加相应项,不能把两参数解当作完整畸变结果。
5. 非线性最小二乘与极大似然 #
令第 i 幅图中第 j 个角点观测为 xij,投影函数 f 包含外参变换、透视除法、选定的畸变模型和内参映射。目标为
S(K,k,{Ri,ti})=i=1∑nj=1∑mi∥xij−f(K,k,Ri,ti,Xj)∥2.
这里 k 统称实际参与估计的畸变参数。若各角点的像素噪声独立、同方差且服从各向同性高斯分布,最小化此式等价于极大似然估计;其他噪声模型可能需要加权或稳健损失。齐次投影的尺度由透视除法处理,不另为每幅图引入一个自由 λi。
Levenberg-Marquardt 优化
把所有观测分量堆叠为固定向量 y,预测记为 F(β),残差为 e=y−F(β),则
S(β)=∥y−F(β)∥2,F(β+δ)≈F(β)+Jδ.
若有 M 个标量观测、p 个参数,预测函数的 Jacobian 为
J=∂β∂F=∂β1∂F1⋮∂β1∂FM⋯⋱⋯∂βp∂F1⋮∂βp∂FM.
固定观测 y 不依赖待估参数,故 ∂y/∂β=0;残差的 Jacobian 则是 −J。一阶近似给出
S(β+δ)≈∥e−Jδ∥2,JTJδ=JTe.
加入阻尼 μ>0 后,一种常用 LM 更新为
(JTJ+μI)δ=JTe,δ=(JTJ+μI)−1JTe.
实际通过求解线性方程得到更新,并依据目标函数下降情况调整阻尼;μ 与单应矩阵尺度 λ 是不同的量。
实验步骤与结果分析 #
采集棋盘格图片 #
实验记录使用华谷动力相机 WP-YTUT230M、镜头 WP-5M1614-C 和上述 9×12、单格边长 100 mm 的平面棋盘格,共采集 46 张不同位姿的图片。本文配图是示例,不构成这 46 张输入图的完整清单。
思考问题
- 一般五参数内参的线性初始化至少需要三幅非退化视图,因为每幅图提供两条约束;预设零 skew 后,两幅适当视图理论上可解。实验采用三张或七张子集比较,不代表已确定最优采集数量。
- 应改变棋盘朝向、俯仰、距离和图像中的覆盖位置,避免仅重复相似姿态。能否稳定求解还取决于约束独立性和角点质量。
提取棋盘格角点 #
实验记录使用 Python 的 OpenCV 包提取角点,保留以下两组示例。


叠加显示可用于检查漏检、错序和明显偏移,不能单凭视觉效果证明高精度或亚像素精度。需要结合角点细化方法、残差分布和独立验证来评价定位质量。
思考问题
- 每张图的角点数组必须与该张图的棋盘坐标数组逐项对应。规则网格的排序应与
patternSize 的行列约定一致;图上的红色起点不能自动充当跨视图的固定物理角点标记。对称棋盘旋转后尤其需要核对坐标约定。
- 常规完整棋盘检测要求所选内角点网格可见。标定的核心条件是每幅图中三维点和二维点数量一致、顺序对应,而不是所有标定方法都必须看到整块棋盘。本文未附角点数组和提取脚本,无法进一步核验实际索引。
求解单应性矩阵 #
原记录给出以下两个单应矩阵及一张示例图,未保存两个矩阵各自对应的完整图像编号与角点数据。

−9.413411−66.9741140.01417995.1653315.1411560.010800432.481612877.7661911.000000,−4.172529−77.1344680.01697695.51842441.1203960.020178603.945823737.4513131.000000.
矩阵末项均规范为 1。平面坐标的单位、原点和轴向会影响矩阵各元素;在缺少点数组时,不据这些数值推断物理尺度。
估计相机的内参和外参 #
1. 初始化内参 #
记录中的内参矩阵为
K=3471.6513080.0000000.0000000.0000003474.1805140.000000982.124233599.3592461.000000.
即 fx=3471.651308 px、fy=3474.180514 px,主点为 (cx,cy)=(982.124233,599.359246) px。
下面的物理量换算沿用原记录的像素间距 pixel_pitch 为 4.8 μm=0.0048 mm、分辨率为 1920×1200 的条件。相机规格出处、采集时是否缩放或裁剪尚未附齐,故这些是有条件的换算值,不是新的硬件测量。
fx,mmfy,mmsensor_widthsensor_height=3471.651308×0.0048≈16.6639 mm,=3474.180514×0.0048≈16.6761 mm,=1920×0.0048=9.2160 mm,=1200×0.0048=5.7600 mm.
视场角口径。 忽略畸变并近似主点居中时,水平视场使用 fx,垂直视场使用 fy:
FOVxFOVy≈2arctan2fx,mmsensor_width=2arctan2fx1920,≈2arctan2fy,mmsensor_height=2arctan2fy1200.
将弧度转为角度,原记录的参考焦距 fspec=16.0 mm 对应水平 32.133∘、垂直 20.408∘;由标定内参换算得到水平 30.915∘、垂直 19.597∘。后一个值须使用 fy,mm≈16.6761 mm,不能把水平焦距 16.6639 mm 代入垂直公式。
若保留主点偏移,采用连续图像边界 [0,W]×[0,H] 和零 skew 的无畸变模型,则
FOVxFOVy=arctanfxcx+arctanfxW−cx,=arctanfycy+arctanfyH−cy.
这里是在指定模型下计算图像边界张角;畸变、裁剪和去畸变后的有效区域会改变实际可用视场。下表保留原记录采用的居中近似,不与其他 FOV 口径混算。
参数对比
| 参数 | 参考值(原记录) | 估计值(原记录) | 带符号差 | 原记录百分比 |
|---|
| fx(px) | 3333.33 px | 3471.651 px | +138.32 px | +4.15% |
| fy(px) | 3333.33 px | 3474.181 px | +140.85 px | +4.23% |
| f(mm,使用水平焦距) | 16.00 mm | 16.6639 mm | +0.6639 mm | +4.15% |
| cx(px) | 960.0 px | 982.124 px | +22.12 px | +1.152% |
| cy(px) | 600.0 px | 599.359 px | -0.64 px | -0.053% |
| FOVx | 32.133° | 30.915° | -1.218° | -3.79% |
| MSE(定义、单位待核对) | 未记录 | 0.463979 | 未记录 | 未记录 |
表中“带符号差”是估计值减参考值,不是数学上的绝对值。焦距和 FOV 的百分比以相应参考值为分母;cx 的 +1.152% 以图像宽度 1920 为分母,cy 的 -0.053% 以高度 1200 为分母,不能解读为相对主点参考值的百分比误差。主点取图像中心仅是参考假设,不是已知真值。
MSE 待核对。 0.463979 保持原记录标签。缺少计算代码时,不能判定它是均方误差、RMS 重投影误差或其他汇总量,也不能替它指定 px 或 px²。OpenCV calibrateCamera 的返回值定义为整体 RMS 重投影误差,但没有证据证明此数值就是该返回值。OpenCV 标定返回值
2. 计算外参 #

以下数值按原记录保留:
rvec = (-0.1623, -0.8116, -1.6377)
tvec = (-5.9215, 2.9969, 37.3366)
rot_deg = 105.14
trans_norm = 37.92
按 Rodrigues 旋转向量约定,rvec 的模是旋转角(弧度),换算角度与所列 rot_deg 的舍入值相符。tvec 和 trans_norm 的长度单位取决于棋盘三维点数组:输入若使用 mm,输出才是 mm;若使用单格为 1 的坐标,则输出是格长单位。由于未附点数组,暂不将 37.92 解释为某个实际长度。
在 Xc=RXw+t 的约定下,t 也不是相机中心的世界坐标;后者为 −RTt。
分析标定误差 #
下表保留两种图像数量下的全部组别及数值。“重投影误差(px)”沿用原表名称;均值的计算流程、是否为 RMS、是否按角点加权,以及“±”是否表示标准差,现有材料均未说明。
| 标定图像数量 | 组别 | 重投影误差(px) | 主点坐标 [cx,cy] |
|---|
| 3 | 第一组 | 1.5836 | [981.05, 635.81] |
| 3 | 第二组 | 1.3101 | [883.89, 626.09] |
| 3 | 第三组 | 0.4751 | [1006.99, 605.07] |
| 3 | 随机 50 次均值 | 0.8243 | [970.88, 603.85] ± [54.79, 48.79] |
| 7 | 第一组 | 0.4551 | [1010.55, 538.60] |
| 7 | 第二组 | 0.3844 | [976.00, 557.00] |
| 7 | 第三组 | 0.6414 | [1008.33, 583.30] |
| 7 | 随机 50 次均值 | 0.49 | [979.58, 600.85] ± [38.03, 27.42] |
为说明不同误差口径的区别,设 N 个观测角点的二维像素残差为 ej:
MSEpointRMSpointmean distance=N1j=1∑N∥ej∥2,=N1j=1∑N∥ej∥2,=N1j=1∑N∥ej∥.
这些是用于澄清口径的定义,不是对表中数值计算方式的追认。若按 2N 个标量坐标平均,MSE 又会相差一倍;先平均各图指标与合并全部角点计算也可能不同。
在原记录口径一致的前提下,七张子集的随机均值低于三张子集,主点后所列的“±”数值也较小,但个别组别仍有波动。缺少抽样索引、随机种子、各图误差和统计定义,不能进一步宣称差异具有统计显著性,也不能把训练图上的拟合误差当作独立测试精度。
可能的误差来源包括角点定位偏移、图像模糊、棋盘非平面、位姿覆盖不足,以及模型与镜头实际畸变不匹配;本页数据不足以判断哪一项占主导。
可改进的检查步骤:
- 逐图检查残差与角点对应,记录异常样本的原因;按事先明确的质量准则处理模糊或误检图片,不能只因误差较大就剔除以降低汇总数值。
- 增加朝向、俯仰、距离与画面边缘位置的覆盖,避免仅重复相近姿态。
- 保存每次子集索引和随机种子,重复比较参数稳定性;用未参与拟合的图像、明确的指标和误差分布评价泛化效果。
结论与讨论 #
现有记录包含棋盘格示例、两个单应矩阵、一组内参、一组外参,以及三张和七张图像子集的误差对比。它们可以支持对计算过程和报告数值的核查,但尚不足以验证完整的畸变校正流程:畸变系数、去畸变前后对照及逐视图残差没有随文给出。
内参对应的水平焦距约为 16.6639 mm、垂直焦距约为 16.6761 mm,与参考 16 mm 的差异约为 4.15% 和 4.23%。参考焦距并非独立标定真值,接近规格值不能单独证明模型正确或精度达标。主点偏移也不能仅凭数值归因为装配偏心,或直接判定为工业相机的正常误差范围。
后续核验需补齐输入图像清单、棋盘尺寸及内角点约定、完整脚本与参数、畸变系数、误差定义和抽样记录。在这些材料补齐前,本文作为实验记录与原理说明保留,不宣称可直接复现全部结果。
讨论
评论
正在加载评论…