2. 相机模型与标定数学基础
在HALCON中做标定,第一步不是急着调用算子,而是先弄清楚“相机是怎么把三维世界变成二维像素”的。这个映射关系由相机模型描述,标定的本质就是求解模型中的未知参数。本节围绕针孔模型、畸变模型、内外参含义、坐标系变换以及HALCON标定算子体系展开,为后续实操打下数学基础。
针孔模型:理想成像的几何抽象
针孔模型(Pinhole Model)是最基础的透视投影模型。它假设光线通过一个理想的小孔,在像平面上形成倒立的实像。在数学上,我们通常把像平面等效到光心前方,得到正立的像,便于推导。设世界坐标系中一点 P_w = (X_w, Y_w, Z_w),经过刚体变换到相机坐标系 P_c = (X_c, Y_c, Z_c),再投影到图像平面:
u = f_x * (X_c / Z_c) + c_x
v = f_y * (Y_c / Z_c) + c_y
其中 f_x = f / s_x,f_y = f / s_y,f 为焦距,s_x、s_y 为像元物理尺寸,c_x、c_y 为主点坐标(光轴与像平面的交点)。这四个量 f_x、f_y、c_x、c_y 构成相机的内参,描述相机自身的成像特性,与相机在空间中的位置无关。
畸变模型:真实镜头的偏差修正
针孔模型是理想化的,真实镜头存在畸变,尤其是短焦镜头。HALCON主要考虑径向畸变和切向畸变。径向畸变使点沿径向偏离理想位置,用 K1、K2、K3 描述;切向畸变由镜头与像面不平行引起,用 P1、P2 描述。设归一化坐标 (x, y),畸变后的坐标为:
x_d = x(1 + K1*r² + K2*r⁴ + K3*r⁶) + 2*P1*x*y + P2*(r² + 2x²)
y_d = y(1 + K1*r² + K2*r⁴ + K3*r⁶) + P1*(r² + 2y²) + 2*P2*x*y
其中 r² = x² + y²。HALCON标定得到的畸变参数会与内参一起用于图像校正,change_radial_distortion_cam_par 和 change_radial_distortion_image 就是常用的畸变处理算子。理解畸变模型的意义在于:标定不只是求焦距和主点,还要把镜头偏差一并解算出来,否则测量精度会随视场位置变化而漂移。
外参:相机在世界中的位姿
外参描述相机坐标系与世界坐标系之间的刚体变换,包括旋转矩阵 R 和平移向量 t。HALCON中常用位姿(Pose)表示,即 Pose = (x, y, z, rx, ry, rz),前三个是平移,后三个是绕坐标轴的旋转(默认按Z-Y-X顺序,单位为弧度)。外参把世界点变换到相机坐标系:
P_c = R * P_w + t
在标定中,外参通常对应标定板相对于相机的位置。如果相机固定、标定板移动,每个位姿对应一次标定板摆放;如果标定板固定、相机移动,则外参描述相机在不同位置的位姿。HALCON的 calibrate_cameras 会同时输出内参和每个标定图像对应的外参。
坐标系变换链
从世界点到像素点,完整变换链为:世界坐标系 → 相机坐标系 → 图像坐标系(归一化) → 像素坐标系。每一步都有明确的数学操作:刚体变换、透视除法、畸变叠加、仿射缩放与平移。理解这条链,才能在标定结果异常时定位问题出在哪一环。例如,重投影误差大,可能是外参位姿估计不准;边缘畸变校正不干净,可能是畸变系数阶数不够。
HALCON标定算子体系概览
HALCON把标定流程封装成一套数据驱动的算子链,核心是 CalibData 句柄。典型流程如下:
create_calib_data:创建标定数据模型,指定相机数量和标定板描述文件。set_calib_data_cam_param:设置相机初始内参(可用标称值或粗略估计值)。set_calib_data_calib_object:关联标定板描述文件(如caltab_30mm.descr)。find_calib_object:在每张标定图像中检测标定板并提取角点。calibrate_cameras:执行标定,输出优化后的内参、外参和畸变系数。get_calib_data:读取标定结果,包括相机参数、位姿和重投影误差。
这套算子的设计逻辑是“先采集、后求解”。find_calib_object 负责把图像中的标定板角点坐标提取出来,calibrate_cameras 则把这些观测值与模型预测值做最小二乘优化。标定质量可以通过 get_calib_data 获取的 mean_error 和每张图的误差来评估。如果某张图的误差明显偏大,通常说明该位姿下标定板检测不准或摆放角度过于极端,应剔除后重新标定。
参数含义与常见误区
内参中的 f_x、f_y 单位是像素,不是毫米。如果像元是正方形,理论上 f_x ≈ f_y,但实际制造偏差和标定噪声会让两者略有差异。主点 c_x、c_y 通常接近图像中心,但不一定严格等于 (width/2, height/2)。畸变系数中,K1 通常为负值(桶形畸变),K2 用于修正高阶偏差。若标定结果中 K1 符号异常或量级过大,应检查标定板检测是否正确。
外参的旋转分量在HALCON中默认使用Rodrigues向量或欧拉角表示,具体取决于算子参数设置。使用 pose_to_hom_mat3d 可以把Pose转成4×4齐次变换矩阵,方便与其它坐标系运算。理解外参的物理意义,才能在多相机标定或手眼标定中正确串联各个坐标系。