ArUco/Charuco 检测是计算机视觉里常用的“人工标记”识别与位姿估计技术,常用于相机标定、外参标定、AR 放置、机器人定位等。

核心概念

  • ArUco 标记
    • 黑白方形靶标,外黑框、内为二值编码格子(如 4x4/5x5/6x6),每个标记有唯一 ID,来自某个“字典”(dictionary)。
    • 检测输出:每个标记的四个角点像素坐标和其 ID;已知相机内参与实际边长即可估计相机 - 标记的位姿(rvec/tvec)。
  • Charuco 板
    • “Chessboard + ArUco”的混合标定板:棋盘格上嵌入 ArUco 小方块。
    • 流程:先检出 ArUco,利用其 ID 确认棋盘格几何关系,再对棋盘交点做亚像素精确定位。
    • 优点:比纯 ArUco 更精确(棋盘角点可亚像素)、比纯棋盘更鲁棒(部分遮挡/运动模糊时仍可依赖 ArUco ID 关联),非常适合相机标定与外参标定。

工作流程(简述)

  1. 读取图像并转灰度;选择 ArUco 字典(如 DICT_5X5_100)。
  2. detectMarkers → 返回 corners、ids。
  3. 如需位姿:estimatePoseSingleMarkers(需相机内参、畸变和标记实边长)。
  4. Charuco:
    • 创建 CharucoBoard(指定棋盘尺寸、squareLength、markerLength、字典)。
    • detectMarkers → interpolateCornersCharuco → 得到棋盘交点与其 ID。
    • 标定:calibrateCameraCharuco;位姿:estimatePoseCharucoBoard 或用 solvePnP。

OpenCV 常用接口(cv2.aruco/cv::aruco)

  • getPredefinedDictionary / Dictionary
  • detectMarkers, drawDetectedMarkers
  • estimatePoseSingleMarkers, drawAxis
  • CharucoBoard, interpolateCornersCharuco
  • calibrateCameraCharuco, estimatePoseCharucoBoard
  • refineDetectedMarkers(在拥挤或部分遮挡场景提升检测)

应用场景

  • 单目/双目相机标定与多传感器外参标定
  • 机器人/无人机定位与导航、视觉伺服
  • AR 虚实对齐、工位/夹具定位

实用建议

  • 选字典与尺寸:距离远/分辨率低时用更大标记或更高基元数的字典(5x5/6x6),保证打印质量与对比度。
  • 标定用 Charuco:设定准确的 squareLength 与 markerLength(单位一致,毫米/米皆可),拍摄尽量覆盖不同姿态与视场。
  • 光照与清晰度:避免强反光与运动模糊;开启亚像素角点优化可提升精度。
  • 与 AprilTag 对比:AprilTag 在远距/低质图像上常更稳、更准;ArUco 在 OpenCV 里集成度高、易用、速度也很快。

极简示例(Python,思路展示)

  • ArUco 位姿
    • dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_100)
    • corners, ids, _ = cv2.aruco.detectMarkers(gray, dict)
    • rvecs, tvecs, _ = cv2.aruco.estimatePoseSingleMarkers(corners, marker_length_m, K, dist)
  • Charuco 标定
    • board = cv2.aruco.CharucoBoard((cols, rows), square_len_m, marker_len_m, dict)
    • corners, ids, _ = cv2.aruco.detectMarkers(gray, dict)
    • ok, ch_corners, ch_ids = cv2.aruco.interpolateCornersCharuco(corners, ids, gray, board, cameraMatrix=K, distCoeffs=dist)
    • 标定:cv2.aruco.calibrateCameraCharuco(…累积多帧的 ch_corners/ch_ids/board…)