OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
Aruco 模块 FAQ

上一教程: 使用 ArUco 和 ChArUco 校准
以下是对于想要使用 aruco 模块的人员而言有用的问题汇总。

  • 我只想给一些对象贴标签,我该使用什么?

在此情况下,你只需要单个 ArUco 标记。你可以在你想要识别的每个对象中放置一个或多个具有不同 ID 的标记。

  • 用于标记检测的算法是什么?

aruco 模块基于原始 ArUco 库。可以在以下位置找到检测过程的完整说明

S. Garrido-Jurado, R. Muñoz-Salinas, F. J. Madrid-Cuevas,以及 M. J. Marín-Jiménez。2014。“遮挡下高度可靠的可信标记的自动生成和检测”。Pattern Recogn。47,6(2014 年 6 月),2280-2292。DOI=10.1016/j.patcog.2014.01.005

  • 我的标记未被正确检测,我该怎么办?

有很多因素会导致无法正确检测标记。你可能需要调整 cv::aruco::DetectorParameters 对象中的一些参数。你可以做的第一件事是检查你的标记是否被 cv::aruco::ArucoDetector::detectMarkers() 函数返回为拒绝候选项。根据此,你应尝试修改不同的参数。

如果你正在使用 ArUco 棋盘,你也可以尝试使用 cv::aruco::ArucoDetector::refineDetectedMarkers() 函数。如果你正在 使用较大的标记(400x400 像素及以上),请尝试增大 cv::aruco::DetectorParameters::adaptiveThreshWinSizeMax 值。同时避免在 ArUco 标记周围设置 狭窄边框(标记周长的 5% 或更少,通过 cv::aruco::DetectorParameters::minMarkerDistanceRate 调整)在标记周围。

  • ArUco 棋盘有哪些优点?有什么缺点?

使用标记棋盘,你可以从一组标记而不是单个标记获取摄像头位姿。这样,检测能够处理棋盘部分视图的遮挡,因为只需一个标记即可获取位姿。

此外,在大多数情况下,你使用更多角点进行位姿估算,那么准确性会比使用单个标记更高。

主要缺点是棋盘不像单个标记那样通用。

  • ChArUco棋盘相较于ArUco棋盘有哪些优势?有哪些缺点?

ChArUco棋盘结合了棋盘格和ArUco棋盘。得益于此,ChArUco棋盘提供的角点比ArUco棋盘(或单个标记)提供的角点更精确。

主要缺点是,ChArUco棋盘不像ArUco棋盘那样通用。例如,ChArUco棋盘是一个平面棋盘,具有特定的标记布局,而ArUco棋盘可以具有任何布局,甚至可以是3D的。此外,ChArUco棋盘中的标记通常更小、更难检测。

  • 我不需要位姿估算,我应该使用ChArUco棋盘吗?

不。ChArUco棋盘的主要目的是为位姿估算或相机校准提供高精度的角点。

  • ArUco棋盘中的所有标记都应该放在同一个平面上吗?

不,ArUco棋盘中的标记角点可以在其3D坐标系中的任何位置放置。

  • ChArUco棋盘中的所有标记都应该放在同一个平面上吗?

是的,ChArUco棋盘中的所有标记都应该在同一个平面上,并且它们的布局由棋盘格形状固定。

cv::aruco::GridBoard类是继承自cv::aruco::Board类的特殊类型的棋盘。cv::aruco::GridBoard对象是一个其标记放置在同一个平面和网格布局中的棋盘。

  • 菱形标记是什么?

菱形标记与3x3大方块的ChArUco棋盘非常相似。然而,与ChArUco棋盘相反的是,钻石的检测基于标记的相对位置。当你想为菱形中的任何(或所有)标记提供概念含义时,它们很有用。一个示例是使用其中一个标记来提供菱形比例。

  • 我需要在棋盘检测、ChArUco棋盘检测或菱形检测之前检测标记吗?

是的,单个标记的检测是aruco模块中的一个基本工具。它使用cv::aruco::DetectorParameters::detectMarkers()函数来完成。其余功能从此函数接收检测到的标记列表。

  • 我想校准我的相机,可以使用这个模块吗?

