【问题标题】:OpenCV Custom Aruco Dictionary with specific markers?带有特定标记的 OpenCV 自定义 Aruco 字典?
【发布时间】: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) ),这让我觉得我可能遗漏了一些基本的东西。
任何帮助表示赞赏!
【问题讨论】:
标签:
opencv
dictionary
aruco
【解决方案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 似乎大小错误。