【问题标题】:Finding CheckerBoard Points in opencv for any random ChessBoard( pattern size not known)在opencv中为任何随机棋盘查找棋盘点(图案大小未知)
【发布时间】:2016-09-29 05:29:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ opencv image-processing computer-vision opencv3.0


    【解决方案1】:

    findChessboardCorners 的文档是这样说的

    patternSize – 每行棋盘的内角数和 专栏

    所以patternSize不是图片里面棋盘的大小而是内角的个数。内角的数量不取决于图像内棋盘的大小。

    例如下图https://github.com/Itseez/opencv/blob/3.1.0/samples/data/chessboard.png patternSize 应该是 cv::Size(7,7)

    【讨论】:

    • 你的回答可能提供了丰富的信息,但它没有回答我的问题......我的意思是,给定任何具有任意数量方框的棋盘的任何随机图像,我如何确定图案大小?
    【解决方案2】:

    简短的回答:你不能。

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

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

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

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

    有多种方法可以做到这一点。我最喜欢的模式是 Matsunaga 和 Kanatani 的“二维条码”,它使用具有独特交叉比率的正方形长度序列。请参阅论文here。为了匹配它,一旦你将角排序成一个网格,你可以使用一个简单的多数投票算法:

    • 在水平和垂直方向上预先计算所有模式的连续 4 元组角的交叉比率。
    • 对网格中检测到的角执行上述操作。
    • 对于每一个可能的水平移位
      • 在每一行
        • 累积在阈值内一致的交叉比率的数量
    • 选择协议数最多的水平移位。
    • 对每个可能的垂直移位重复上述操作,计算沿列的交叉比率。

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

    【讨论】:

    • “算法”的链接似乎失效了。
    • 感谢@Michael Mauderer,已修复
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2017-02-22
    相关资源
    最近更新 更多