OpenCV Apriltag 检测只检测到几个标记

问题描述 投票:0回答:0

我在 Python 中使用 OpenCV 的 Aruco 模块来检测我的 AprilTag 校准板。问题是尽管输入图像相当好,但只检测到很少的标记。从我尝试的所有内容来看,似乎 AprilTag 实现非常敏感,需要几乎理想的图像才能工作。如果真是这样,那将使 OpenCV 的 AprilTag 检测器几乎无法使用。

我在用:

  • 视窗
  • Python 3.10.5
  • opencv-contrib-python 4.7.0.72

首先是一个最小的代码示例(遵循 OpenCV Aruco 模块文档):

import cv2

img = cv2.imread("april_board_drawing.png", cv2.IMREAD_COLOR)

aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36h11)
arucoParams = cv2.aruco.DetectorParameters()
arucoParams.markerBorderBits = 2

(corners, ids, rejected) = cv2.aruco.detectMarkers(img, aruco_dict, parameters=arucoParams)

cv2.aruco.drawDetectedMarkers(img, corners, ids)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我从一张“理想”图像开始,以测试标签是否被正确检测到,以及我的校准板和 AprilTag 字典之间是否不匹配。这很好,所有标记都被检测到。

ideal image.png

然后我继续用我的相机录制。问题就出现在这里。仅检测到极少数标记 (15/49)。我选择了我为此拍摄的最好的照片之一。并不是所有的标记都是完美的,有一些眩光,但许多具有相当好的对比度并且仍然没有被检测到。我玩弄了检测参数,没有运气。

real image.png

我想也许失真太强了。所以我纠正了图像,从而消除了失真并再次尝试。这让我得到了一些额外的检测(20/49),但很多地方仍然没有检测到。

real image rectified.png

然后我看了看被拒绝的标记。他们似乎被正确拒绝了。没问题。虽然,奇怪的是多个标记几乎都是正确的。不知道那里发生了什么。我指定了正确的边框大小。

rejections.png

我尝试过的其他事情:

  • 调整、裁剪和翻转输入图像
  • 灰度和颜色输入
  • 调整所有的 aruco.DetectorParameters

我不愿意尝试自适应对比度增强,因为我希望该算法能够处理这种级别的图像质量。我的期望值是不是太高了?

校准板的几何形状似乎不是问题,因为在理想绘图中正确检测到标记,对吗?我更喜欢使用这种类型的板,因为它的标记密度高,并且能够在角落上进行亚像素细化。

知道这里出了什么问题吗?非常感谢任何帮助!

以下是我使用的所有输入图像:

april_board_drawing.png

april_board_real.png

april_board_real_rectified.png

python opencv detection aruco apriltags
© www.soinside.com 2019 - 2024. All rights reserved.