147 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

2026-02-18 15:11:41 +08:00
# VrEyeView 使用说明
## 功能概述
VrEyeView 是一个相机图像查看与标定板检测工具,用于:
- 实时显示相机图像
- 检测标定板角点
- 计算标定板位姿(位置和姿态)
- 将检测结果回调给 CalibView 作为相机坐标
## 快速开始
### 1. 独立运行 VrEyeView
```bash
# Windows
cd Tools/VrEyeView
VrEyeView.exe
# Linux
cd Tools/VrEyeView
./VrEyeView
```
### 2. 在 CalibView 中使用
1. 启动 CalibView
2. 菜单栏 -> 工具 -> 相机标定板检测
3. VrEyeView 窗口会打开
## 操作步骤
### 步骤 1: 连接相机
1. 输入相机 IP 地址(默认: 192.168.1.100
2. 点击"连接"按钮
3. 等待连接成功,状态显示"已连接"
### 步骤 2: 配置相机参数
- **曝光**: 调整曝光时间100-10000默认 1000
- **增益**: 调整增益值0-255默认 100
### 步骤 3: 配置标定板参数
- **内角点宽度**: 标定板内部角点的列数(默认 9
- **内角点高度**: 标定板内部角点的行数(默认 6
- **格子大小**: 标定板每个格子的边长,单位 mm默认 30.0
> **注意**: 内角点数量 = 格子数量 - 1
> 例如10x7 的格子标定板,内角点为 9x6
### 步骤 4: 配置相机内参
相机内参需要提前标定,或使用默认值:
- **fx**: 焦距 x默认 1000.0
- **fy**: 焦距 y默认 1000.0
- **cx**: 主点 x默认 640.0
- **cy**: 主点 y默认 480.0
### 步骤 5: 开始采集
1. 点击"开始采集"按钮
2. 图像会实时显示在窗口中
3. 状态显示"采集中"
### 步骤 6: 检测标定板
**手动检测**:
1. 将标定板放置在相机视野内
2. 点击"检测标定板"按钮
3. 如果检测成功,角点会以绿色圆圈标记在图像上
4. 检测结果显示在界面底部
**自动检测**:
1. 勾选"自动检测"复选框
2. 每次获取新图像时会自动检测标定板
3. 检测成功后自动回调到 CalibView
### 步骤 7: 查看检测结果
检测成功后,界面会显示:
```
检测结果: 位置(x, y, z) 姿态(rx°, ry°, rz°)
```
- **位置**: 标定板中心在相机坐标系下的坐标单位mm
- **姿态**: 标定板的欧拉角(单位:度)
## 检测选项
- **自适应阈值**: 使用自适应阈值算法,提高不同光照条件下的检测率
- **归一化图像**: 对图像进行归一化处理,提高检测稳定性
- **自动检测**: 每次获取新图像时自动检测标定板
## 与 CalibView 集成
当在 CalibView 中打开 VrEyeView 时:
1. 检测到标定板后,结果会自动回调到 CalibView
2. 标定板的位置和姿态会自动填充到 CalibView 的相机坐标输入框
3. 可以配合机器人控制工具RobotView进行手眼标定
### 手眼标定流程
1. 在 CalibView 中选择标定模式Eye-To-Hand 或 Eye-In-Hand
2. 打开 VrEyeView 和 RobotView
3. 移动机器人到不同位置
4. 在每个位置:
- RobotView 获取机器人位姿 -> 自动填充到 CalibView
- VrEyeView 检测标定板 -> 自动填充到 CalibView
- 点击"添加"按钮添加数据点
5. 收集足够数据点后(建议 10 组以上)
6. 点击"标定"按钮执行标定
## 技术参数
- **支持的图像格式**: RGB3 通道)
- **标定板类型**: 棋盘格标定板
- **内角点范围**: 2-20 x 2-20
- **格子大小范围**: 1-100 mm
- **位姿计算方法**: OpenCV solvePnP (ITERATIVE)
- **角点精细化**: 亚像素级别11x11 窗口)
## 开发接口
如果需要在其他程序中使用 VrEyeView
```cpp
#include "VrEyeViewWidget.h"
// 创建窗口
VrEyeViewWidget* viewer = new VrEyeViewWidget();
// 设置回调
viewer->SetDetectionCallback([](const ChessboardDetectionData& data) {
if (data.detected) {
// 处理检测结果
qDebug() << "位置:" << data.x << data.y << data.z;
qDebug() << "姿态:" << data.rx << data.ry << data.rz;
}
});
// 显示窗口
viewer->show();
```