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

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解码,实践不是很靠谱(可能时我没有加多次二值化的关系)

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注