# 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. 点击"标定"按钮执行标定 ## 技术参数 - **支持的图像格式**: RGB(3 通道) - **标定板类型**: 棋盘格标定板 - **内角点范围**: 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(); ```