为何更高分辨率的Aruco标签检测可靠性反而更低?
高分辨率ArUco标签检测率异常下降问题
观测发现,相较于常规分辨率的ArUco标签,相对标签自身尺寸而言分辨率极高的ArUco标签图像,检测可靠性反而更低。此前普遍认为仅分辨率过低会引发检测问题,未预期高分辨率场景下也会出现检测效果劣化。
该现象与相机硬件无关,已基于生成的ChArUco板图像完成对照测试,测试环境配置如下:
- Python: 3.10.5
- ArUco字典: DICT_6X6_100
- OpenCV库: opencv-contrib-python 4.6.0.66
测试得到的规律
- 标签宽度小于22px时:分辨率不足,检测率较低,符合预期;
- 标签宽度处于22~26px区间时:检测率达到100%,效果理想;
- 标签宽度大于26px时:检测结果开始出现偶发漏检,后续检测率跌至50%以下,该异常现象的成因待解答。
相关测试素材
- DICT_6X6_100字典下检测标签数量与标签尺寸的关系统计图:

- 实际标签检测效果动图:检测完成后所有图像被重缩放至统一尺寸,可观察到标签分辨率逐步提升,由于标记注释尺寸固定,视觉上注释会相对缩小;可注意到位于边缘的标签检测一致性更高。

- 标签尺寸扩展至300x300px时的检测结果图:

- 供复现测试的原始图像:60x60px规格DICT_6X6_100 ChAruco板,平均每个比特对应尺寸为60/8=7.5px。

为验证结果普适性,测试了前16种预置Aruco字典,均得到相似规律:4X4规格标签如预期在低分辨率下检测表现更优,但在高分辨率区间同样出现检测效果劣化的问题。
测试复现代码
以下为用于测试ChAruco板上不同预置Aruco字典、不同标记尺寸对应检测效果的代码:
import cv2 import cv2.aruco as aruco import numpy as np import matplotlib.pyplot as plt for dictNum in range(16): print(dictNum) d = aruco.getPredefinedDictionary(dictNum) arucoParams = aruco.DetectorParameters_create() x = [] y = [] for markerLength in range(10, 60): # params markersX = 10 # X方向标记数量 markersY = 10 # Y方向标记数量 markerSeparation = round(markerLength/4) # 标记间隔为标记尺寸的25% margins = markerSeparation borderBits = 1; sc = (markerLength + markerSeparation) of = - markerSeparation + 2 * margins imageSize = [markersY*sc+of, markersX*sc+of] board = aruco.CharucoBoard_create(markersY, markersX, 1, markerLength/(markerLength+markerSeparation), d) imboard = board.draw(imageSize) fn = "chessboard" + str(dictNum) + "_" + str(markerLength) + ".tiff" ## cv2.imwrite(fn, imboard) (corners, ids, rejected) = aruco.detectMarkers(imboard, d, parameters=arucoParams) x.append(markerLength) y.append(len(corners)) if len(corners) > 0: length_of_axis = 0.02 imboard = aruco.drawDetectedMarkers(imboard.copy(), corners, ids) fn = "ANNOchessboard" + str(dictNum) + "_" + str(markerLength) + ".tiff" ## cv2.imwrite(fn, imboard) plt.plot(x, y, label="Dict#"+str(dictNum)) plt.xlabel("标记尺寸 (px)") plt.ylabel("检测到的ArUco标签数量") plt.show()
内容的提问来源于stack exchange,提问作者William Gibson
相关产品推荐
相关产品推荐

