R 和 t 是左相机的外参(从世界坐标系到相机坐标系)这个RT怎么得到的?

要获取左相机的外参矩阵 R(旋转矩阵)和 t(平移向量),即从世界坐标系到左相机坐标系的变换关系,需要通过 相机标定手眼标定(如适用)来实现。以下是详细步骤和方法:


1. 相机标定获取内参和外参

(1) 单目标定(获取内参)

使用棋盘格或标定板进行单相机标定,获取左相机的 内参矩阵 K畸变系数 dist

import cv2
import numpy as np

# 读取标定板图像
images = [cv2.imread(f'calib_{i}.jpg') for i in range(N)]

# 定义棋盘格角点尺寸 (e.g., 9x6)
pattern_size = (9, 6)
obj_points = []  # 3D世界坐标 (Z=0)
img_points = []  # 2D图像坐标

# 生成标定板的世界坐标 (假设方格大小为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)

# 检测角点
for img in images:
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, pattern_size)
    if ret:
        obj_points.append(objp)
        img_points.append(corners)

# 单目标定
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
    obj_points, img_points, gray.shape[::-1], None, None
)
  • 输出
    • K:内参矩阵(3×3)
    • rvecs, tvecs:每张标定图像的旋转向量和平移向量(世界坐标系→相机坐标系)

(2) 外参的提取

对于单张标定图像,外参 Rt 可通过以下方式获取:

# 选择一张标定图像 (e.g., 第一张)
rvec, tvec = rvecs[0], tvecs[0]

# 将旋转向量转换为旋转矩阵
R, _ = cv2.Rodrigues(rvec)  # R: 世界坐标系 → 相机坐标系
t = tvec.reshape(3, 1)      # t: 世界坐标系 → 相机坐标系
  • 注意:此处的 Rt标定板坐标系到相机坐标系 的变换。若标定板坐标系定义为世界坐标系,则直接使用;否则需进一步转换。

2. 立体标定(获取双相机相对外参)

如果是双目系统,需要通过立体标定获取左右相机之间的相对外参 RT

# 假设已获取左右相机的内参 K1, dist1, K2, dist2
# 并已分别标定左右相机的图像角点 img_points_left, img_points_right

# 立体标定
ret, K1, dist1, K2, dist2, R, T, E, F = cv2.stereoCalibrate(
    obj_points, img_points_left, img_points_right,
    K1, dist1, K2, dist2, gray.shape[::-1],
    flags=cv2.CALIB_FIX_INTRINSIC
)
  • 输出
    • R, T:右相机相对于左相机的外参(即左相机坐标系→右相机坐标系)
    • 若需要世界坐标系→左相机的外参,需结合标定板坐标系定义。

3. 手眼标定(机器人/机械臂场景)

当相机安装在机械臂上时,需通过 手眼标定 获取相机坐标系与机器人基坐标系的变换关系(R_base_to_cam, t_base_to_cam):

# 假设已获取多组机械臂末端位姿 (R_gripper2base, t_gripper2base)
# 和标定板到相机的位姿 (R_target2cam, t_target2cam)

# 手眼标定 (AX=XB)
R_base_to_cam, t_base_to_cam = cv2.calibrateHandEye(
    R_gripper2base_list, t_gripper2base_list,
    R_target2cam_list, t_target2cam_list
)
  • 结果
    R_base_to_camt_base_to_cam 表示机器人基坐标系到相机坐标系的变换。

4. 世界坐标系的定义

  • 标定板坐标系
    若以标定板为世界坐标系,则单目标定的 Rt 即为世界→相机的变换。
  • 自定义世界坐标系
    需通过已知的标定板位姿或其他传感器(如IMU、激光雷达)对齐。

关键总结

方法 获取的外参 适用场景
单目标定 标定板坐标系 → 相机坐标系 单相机或已知世界坐标系
立体标定 左相机坐标系 → 右相机坐标系 双目系统
手眼标定 机器人基坐标系 → 相机坐标系 机械臂搭载相机

验证外参的正确性

  1. 重投影误差检查

    # 使用R, t将世界坐标投影到图像
    projected, _ = cv2.projectPoints(objp, rvec, tvec, K, dist)
    error = cv2.norm(img_points[0], projected, cv2.NORM_L2) / len(projected)
    print("重投影误差:", error)  # 应 < 0.5像素
    
  2. 坐标系一致性验证
    将已知物理尺寸的物体放置在标定板原点,检查计算的3D坐标是否符合实际。


通过以上步骤,您可以准确获取从世界坐标系到左相机坐标系的变换参数 Rt

posted @ 2025-07-07 09:55  aisuanfa  阅读(123)  评论(0)    收藏  举报