OpenCV:InterpolateCornersCharuco在电路板部分遮挡时给出错误估计

brc7rcf0  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(175)

我在函数cv2.interpolateCornersCharuco中遇到了一个奇怪的行为,特别是当电路板被部分遮挡时,请参见下图:

Charuco板是使用5x5 Aruco作为字典的8x11板。如果我运行这段代码:

board = cv2.aruco_CharucoBoard.create(8, 11, 0.075, 0.058, cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_250))

    detection_params = cv2.aruco.DetectorParameters_create()
    detection_params.cornerRefinementMethod = cv2.aruco.CORNER_REFINE_CONTOUR

    image_grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    corners, ids, rejected_points = cv2.aruco.detectMarkers(image_grayscale, board.dictionary, parameters=detection_params)

    _, charuco_corners, charuco_ids = cv2.aruco.interpolateCornersCharuco(corners, ids, image_grayscale, board,
                                               cameraMatrix=None, distCoeffs=None, minMarkers=1)

    debug_image = cv2.aruco.drawDetectedMarkers(image, corners, ids, borderColor=(0, 255, 0))
    debug_image = cv2.aruco.drawDetectedCornersCharuco(debug_image, charuco_corners, charuco_ids, (0, 0, 255))

    fig = plt.figure()
    plt.imshow(debug_image)
    plt.pause(0.5)
    plt.close()

我得到了这个结果,这显然是错误的,并导致一个坏的姿势估计。如果所有标记都可见,则会降低此效果。

trnvg8h3

trnvg8h31#

问题是校准表是如何生成的-- OpenCV做了一个改变,使得charuco板的左上角总是有一个黑框。
相关问题:https://github.com/opencv/opencv/issues/23152
因此,遗留板(在OpenCV版本4.5.5或更早版本中生成)将无法正确检测。在当前版本(4.7.0)中,无法修复此错误。值得注意的是,该问题只影响具有偶数行的数组。
使用以下代码检查生成的电路板外观。

import cv2

ARUCO_DICTIONARY = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_5X5_250)
board = cv2.aruco.CharucoBoard((11, 8), 0.075, 0.058, ARUCO_DICTIONARY)
image = board.generateImage((640, 400))

cv2.namedWindow("Charuco board")
cv2.imshow("Charuco board", image)
cv2.waitKey(0)

在OpenCV的下一个版本中,方法setLegacyPattern将被添加到CharucoBoard类中,这允许指定表是以老式的方式生成的。
CharucoBoard文档:https://docs.opencv.org/4.x/d0/d3c/classcv_1_1aruco_1_1CharucoBoard.html

相关问题