棋盘格检测--Automatic Detection of Checkerboards on Blurred and Distorted Images

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangjunhit/article/details/89396932

Automatic Detection of Checkerboards on Blurred and Distorted Images
In Proc. IEEE/RSJ International Conference on Intelligent Robots and Systems, 2008

本文主要介绍了一种棋盘格检测方法,先分析 opencv中 现有算法的问题,然后在此基础上提出改进。

https://mp.weixin.qq.com/s?__biz=Mzg5MzE2NzgwOA==&mid=2247483686&idx=1&sn=9621c4947fa80825126f27698f3cbfb9&chksm=c033b089f744399fb6f05508f947996612c3489c50d8f535cf5740ac1523881f760b5e8b1c8c&mpshare=1&scene=1&srcid=&key=4cf54c0f296f3db421da55af9c0b46f90922aee0270480e21b053bdc35171e3f0685770622c819b1a52067aaaa9d145c6447311bd04f20bc1adaa3ec684d635bfc6831b3eefc2a461421b3eb2f1eea2e&ascene=1&uin=MjQ5NzIzMTczOQ%3D%3D&devicetype=Windows+7&version=62060739&lang=zh_CN&pass_ticket=j0aV2BwcGS0D6Xdx3tqUHUGjh5xYT599tC5iWtcuULaZYeXb20FE6LHHQKUZ3kAc

首先我们来看一下 opencv 中 由 Vladimir Vezhnevets 实现的棋盘格检测算法流程:

  1. 算法输入: 图像中包含一个给定尺寸的黑白棋盘格,如果输入的是彩色图像,那么将彩色图像转换为灰度图像,接着就是二值化步骤。

2)Adaptive Threshold: 自适应二值化, opencv 中有自适应二值化函数,这里的二值化算法是支持自适应二值化的。所谓的自适应二值化就是对给定尺寸的局部区域(given mask size)进行二值化。定义了两个 kernel:“mean” and “Gaussian”,mean 的速度快,Gaussian 的效果更好些。这里的 checkers 就是 棋盘格中的 小黑方块,二值化后这些 checkers 很容易连接在一起,因为 blur, noise and/or
too coarse sampling。为了能正确的识别,我们需要将这些 checkers 分离开来,所以使用了 腐蚀算子 erosion

3)Erosion 腐蚀,主要目的就是将二值化后的 各个黑方块分离开来,定义了一个 3x3 “rect” kernel。这个腐蚀操作可以说是整个算法的精髓所在。只有分离出单个 小黑方块 checker 来,我们才可以一个 binary contour finder 来提取出 这个 quadrangle,如果 没有 pattern(棋盘) 被找到,那么就可以认为 checkers 仍然连接在一起,我们需要继续腐蚀
在这里插入图片描述
4) Quadrangle Generation: 四边形的生成,每个 checker 被检测出来,我们使用一个 polygon 来拟合。这里我们没腐蚀一次,就提取一次 checker ,当然有停止条件的。随着腐蚀次数的增加,棋盘会慢慢消失,导致一些小的 checker 没有被检测出来。

  1. Quadrangle Linking: 四边形连接,如何将检测到的四边形连接起来了?我们采用以下策略:
    (1)对于每个四边形的每个角点 corner 计算其到 其他四边形角点的距离,保持最小的距离和对应的角点 corner 以及 四边形的 ID
    (2)检查这个最小距离 是否小于 两个四边形中的最小边长,这一步朱啊哟是确保不让两个距离很远的四边形连接到一起
    (3)如果这些条件满足,那么这两个四边形对应的两个角点就连接到一起去,the extracted corner position is set to the arithmetic
    mean of their former positions,这个提取的角点位置如何计算? 四边形对应的两个角点的算术平均

The extracted corners finally form a pattern described through their position and neighborhood relation with respect to the other corners
最终我们把棋盘格找到

  1. Further Steps: 对于所有腐蚀步骤,算法选择具有最大角点数目的那一次对应的棋盘。不同步骤之间没有联系。这里有个默认就是给定一个腐蚀步骤内,每个 checker 理论上是检测的。对于特殊情况如 最大 pattern 特征有很多角点时, the smallest convex hull 作为输出结果。

B. Limitations opencv 中因为侧重于速度,所有在自适应二值化时选择 mean 作为 mask,但是 Gaussian 的效果更好。另一个就是只有将所有的 checker 找到 才返回一个 pattern, 但是对于标定来说,经常使用部分角点就满足要求了。上述算法在某些情况下就停止工作:any combination of low resolution (VGA), blurred, and distorted images

III. IMPROVEMENTS TO THE CODE 代码的改进

A. Adaptation of Erosion Kernels
这里我们定义了 两个kernal “cross” and “rect” 用于交替腐蚀,得到 uniform “shrinking”,为什么需要改变 kernal 的形状了?(尺寸大小不能改变,已经是最小了)对于大尺寸的特征 我们使用 “rect” kernal 腐蚀,腐蚀会对所有的边界像素产生均匀影响。但是对于 corner 附近的像素产生的影响会有所不同,它依赖于checker 方向和 kernal 类型。
corners tend to get rounded, the exact amount depending on the orientation of the checker and the type of kernel used.

B. New Heuristic for Quadrangle Linking
广角相机造成的畸变导致 上面的 Quadrangle Linking 不能正常工作。新的连接策略如下:
(1)对每个找到的 四边形 quadrangle 的每个角点 计算其到 其他四边形的角点的距离,检查这个距离是否小于 两个对应四边形最短边的边
长。如果小于,那么将这两个角点看做一个 candidate neighbor pair
(2)对每个 candidate neighbor pair,在每个四边形上画两条中心线
(3)如果这一对角点 都位于四边形中心线的一侧,那么这对角点就是 匹配成功。
在这里插入图片描述
C. Adaptive Quadrangle Linking Distance 四边形连接距离阈值的自适应
这里的阈值自适应主要是考虑腐蚀的影响 incorporate the effect of erosion
d_limit = shortest_edge_length + 2*erosion

D. Linking of Quadrangles over Multiple Erosion Runs
连接 不同腐蚀步骤的四边形,就是将其他腐蚀步骤检测到的四边形 加入到目前腐蚀步骤的四边形检测结果中。互通有无
在这里插入图片描述
E. Adaptation of the Polygonal Approximation Level
提取到的轮廓用于多边形拟合,基于轮廓拟合出一个四边形。 在四边形拟合时 有一个控制阈值:deviation threshold。降低这个阈值可以拟合出更小的四边形,同时误检也会出现。 所以我们希望算法的初始拟合出来的四边形是稳定可靠的。在算法的第二步中我们通过改变这个阈值将不稳定的四边形拟合出来。然后我们将这些不稳定的四边形融入到 稳定的四边形 构建最终的棋盘 pattern。

F. Relative Importance
这里讨论了一下 上述的改进措施哪些作用较大,哪些措施适合 very low resolution and blurred images

11

猜你喜欢

转载自blog.csdn.net/zhangjunhit/article/details/89396932