1. 相机内参数标定的必要性
在计算机视觉和摄影测量领域,相机标定是一项基础而关键的工作。当我们使用相机进行精确测量或三维重建时,仅仅依靠原始图像数据是不够的。这是因为现实中的相机都存在各种光学和机械上的不完美,导致成像结果与理想的小孔成像模型存在偏差。
1.1 现实相机的成像缺陷
所有市售相机都存在不同程度的成像缺陷,主要包括以下几种类型:
-
镜头畸变:这是最常见的成像问题,分为径向畸变和切向畸变两种。径向畸变使图像边缘的直线变弯曲,切向畸变则导致图像出现倾斜变形。
-
传感器安装误差:相机的图像传感器(CMOS/CCD)可能没有完全平行于镜头平面,造成图像整体倾斜。
-
像素非正方形:虽然现代工业相机已经改善很多,但早期相机的像素可能不是完美的正方形,导致图像在x和y方向上的比例不一致。
-
主点偏移:理论上光轴应该与图像中心相交,但实际上由于装配误差,这个交点可能偏离图像中心几个像素。
1.2 不进行标定的后果
如果不进行相机标定就直接使用原始图像数据,会导致一系列严重问题:
-
几何测量误差:图像中的直线会显示为曲线,距离和角度测量都会出现偏差。例如在工业检测中,这种误差可能导致产品尺寸测量错误。
-
三维重建失败:基于未标定相机的三维重建会产生扭曲的结果,无法准确还原物体的真实形状和位置。
-
视觉算法性能下降:SLAM系统会出现漂移,目标跟踪容易丢失,图像拼接会出现错位等问题。
实际案例:在某工业检测项目中,使用未标定的相机测量零件尺寸,结果与真实值相差高达5%。经过标定后,测量误差降至0.3%以内。
2. 相机成像模型与坐标系
2.1 四大坐标系解析
理解相机标定需要先掌握四个关键坐标系及其转换关系:
-
世界坐标系:真实世界的三维坐标系,单位通常是毫米或米。可以根据需要自由定义,比如以检测台的一个角为原点。
-
相机坐标系:以相机光心为原点,Z轴沿光轴方向的坐标系。X/Y轴平行于成像平面。
-
像平面坐标系:成像平面的二维坐标系,原点在光轴与成像平面的交点(主点),单位是毫米。
-
像素坐标系:数字图像的坐标系,原点通常在左上角,单位是像素。
2.2 相机成像数学模型
相机的成像过程可以用数学公式精确描述。从世界坐标系到像素坐标系的转换分为几个步骤:
-
世界坐标系→相机坐标系:通过旋转矩阵R和平移向量T实现
code复制P_camera = R·P_world + T -
相机坐标系→像平面坐标系:使用小孔成像模型
code复制x' = f·X/Z y' = f·Y/Z -
像平面坐标系→像素坐标系:考虑主点偏移和像素尺寸
code复制u = α·x' + c_x v = β·y' + c_y
这些转换可以合并为一个投影矩阵M:
code复制M = K·[R|T]
其中K是内参矩阵,包含焦距、主点等参数;[R|T]是外参矩阵,描述相机在世界中的位置和方向。
2.3 畸变模型
实际相机还需要考虑畸变效应,主要有两种:
-
径向畸变:图像边缘的直线变弯曲,包括桶形畸变(边缘向内弯曲)和枕形畸变(边缘向外弯曲)。可以用多项式模型校正:
code复制x_corrected = x(1 + k1·r² + k2·r⁴ + k3·r⁶) y_corrected = y(1 + k1·r² + k2·r⁴ + k3·r⁶) -
切向畸变:由于镜头与传感器不平行导致,校正公式为:
code复制x_corrected = x + [2·p1·x·y + p2·(r²+2x²)] y_corrected = y + [p1·(r²+2y²) + 2·p2·x·y]
3. 张正友棋盘格标定法实践
3.1 标定前的准备工作
硬件准备:
- 待标定相机(建议使用工业相机)
- 棋盘格标定板(建议使用高精度印刷或购买的标定板)
- 稳定的拍摄平台(如三脚架)
标定板要求:
- 棋盘格尺寸要精确测量(如25mm×25mm)
- 表面平整无褶皱
- 黑白对比度要高
图像采集技巧:
- 拍摄15-20张不同角度和位置的标定板图像
- 覆盖图像的不同区域(中心、四角)
- 包含不同倾斜角度(0°-45°)
- 包含不同距离(近、中、远)
- 保持相机参数固定(焦距、光圈、白平衡)
3.2 标定步骤详解
角点检测:
使用OpenCV的findChessboardCorners函数检测棋盘格角点,然后用cornerSubPix进行亚像素级精确定位。
python复制# 角点检测示例代码
pattern_size = (11, 8) # 内角点数量
square_size = 25.0 # 棋盘格尺寸(mm)
# 准备世界坐标系中的角点坐标
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1,2) * square_size
# 检测图像中的角点
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:
# 亚像素精确化
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
相机标定:
使用calibrateCamera函数计算相机参数。
python复制# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
print("相机内参矩阵:")
print(mtx)
print("畸变系数:")
print(dist)
标定结果评估:
计算重投影误差,评估标定质量。
python复制mean_error = 0
for i in range(len(obj_points)):
imgpoints2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], mtx, dist)
error = cv2.norm(img_points[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)
mean_error += error
print("平均重投影误差: {} 像素".format(mean_error/len(obj_points)))
经验分享:重投影误差小于1像素为优秀,1-2像素为可接受,大于2像素则需要重新标定。在工业应用中,我们通常要求误差小于0.5像素。
4. 标定结果的应用与验证
4.1 图像畸变校正
获得相机参数后,可以对图像进行畸变校正:
python复制# 方法1:直接校正
dst = cv2.undistort(img, mtx, dist, None, mtx)
# 方法2:先计算映射再校正(适合批量处理)
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
mapx, mapy = cv2.initUndistortRectifyMap(mtx, dist, None, newcameramtx, (w,h), 5)
dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
4.2 校正效果验证
校正后需要验证效果:
- 观察图像中的直线是否变直
- 重新测量已知尺寸物体的长度,检查比例是否正确
- 使用校正后的图像重新检测角点,检查排列是否规则
5. 标定精度提升技巧
5.1 常见问题与解决方案
-
角点检测失败:
- 原因:图像模糊、光照不均、标定板遮挡
- 解决:重新采集清晰图像,确保光照均匀,标定板完整可见
-
重投影误差过大:
- 原因:标定板图像数量不足、角度变化不够
- 解决:增加标定板图像数量(建议20张以上),覆盖更多角度和位置
-
标定结果不稳定:
- 原因:相机参数变化、标定板移动
- 解决:固定相机参数,使用稳固的三脚架
5.2 高级技巧
-
多组标定取平均:进行3-5次独立标定,取内参的平均值,减少随机误差。
-
温度补偿:工业环境中,温度变化可能影响镜头焦距,可在不同温度下标定,建立温度-内参关系模型。
-
区域标定:对于大视场相机,可以分区标定,建立位置-内参映射表,提高局部精度。
6. 不同场景的标定策略
6.1 工业相机标定
特点:固定焦距、固定安装
建议:
- 使用高精度标定板
- 标定后锁定焦距和光圈
- 定期复检(建议每3个月一次)
6.2 手机相机标定
特点:可能使用数码变焦、自动参数调整
建议:
- 禁用自动模式,固定所有参数
- 避免使用数码变焦
- 使用手机支架保持稳定
6.3 远距离拍摄标定
特点:景深小、大气扰动
建议:
- 增加标定距离范围
- 使用更大尺寸的标定板
- 考虑大气折射影响(超远距离时)
7. 标定工具与扩展
7.1 常用标定工具对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| OpenCV | 免费、灵活 | 需要编程 | 通用 |
| MATLAB标定工具箱 | 易用、可视化 | 需要授权 | 学术研究 |
| ROS相机标定 | 支持多种传感器 | 需要ROS环境 | 机器人 |
| Kalibr | 支持相机-IMU标定 | 配置复杂 | SLAM系统 |
7.2 扩展应用
-
双目相机标定:除了单目标定外,还需要标定两个相机之间的相对位置(外参),用于立体视觉。
-
相机-激光雷达标定:建立相机和激光雷达的坐标转换关系,用于多传感器融合。
-
在线标定:在系统运行过程中自动更新标定参数,适应环境变化。
8. 实战经验分享
在实际项目中积累的一些宝贵经验:
-
标定板选择:
- 普通应用:打印的棋盘格足够
- 高精度应用:建议使用玻璃或陶瓷标定板
- 大视场应用:标定板要足够大,或采用多板拼接
-
光照控制:
- 避免强光直射造成反光
- 避免阴影覆盖角点
- 建议使用均匀的漫射光源
-
标定时机:
- 相机首次安装时必须标定
- 更换镜头后需要重新标定
- 长期使用后建议定期复检(特别是工业环境)
-
参数验证:
- 使用标定结果测量已知尺寸物体,验证准确性
- 在不同距离测试测量误差
- 检查图像边缘的畸变校正效果
通过系统的标定过程和严格的验证,可以确保相机在各种计算机视觉应用中获得准确可靠的测量结果。标定虽然是前期工作,但却是整个视觉系统精度的基础,值得投入足够的时间和精力。