基于AprilTag+OpenCV4的QRCode二维码检测

这部门内容是博主的个人笔记,没有代码,只有思路,也不公开代码。

QRCode二维码的关键是三个定位点的获取,我们借助AprilTag,解码部分的算法和ZXing相同(实践证明非常鲁棒)。

1.通过AprilTag检测得到很多四边形

2.对四边形进行筛选,将可能的四边形集合起来,组成候选四边形vector<Quad>,我们要做的就是从候选四边形中找到三个定位四边形

3.通过四边形的位置、面积比、方向、形状相似度等标准,筛选出四边形对vector<pair<Quad, quad>>,因为定位四边形的嵌套结果,帅选出来的一般都是正确的,但是偶尔也有例外

4.根据帅选出的定位四边形,确定三个定位矩形。上一步只查找到1个或2个定位矩形时,根据已经找到的矩形参数,通过面积、距离、形状、方向、中心间连线与边平行等找到可能的三个矩形。入果上一步查找到四个及以上的矩形,那么按照长宽比对矩形进行排序(一般越接近1越正确),再结合面积和距离的关系做判断

5.定位点排序,和OpenCV中的方法类似(改了以下),对于每个顶点,计算三条连线与3×3黑色小矩形的交点,对于两边的点,四点面积和三点面积是一样的,对于中间的点,三点面积是四点面积的一半(这里不知道OpenCV是再搞什么飞机,就是fixpoint那个函数)。确定中间点后去找左和右,这点和OpenCV做法一样(fixpoint)那个函数

6.计算四边形顶点,和OpenCV中的方法类似(加了正交投影定位),就是ComputeProjectPoint那个函数,OpenCV找了五个点(参见我上一篇博客),然后算交线。而博主这里的点是AprilTag得到的,交点可能会偏一点点,于是顶点固定不动,移动交点,计算连接线上的黑色点数量,连续移动时,黑点数量变化最大时,说明我们找到了交线。同过两条交线的交点,精确定位顶点

7.仿射变换,变成正视图

8.解码,解码部分采用多次二值化+ZXing解码,这个多次二值化很关键的。OpenCV自己去采样,然后用quirc解码,实践不是很靠谱(可能时我没有加多次二值化的关系)

9.速度,原来OpenCV用的自适应二值化太坑了,占据70%以上的时间,可以用大津法替代,这样替代后,会在计算定位点时不准,如果后面用的时zxing解码,zxing本身会再校准一次,再warp之前留够padding就可以了。

这样,在整个算法之前加上前处理,大致分割出二维码的位置后套用上面的算法流(上面只能检测单个二维码),这样可以得到一个商用级别的二维码解码器,很多极限、恶劣的情况都能Cover。大致的关键点都在上面了,博主这个框架是OpenCV的,OpenCV和ZXing都是利用1:1:3:1:1来找定位点,而博主通过AprilTag找四边形,更不容易受干扰,缺点就是会慢一点儿(能达到微信二维码解码的鲁棒但速度还有待优化),相信大多数人看不太懂,好好学习下OpenCV4的二维码检测源码和AprilTag标志检测再来看,或许能Get到其中的关键点。


后面还聊了下,用游程编码来完成QRCode和Barcode的检测 ,网站升级了下,站不了链接,翻19年2月24日的博客

简单记录下。

《基于AprilTag+OpenCV4的QRCode二维码检测》有1条评论

  1. 大佬,先膜拜一下。再问一下步骤8解码 多次二值化具体是什么意思?是同一种参数下多次二值化还是不断递进改变某些参数来多次二值化?例如改变卷积核大小。能讲解的在细致一点吗?感谢!

    回复

发表评论