gpt4 book ai didi

c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知)

转载 作者:可可西里 更新时间:2023-11-01 18:26:15 24 4
gpt4 key购买 nike

好吧,OpenCv 带有它在 C++ 中的函数 findCheckerboardCorners(),就像

bool findChessboardCorners(InputArray image, Size patternSize, 
OutputArray corners,
int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE )

使用此功能一段时间后,我了解到图案大小必须在很大程度上符合图像,否则算法将拒绝检测任何棋盘。我想知道是否有任何棋盘的随机图像,这个函数会失败,因为输入 patternSize 的精确值是不切实际的。有没有办法,这个函数的 patternSize 可以从提供的图像中获得。任何帮助,将不胜感激。谢谢。

最佳答案

简短的回答:你不能。

OpenCV 棋盘格检测代码假定图案是统一的(所有方 block 具有相同的大小),因此,为了唯一定位其在图像中的位置,必须满足以下两个条件:

  1. 图案完全可见。
  2. 该模式具有已知数量的行和列。

如果违反了 1 或 2,则无法知道哪个角是“左上”角。

对于更一般的情况,特别是如果您预计图案可能会被部分遮挡,则必须使用不同的算法和非均匀图案,这样角点就可以被唯一识别。

有多种方法可以做到这一点。我最喜欢的图案是 Matsunaga 和 Kanatani 的“二维条形码”,它使用具有独特交叉比的方形长度序列。见论文 here .为了匹配它,一旦您将角点排序到网格中,就可以使用简单的多数表决算法:

  • 预先计算所有模式的角的连续 4 元组在水平和垂直方向上的交比。
  • 对网格中检测到的角执行上述操作。
  • 对于每一个可能的水平移动
    • 每一行
      • 累积在阈值内一致的交叉比率的数量
  • 选择协议(protocol)数量最多的水平移动。
  • 对每个可能的垂直移动重复上述操作,沿列计算交叉比率。
  • 分别和 union 重复上述两个步骤,颠倒垂直和水平以及垂直方向的交叉比的顺序,以考虑反射和旋转。

可以通过多种方式将检测到的角点放置在网格中。有一个经常被重新发现的 algorithm使用拓扑邻近性。这个想法是首先将每个角与它的一个小窗口内的所有正方形相关联,从而构建一个角->正方形表,然后将其作为图遍历以构建每个角彼此偏移的全局表。

关于c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com