手眼标定代码
时间: 2025-07-01 19:02:30 浏览: 4
手眼标定是机器人视觉系统中的关键步骤,其核心在于建立相机与机械手之间的坐标转换关系。实现这一目标的方法包括九点标定、十二点标定以及使用 OpenCV 等库进行的标定方式。以下提供基于 Python 的手眼标定代码示例,帮助理解该过程。
### 手眼标定的 Python 实现
在实际应用中,OpenCV 提供了用于手眼标定的函数 `cv2.calibrateHandEye()`,可以计算出相机与机械手之间的旋转和平移矩阵。以下是具体实现代码:
```python
import numpy as np
import cv2
# 定义一些已知的标定点(例如从棋盘格获取)
pattern_size = (9, 6) # 棋盘格内部角点数
objp = np.zeros((np.prod(pattern_size), 3), dtype=np.float32)
objp[:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
# 存储所有图像的角点坐标和对应的变换矩阵
object_points = [] # 世界坐标系下的点
image_points = [] # 图像坐标系下的点
rvecs = [] # 旋转向量
tvecs = [] # 平移向量
# 假设已经采集到多个位姿的图像并提取了对应角点
# 此处模拟几组数据
for _ in range(5):
# 模拟检测到的角点
image_point = objp + np.random.rand(*objp.shape) * 0.1
image_points.append(image_point)
object_points.append(objp)
# 模拟机械手末端的姿态(R, T)
R = cv2.Rodrigues(np.random.rand(3))[0]
T = np.random.rand(3, 1)
rvecs.append(cv2.Rodrigues(R)[0])
tvecs.append(T)
# 假设相机内参已知
K = np.array([[800, 0, 320],
[0, 800, 240],
[0, 0, 1]], dtype=np.float32)
dist = np.zeros((5, 1)) # 假设无畸变
# 计算手眼标定结果
R_cam2gripper, t_cam2gripper = cv2.calibrateHandEye(
R_gripper2base=rvecs,
t_gripper2base=tvecs,
R_target2cam=rvecs,
t_target2cam=tvecs
)
# 输出结果
print("Camera to Gripper Rotation Matrix:")
print(R_cam2gripper)
print("Camera to Gripper Translation Vector:")
print(t_cam2gripper)
```
以上代码展示了如何通过 OpenCV 进行手眼标定的基本流程。首先定义了棋盘格的世界坐标点,并模拟了几组机械手末端姿态与图像角点数据,最后调用 `cv2.calibrateHandEye()` 函数完成标定[^1]。
### 注意事项
- 在实际操作中,需要确保机械手移动时的精度。
- 相机的内参数需提前标定好。
- 数据采集应覆盖不同角度和位置以提高标定精度[^2]。
阅读全文
相关推荐

















