带有特定标记的 OpenCV 自定义 Aruco 字典?

Posted

技术标签:

【中文标题】带有特定标记的 OpenCV 自定义 Aruco 字典?【英文标题】:OpenCV Custom Aruco Dictionary with specific markers? 【发布时间】:2021-02-02 06:56:11 【问题描述】:

出于性能原因,我想使用仅包含一组特定的 20 个 aruco 标记的 aruco 字典。我在自定义词典中需要的 20 个标记已经被选中,并且来自预定义的词典 DICT_6X6_250。

我一直在这里阅读文档:https://docs.opencv.org/master/d5/dae/tutorial_aruco_detection.html

在“手动字典生成”部分下,它提供了一些提示,但缺少一个关键细节: 如何在预定义的字典中获取给定标记 id 的标记位?

如果我可以在预定义的字典中获得给定标记 ID 的相应标记位,那么我可以将这些标记添加到我的自定义字典中。我不明白为什么没有用于此的 API(类似于 Mat Dictionary::getMarkerBitsById(int markerId) ),这让我觉得我可能遗漏了一些基本的东西。

任何帮助表示赞赏!

【问题讨论】:

【参考方案1】:

我目前在 Kotlin 中使用 OpenCV 的 Java 绑定,但该方法应该适用于任何语言。

fun getDict() : Dictionary 
    val base = Aruco.getPredefinedDictionary(Aruco.DICT_4X4_50)
    val dict = Aruco.custom_dictionary(4, 4)
    val tmp = ByteArray(16)
    listOf(8, 0, 4, 19).forEachIndexed  index, id ->
        base._bytesList.row(id)[0, 0, tmp]
        dict._bytesList.put(index, 0, tmp)
    
    return dict

在给定的代码中,我创建了一个自定义字典,仅包含 ID 为 8、0、4、19 的标记。我只需访问基本字典的 _bytesList,将一行复制到临时的 ByteArray 中,然后最后把它放进我的自定义字典里。

我也尝试将一行直接复制到新位置,但它总是只复制标记的一部分。 base._bytesList.row(id) 返回的 Mat 似乎大小错误。

【讨论】:

以上是关于带有特定标记的 OpenCV 自定义 Aruco 字典?的主要内容,如果未能解决你的问题,请参考以下文章

使用Python,OpenCV生成Aruco标记

如何链接两个 ArUco 标记的姿势?

opencv中ArUco模块实践

Aruco Marker World Coordinates

OpenCV 3 和 ArUco lib - 序列化字典

翻译OpenCV文档:ArUco Marker的检测 (Detection of ArUco Markers)