查看原文
其他

利用自识别标记实现复杂场景下相机标定

sixgod 计算机视觉life 2019-06-23

   点击上方蓝字关注我

上篇文章《一次拍摄搞定多相机自动化标定》我们说到该算法受限于棋盘格的约束,所以当棋盘被部分遮挡时,检测结果就不尽如人意,这篇文章给出了一个解决方法:用自识别标记来实现遮挡等复杂场景下的鲁棒的相机标定。


什么是自识别标记?

自识别标记在不同的论文中有不同称谓,比如self-identifying marker, self-identifying marker pattern, fiducial marker等, 在此我们统称为自识别标记。 自识别标记乍一看有点类似我们常见的二维码,其每个标记具有唯一性。和二维码不同的是,自识别标记在实际应用中通常由多个一起组合成规则的标记阵列图案。如下图为8 x 4阵列。 

自识别标记有哪些应用?


自识别标记主要有如下应用:相机标定、安防监控、机器人视觉导航、电影拍摄中的特效制作、增强现实等。


如下图所示是自识别标记用于无人机室内导航的一个例子。

本文主要介绍自识别在相机标定中的应用。


CALibration Tag

CALibration Tag(简记为CALTag)是一种平面自识别标记,专门用于自动化相机标定。这种方法有如下几个必杀技完爆传统的标定方法:


1、几乎可以找全图像视野内所有的角点,相比之下,opencv自带的角点检测函数必须提前指定棋盘格大小,且只能找到矩形棋盘格形状内部的角点。


2、不需要所有的棋盘格出现在图像内。可用于棋盘被遮挡、只拍摄到部分棋盘等比较有挑战的环境。


如下图所示。普通棋盘格在部分可见(左图)和遮挡(中图)情况下均无法检测到角点。使用CALTag的棋盘格(右图)在既部分可见又被遮挡的情况下仍可以检测到角点。

3、适用于拍摄角度非常极端、光照变化比较大、相机畸变等情况。如下图所示,左上角图表示标记被部分遮挡情况下CALTag仍然可以检测到角点。中间一行表示在非常陡峭的拍摄角度和光照变化较大的情况下的识别效果仍然鲁棒。最下面一行表示在明显的阴影下和径向畸变下的鲁棒效果。

4、可以恢复出漏检的标记。这是因为每个标记是唯一的,可以从棋盘code数据表格中查找丢失的标记。


下图中红色圆圈表示角点,绿色*表示对标记code的采样点,品红色*表示猜测到的角点位置,品红色圆圈表示猜测到角点中经过重新验证后真正的角点。黄色圈圈表示在重新验证中被排除掉的点。

5、极低的误警率,尤其当拍摄图案所在的场景非常复杂的时候。因为引入了唯一识别码并且按照一定的阵列排列,可以滤掉几乎所有的环境干扰。


6、全自动完成相机标定,不需要调参,不需要人工参与。


看起来是不是很诱人啊,它是如何做到的?下面对原理进行详细解释。


CALTag 检测算法原理简介

检测算法的基本流程图如下:

1、首先输入一幅包含自识别标记的图片,如上图第一行第一个图。该图片中的标记可能被遮挡(倒U字形的遮挡)、还有一些环境的干扰(最左侧、右下角的一些灰色的图)。


2、然后是寻找可能的自识别标记区域。使用图像二值化、连通域计算、过滤规则等方法,最终保留了可能的自识别标记区域(上图标号为3的子图)。


3、然后进行角点检测,确定自识别标记的四个角点位置(图中标号为4的子图中红色的点)。然后采样其内部的二进制code并进行识别(上图中标号为5的子图,绿色的点表示采样的code被正确识别,最左侧和右下角的图形识别失败,被滤掉)。


4、根据已经识别的code对照先验已经知道的棋盘中code矩阵表,就可以知道丢失了哪些code,他们的角点应该在哪里(上图中标号为6的子图中的问号就是丢失的code对应的角点)。然后重新对这些恢复出来的用问号标记的角点进行角点验证算法,通过验证的角点(上图中标号为7的子图中的绿色角点)加入到已经检测好的角点的队伍中来,未通过验证的伪角点(上图中标号为7的子图中右下角那个点)排除掉。


5、最后输出的是检测到的每个角点(标定点)的图像坐标以及其在code矩阵表里的位置坐标。这样,如果事先给出棋盘中某个基准点在三维空间中的坐标,那么根据输出信息就可以计算出所有检测到的角点的三维空间坐标、图像坐标,就自动完成了对应关系的建立。


CALTag 图案设计

由于CALTag图案一般打印后张贴在自然环境中使用,需要考虑运算量、旋转不变、鲁棒性等从而保障在大部分环境下有较强的实用性,所以设计还是比较讲究的,需要注意一些细节。


下面以code尺寸M x N=4 x 4,边界尺寸K=2为例进行介绍。这也是推荐的设计模式。code尺寸的选择是综合考虑了codebook的大小和图案的物理尺寸而确定的。Code尺寸越大,codebook里的code就越多,如果实际上使用的只是有限的code,那么多出来的code也没什么卵用,但是实际打印出来的棋盘格里的code物理尺寸会变小,在拍摄距离较远时会影响识别效果。先来看下这种设计图案的示例。下图左称为一个marker,上图右为4x4的marker矩阵。

抛出2个问题自问自答:


1、为什么要用黑白两色的标记?不能用彩色吗,或者灰度图?

这和二维码为什么一般采用黑白两色设计的原理差不多:因为计算机世界就是0,1构成的,选择黑白这种对比强烈的颜色可以在不同光照情况下算法更加鲁棒,同时方便打印,打印成本也很低。


2、为什么中间4 x 4的识别码和最外边界之间要空出两行?

因为需要保证角点检测的范围内没有其他干扰。假设上图右中黄色圆圈内为检测角点时扫描的范围,绿色圆圈内表示检测到的角点。如果识别码和最外边界没有间隙,那么在角点检测的扫描范围内(黄色圆圈内)可能会出现干扰,从而影响对角点的判定。


参考资料

参考论文:

CALTag: High Precision Fiducial Markers for Camera Calibration


参考网站:

http://www.cs.ubc.ca/labs/imager/tr/2010/Atcheson_VMV2010_CALTag/

https://github.com/brada/caltag


点击图片查看相关阅读

注:转载请联系simiter@126.com,注明来源,侵权必究。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存