相机标定基础概念

相机标定是确定相机内参(焦距、主点、畸变系数)和外参(相机与世界坐标系的转换关系)的过程。内参描述相机自身的光学特性,外参描述相机在空间中的位姿。标定精度直接影响视觉伺服控制的定位和跟踪性能。

内参校准方法与步骤

棋盘格标定法(OpenCV实现)
使用已知尺寸的棋盘格图案,通过多角度拍摄获取图像。调用cv2.calibrateCamera()计算内参矩阵和畸变系数。
关键参数:

  • 内参矩阵形式:
    $$ \begin{bmatrix} f_x & 0 & c_x \ 0 & f_y & c_y \ 0 & 0 & 1 \end{bmatrix} $$
    其中$(f_x, f_y)$为焦距,$(c_x, c_y)$为主点坐标。

代码示例

import cv2
import numpy as np

# 准备棋盘格角点坐标
pattern_size = (9, 6)  # 内角点数量
obj_points = []  # 3D世界坐标
img_points = []  # 2D图像坐标

# 生成标定板3D坐标 (假设方格边长为1单位)
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)

# 检测角点并保存
images = glob.glob('calib_images/*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
    if ret:
        obj_points.append(objp)
        img_points.append(corners)

# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
    obj_points, img_points, gray.shape[::-1], None, None
)

外参校准方法

手眼标定(Eye-in-Hand)
当相机固定在机械臂末端时,需通过AX=XB求解相机与末端的变换关系。使用OpenCV的cv2.calibrateHandEye()

  • 输入机械臂末端位姿$T_{robot}$和标定板位姿$T_{target}$
  • 输出相机到末端的变换矩阵$T_{cam}^{robot}$

标定流程

  1. 机械臂移动至多个不同位姿并拍摄标定板
  2. 通过PnP算法计算标定板相对于相机的位姿$T_{target}^{cam}$
  3. 组合机械臂运动链方程求解手眼矩阵

误差分析与优化

主要误差来源

  • 图像噪声:角点检测误差导致重投影误差增大,可通过亚像素优化(cv2.cornerSubPix())降低
  • 标定板制造误差:棋盘格物理尺寸偏差需控制在0.01mm以内
  • 运动非线性:机械臂重复定位误差影响手眼标定结果

验证方法

  • 重投影误差:通常要求<0.5像素
    mean_error = np.mean([cv2.norm(img_points[i], cv2.projectPoints(...)[1], cv2.NORM_L2) for i in range(len(obj_points))])
    

  • 实际场景测试:在视觉伺服控制中验证目标跟踪精度

实际应用建议

  • 标定环境光照需均匀,避免反光或阴影干扰角点检测
  • 标定板覆盖相机视场60%以上,倾斜角度多样化(建议≥15组数据)
  • 在线标定补偿:长时间运行后可通过特征点匹配动态修正外参
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