我在函数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()
我得到了这个结果,这显然是错误的,并导致一个坏的姿势估计。如果所有标记都可见,则会降低此效果。
1条答案
按热度按时间trnvg8h31#
问题是校准表是如何生成的-- OpenCV做了一个改变,使得charuco板的左上角总是有一个黑框。
相关问题:https://github.com/opencv/opencv/issues/23152
因此,遗留板(在OpenCV版本4.5.5或更早版本中生成)将无法正确检测。在当前版本(4.7.0)中,无法修复此错误。值得注意的是,该问题只影响具有偶数行的数组。
使用以下代码检查生成的电路板外观。
在OpenCV的下一个版本中,方法
setLegacyPattern
将被添加到CharucoBoard
类中,这允许指定表是以老式的方式生成的。CharucoBoard文档:https://docs.opencv.org/4.x/d0/d3c/classcv_1_1aruco_1_1CharucoBoard.html