You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何更高分辨率的Aruco标签检测可靠性反而更低?

高分辨率ArUco标签检测率异常下降问题

观测发现,相较于常规分辨率的ArUco标签,相对标签自身尺寸而言分辨率极高的ArUco标签图像,检测可靠性反而更低。此前普遍认为仅分辨率过低会引发检测问题,未预期高分辨率场景下也会出现检测效果劣化。

该现象与相机硬件无关,已基于生成的ChArUco板图像完成对照测试,测试环境配置如下:

  • Python: 3.10.5
  • ArUco字典: DICT_6X6_100
  • OpenCV库: opencv-contrib-python 4.6.0.66

测试得到的规律

  1. 标签宽度小于22px时:分辨率不足,检测率较低,符合预期;
  2. 标签宽度处于22~26px区间时:检测率达到100%,效果理想;
  3. 标签宽度大于26px时:检测结果开始出现偶发漏检,后续检测率跌至50%以下,该异常现象的成因待解答。

相关测试素材

  • DICT_6X6_100字典下检测标签数量与标签尺寸的关系统计图:
    DICT_6X6_100字典下检测标签数与尺寸关系图
  • 实际标签检测效果动图:检测完成后所有图像被重缩放至统一尺寸,可观察到标签分辨率逐步提升,由于标记注释尺寸固定,视觉上注释会相对缩小;可注意到位于边缘的标签检测一致性更高。
    标签检测效果动图
  • 标签尺寸扩展至300x300px时的检测结果图:
    300x300px尺寸检测结果图
  • 供复现测试的原始图像:60x60px规格DICT_6X6_100 ChAruco板,平均每个比特对应尺寸为60/8=7.5px。
    60x60px DICT_6X6_100 ChAruco板原图

为验证结果普适性,测试了前16种预置Aruco字典,均得到相似规律:4X4规格标签如预期在低分辨率下检测表现更优,但在高分辨率区间同样出现检测效果劣化的问题。
前16种字典Aruco检测率与尺寸关系图

测试复现代码

以下为用于测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:57:16