ArUco/Charuco 检测是计算机视觉里常用的“人工标记”识别与位姿估计技术,常用于相机标定、外参标定、AR 放置、机器人定位等。
核心概念
- ArUco 标记
- 黑白方形靶标,外黑框、内为二值编码格子(如 4x4/5x5/6x6),每个标记有唯一 ID,来自某个“字典”(dictionary)。
- 检测输出:每个标记的四个角点像素坐标和其 ID;已知相机内参与实际边长即可估计相机 - 标记的位姿(rvec/tvec)。
- Charuco 板
- “Chessboard + ArUco”的混合标定板:棋盘格上嵌入 ArUco 小方块。
- 流程:先检出 ArUco,利用其 ID 确认棋盘格几何关系,再对棋盘交点做亚像素精确定位。
- 优点:比纯 ArUco 更精确(棋盘角点可亚像素)、比纯棋盘更鲁棒(部分遮挡/运动模糊时仍可依赖 ArUco ID 关联),非常适合相机标定与外参标定。
工作流程(简述)
- 读取图像并转灰度;选择 ArUco 字典(如 DICT_5X5_100)。
- detectMarkers → 返回 corners、ids。
- 如需位姿:estimatePoseSingleMarkers(需相机内参、畸变和标记实边长)。
- 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…)