Skip to the content.

Week 12:手机摄像头、ArUco 识别与距离估算实验

实验基本信息

课程:AI Robotics
主题:手机摄像头输入、ArUco 标记识别、距离估算
工具:Python、OpenCV、ArUco、WSL

本周实验围绕机器人视觉展开。目标是理解机器人如何通过摄像头识别视觉标记,并根据图像中的像素尺寸估算目标与摄像头之间的距离。

实验目标

本周完成的内容包括:

  1. 使用 OpenCV 生成 ArUco 标记。
  2. 使用 DICT_4X4_50 字典识别 ArUco。
  3. 识别课堂要求的 ArUco ID 6。
  4. 根据标记像素宽度估算距离。
  5. 保存识别结果图和距离估算图。

文件结构

week12/
|-- README.md
|-- aruco_generate_detect.py
|-- img/
|   |-- aruco_detect.png
|   |-- distance_demo.png
|   |-- screenshot_1.png
|   |-- screenshot_2.png

实验原理

1. ArUco 标记

ArUco 是一种常用于机器人视觉定位的黑白方形标记。每个标记都有唯一 ID,机器人可以通过摄像头识别 ID 和角点位置。在实际机器人应用中,ArUco 可以用于定位、导航、距离估计和相机标定。

本实验使用:

2. ArUco 识别流程

识别过程主要包括:

  1. 输入图像。
  2. 转换为灰度图。
  3. 检测候选方形区域。
  4. 解码 ArUco ID。
  5. 绘制检测框和 ID 信息。
  6. 根据角点距离估算标记在图像中的像素宽度。

3. 距离估算方法

当已知 ArUco 标记的实际宽度时,可以通过图像中的像素宽度估算距离:

distance = real_marker_width * focal_length / pixel_width

本实验使用简化模型,假设标记实际宽度为 0.05 m,焦距为 700 px。虽然这不是严格标定后的真实摄像头模型,但足够说明“像素宽度越大,目标越近;像素宽度越小,目标越远”的基本关系。

运行方法

python3 aruco_generate_detect.py

程序会在 img/ 目录生成并保存:

实验截图

ArUco ID 6 识别结果

ArUco 识别结果

距离估算结果

距离估算结果

补充截图

补充截图 1

补充截图 2

遇到的问题与解决

问题 原因 解决方案
不同 OpenCV 版本 API 不一致 新旧版本的 ArUco 检测接口不同 在代码中判断 ArucoDetector 是否存在,兼容两种写法
距离估算不是实际测量值 焦距没有经过真实相机标定 在 README 中说明这是简化估算模型
标记图像过小会影响识别 角点检测需要清晰边界 生成 300 像素标记,并放在白色画布中央

学习总结

通过本周实验,我理解了机器人视觉识别的基本流程:图像输入、标记检测、ID 解码、角点提取和距离估算。ArUco 标记虽然简单,但它把视觉感知和空间定位连接起来,是机器人实验中非常实用的工具。后续如果使用手机摄像头或机器人摄像头,只需要把输入图像换成实时视频帧,就可以扩展成在线识别系统。