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) 外参的提取
对于单张标定图像,外参 R 和 t 可通过以下方式获取:
# 选择一张标定图像 (e.g., 第一张)
rvec, tvec = rvecs[0], tvecs[0]
# 将旋转向量转换为旋转矩阵
R, _ = cv2.Rodrigues(rvec)  # R: 世界坐标系 → 相机坐标系
t = tvec.reshape(3, 1)      # t: 世界坐标系 → 相机坐标系
- 注意:此处的 R和t是 标定板坐标系到相机坐标系 的变换。若标定板坐标系定义为世界坐标系,则直接使用;否则需进一步转换。
2. 立体标定(获取双相机相对外参)
如果是双目系统,需要通过立体标定获取左右相机之间的相对外参 R 和 T:
# 假设已获取左右相机的内参 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_cam和t_base_to_cam表示机器人基坐标系到相机坐标系的变换。
4. 世界坐标系的定义
- 标定板坐标系:
 若以标定板为世界坐标系,则单目标定的R和t即为世界→相机的变换。
- 自定义世界坐标系:
 需通过已知的标定板位姿或其他传感器(如IMU、激光雷达)对齐。
关键总结
| 方法 | 获取的外参 | 适用场景 | 
|---|---|---|
| 单目标定 | 标定板坐标系 → 相机坐标系 | 单相机或已知世界坐标系 | 
| 立体标定 | 左相机坐标系 → 右相机坐标系 | 双目系统 | 
| 手眼标定 | 机器人基坐标系 → 相机坐标系 | 机械臂搭载相机 | 
验证外参的正确性
- 
重投影误差检查: # 使用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像素
- 
坐标系一致性验证: 
 将已知物理尺寸的物体放置在标定板原点,检查计算的3D坐标是否符合实际。
通过以上步骤,您可以准确获取从世界坐标系到左相机坐标系的变换参数 R 和 t。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号