opencv 为什么分辨率越高的Aruco标签可靠性越低?

gwo2fgha  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(288)

我观察到Aruco标签的图像分辨率非常高(与标签大小相比),实际上检测的可靠性低于平均分辨率。我本以为太低的分辨率是一个问题,没有降级。
不是相机的问题,我用生成的图像(在ChAruco板上)测试了这个。

  • Python语言:3.10.5
  • Aruco词典:双氧碘甲烷_6X6_100
  • OpenCV库:开源软件-4.6.0.66

我观察到:

  • 标记宽度低于22 px-分辨率太低,所以检测率很低。好的。
  • 对于宽度在22到26像素之间的标记,我们有100%的检测率。
  • 超过26个像素时,检测变得零星,然后福尔斯50%以下。为什么??

下面是实际检测到的标记。请注意,检测到的周界标记更为一致。在检测到此gif后,图像被重新缩放为相同大小;您应该看到分辨率增加(并且由于标记注解的大小是固定的,因此它们看起来缩小了)

扩展到300 x300 px:

原始图像,供任何想要测试检测的人使用(ChAruco板DICT_6X6_100为60 x60 px,因此每位平均为60/8=7.5px):

为了完整起见,我尝试了前16本Aruco词典,得到了类似的结果:

正如预期的那样,4X 4标签在较低的分辨率下更容易检测到,但在较高的分辨率下有相同的退化。
此代码测试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                               # Number of markers in X direction
        markersY = 10                               # Number of markers in Y direction

        markerSeparation = round(markerLength/4)    #25% of marker size  
        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("Marker Size (px)")
    plt.ylabel("#Aruco Tags Detected")

plt.show()
zf9nrax1

zf9nrax11#

多亏了christoph-rackwitz安静区确实太小了。
我将图扩展到3D以查看标记之间间距的影响。x1c 0d1x
我使用的标记大小为0.8(因此标记之间的间距为0.2,或标记大小的25%)。对于100%的检测,28%就足够了。我是如此接近!在ChAruco术语中:
对于大小为1的正方形,标记大小必须 * 低于 * 0.78,才能在理想图像上获得良好的检测率。我计划使用较大的间距来打印图片,以获得一定的边距。

aruco.CharucoBoard_create(markersY, markersX, 1, 0.78, dict); #0.78 or less

相关问题