C++ OpenCV 手眼标定
时间: 2025-02-16 07:11:21 浏览: 108
手眼标定是指在机器人视觉系统中,确定相机(眼)坐标系与机械臂末端执行器(手)坐标系之间相对变换的过程。通过手眼标定可以获得两者之间的转换矩阵,在后续的应用如抓取、操作等任务中能够将图像信息准确映射到实际物理空间。
使用C++结合OpenCV库来进行手眼标定的操作步骤大致如下:
### 准备阶段
- **采集数据**:移动机器人的手臂并记录若干组位置姿态以及对应状态下所拍摄的图片序列;
- **特征点提取**:从每张图上找到棋盘格角点或其他易于识别的目标物作为参考标志,并计算其像素坐标;
### 计算过程
1. 利用`findChessboardCorners()`函数检测出所有已知尺寸的标准图案内每个方块交界处的关键点,并利用 `drawChessboardCorners()` 将结果可视化出来确认无误后保存下来备用。
2. 调用手眼标定API例如opencv_contrib模块下的 `cv::calib3d::handEyeCalibration(...)` 来求解旋转和平移向量组成的外参矩阵R,t;
- 其输入包括但不限于上述获取到的手部运动轨迹集合及对应的视点变化后的物体关键点集。
```cpp
std::vector<cv::Mat> rvecs, tvecs; // 存储各时刻下相对于初始状态的眼-世界间的旋转向量和平移向量.
std::vector<std::vector<cv::Point3f>> objPoints; // 物体模型坐标 (如棋盘格)
std::vector<std::vector<cv::Point2f>> imgPoints; // 图像平面坐标
// ... 省略了填充objPoints和imgPoints的具体代码...
cv::Vec3d R_gripper2base, T_gripper2base;
bool success = cv::handeye::calibrateRobotWorldHandEye(
robot_poses /* N*6维的手臂位姿数组 */,
camera_poses/* 相机内外参校准得到的结果 */,
&R_gripper2base,
&T_gripper2base);
if (!success) {
std::cerr << "Failed to calibrate hand-eye setup." << endl;
}
```
完成以上步骤之后我们就得到了描述“手”(gripper)到"基座"(robot base frame)间固定不变的姿态关系\[R|t\] 。这允许我们将摄像头感知的信息转化为全局参照系内的表达形式,进而指导机械臂更精准地定位目标物品的位置与方向啦!
阅读全文
相关推荐

















