ArUco是计算机视觉中广泛使用的二维 fiducial 标记系统,专为高精度定位和姿态估计设计。ArUco 是 OpenCV 库中的一个模块,基于 ARTag 开发。
特点
- 简单易用:直接集成在 OpenCV 中,无需额外依赖,易于上手。
- 灵活的尺寸:可以根据需要生成不同大小和复杂度的标记。
- 姿态估计:与 AprilTag 类似,支持通过单目相机计算三维姿态。
- 自定义字典:用户可以创建自定义的标记字典,适应特定应用需求。
结构
ArUco 标记由以下部分组成:
- 黑色边框:用于快速检测和定位。
- 内部二进制矩阵:编码唯一 ID(如 5×5、6×6 位)。
- 白色背景:增强与环境的对比度。
ArUco 标记生成与检测
生成标记
import cv2
import numpy as np
# 定义 ArUco 字典类型
aruco_dict_type = cv2.aruco.DICT_6X6_250 # 你可以选择其他字典类型
marker_size = 200 # 标记的像素大小
# 创建 ArUco 字典
aruco_dict = cv2.aruco.getPredefinedDictionary(aruco_dict_type)
# 生成特定 ID 的 ArUco 标记
marker_id = 100 # 你可以选择任何 ID(0 到字典大小 - 1)
marker_image = cv2.aruco.generateImageMarker(aruco_dict, marker_id, marker_size)
# 保存标记为图像文件
output_file = "aruco_marker_id_{}.png".format(marker_id)
cv2.imwrite(output_file, marker_image)
print(f"ArUco 标记(ID={marker_id})已生成并保存为 {output_file}")
将生成的标记与背景图合成,用以测试:
检测标记
import cv2
import numpy as np
# 加载图像
image = cv2.imread('aruco_marker_id_100.png')
# 初始化 ArUco 字典
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
parameters = cv2.aruco.DetectorParameters()
# 创建检测器
detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)
# 检测标记
corners, ids, rejectedImgPoints = detector.detectMarkers(image)
# 如果检测到标记
if ids is not None:
# 绘制标记
cv2.aruco.drawDetectedMarkers(image, corners, ids)
# 输出标记的 ID 和角点
for i in range(len(ids)):
print(f"Marker ID: {ids[i][0]}")
print(f"Corners: {corners[i]}")
print(corners[0][0][0])
# 显示图像
cv2.imshow('Detected ArUco Markers', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
应用注意事项
- 光照条件:尽量保持均匀光照,避免强光反射或阴影遮挡标记。
- 相机校准:进行姿态估计时,需要预先校准相机内参(如焦距、畸变系数)。
- 标记尺寸:标记尺寸应根据应用场景调整,太远或太小的标记可能无法被检测。
- 遮挡处理:若标记可能被部分遮挡,优先选择 AprilTag(更强的纠错能力)。
不过经实测,把标记图像进行模糊和添加杂色后,仍然具有较高的识别度。作为一般要求的标记识别定位,ArUco可以达到像素级的分辨率,如果有更高的要求,可以选择AprilTag,其具有亚像素的分辨率和更强的纠错能力。