带有特定标记的 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 字典?的主要内容,如果未能解决你的问题,请参考以下文章