可以,aruco 模块提供了使用 ArUco 板和 ChArUco 板校准相机的功能。

  • 我应该使用 ChArUco 板还是 ArUco 板进行校准?

强烈建议使用 ChArUco 板进行校准,因为其精度很高。

  • 我应该使用预定义词典还是生成自己的词典?

一般情况下,使用预定义词典会更容易一些。但是,如果您需要一个更大的词典(就标记数或位数而言),则应生成自己的词典。如果您想最大化标记间距离以在识别步骤中实现更好的错误校正,那么生成词典也很有用。

  • 我正在生成自己的词典,但它需要太长时间

应在应用程序开始时执行词典生成操作,并且仅需几秒钟。如果您在检测循环的每次迭代中生成词典,则说明您的做法有误。

此外,建议使用 cv::aruco::Dictionary::writeDictionary() 将词典保存到文件中,并在每次执行时使用 cv::aruco::Dictionary::readDictionary() 对其进行读取,这样您无需生成它。

  • 我想使用我已经打印出来的原始 ArUco 库中的一些标记,可以使用吗?

可以,预定义词典之一为 cv::aruco::DICT_ARUCO_ORIGINAL,它使用相同的标识符检测原始 ArUco 库的标记。

  • 我可以在此模块中使用原始 ArUco 库的棋盘配置文件吗?

不能直接使用,您需要将 ArUco 文件的信息调整为 aruco 模块棋盘格式。

  • 我可以用此模块检测基于二进制基准标记的其他库的标记吗?

大概可以,但是您需要将原始库的词典移植到 aruco 模块格式。

  • 我是否需要将词典信息存储在文件中,以便在不同的执行中使用它?

如果您使用的是预定义词典之一,则没有必要。否则,建议您将其保存到文件中。

  • 我是否需要将棋盘信息存储在文件中,以便在不同的执行中使用它?

如果正在使用一个cv::aruco::GridBoard 或一个cv::aruco::CharucoBoard,您只需要存储提供给cv::aruco::GridBoard::GridBoard() 构造函数或cv::aruco::CharucoBoard 构造函数的板测量值。如果您手动修改板的标记 ID,或者如果您使用不同类型的板,您应将您的板对象保存到文件中。

  • aruco 模块是否提供将字典或板保存到文件的功能?

对于cv::aruco::Dictionary,您可使用cv::aruco::Dictionary::writeDictionary()cv::aruco::Dictionary::readDictionary()。板类的数据成员是公共的,可轻易存储。

  • 可以,但是如何渲染 3D 模型来创建增强现实应用?

要执行此操作,您需要使用一个外部渲染引擎库,如 OpenGL。aruco 模块仅提供获取相机位姿的功能,即用于创建增强现实效果所需的旋转和平移向量。然而,您需要将来自 OpenCV 格式的旋转和平移向量适应您的 3D 渲染库所接受的格式。原始 ArUco 库包含如何对 OpenGL 和 Ogre3D 执行此操作的示例。

  • 我在自己的研究工作中使用了此模块,如何引用它?

您可以引用原始 ArUco 库

S. Garrido-Jurado, R. Muñoz-Salinas, F. J. Madrid-Cuevas,以及 M. J. Marín-Jiménez。2014。“遮挡下高度可靠的可信标记的自动生成和检测”。Pattern Recogn。47,6(2014 年 6 月),2280-2292。DOI=10.1016/j.patcog.2014.01.005

  • 姿态估计标记未被正确检测,我该怎么办?

重要的是,仅使用 4 个共面点进行姿势估计会产生歧义。一般来说,当相机靠近标记时,可以解决此歧义问题。但是,当标记变小时,角估计误差会增大,并且歧义会变成一个问题。尝试增加正在使用的标记的大小,也可以尝试使用非对称 (aruco_dict_utils.cpp) 标记以避免冲突。使用多个标记(ArUco/ChArUco/Diamonds 板)和具有 cv::SOLVEPNP_IPPE_SQUARE 选项的 solvePnP() 进行姿势估计。更多信息详见 此问题