经过对二维条码的预处理过程,去除了条码中包含的大部分背景信息,初步定定位了QR条码,实现了对二维条码的滤波和二值化处理。但是要提取QR码中的码字信息,还需要经过下面三个步骤:
(1) 利用QR码符号特有的三个位置探测图像,快速完成对QR码的精确定位,确定条码的倾斜角度,完成旋转。
(2) 计算QR码四个顶点坐标,作为条码图像几何畸变校正的四个控制点,完成QR条码的几何畸变校正。
(3) 通过检测QR码的定位图形和校正图形位置确定数据采样网格,对网格中的数据进行采样,提取QR条码码字信息。
QR条形码的特征识别:
为了实现QR条码的快速定位和识别,条码设计人员在QR条码中加入了一些明显的特征符号,主要包括如下:
(1) 寻像图形:它包含三个相同的位置探测图形,分别位于QR码符号的左上角、右上角和左下角。位置探测图形中深色模块和浅色模块按照 1:1:3:1:1 比例交替排列,这种比例不受图像的大小和旋转而改变,按照QR码的编码规则,这种图像在其他地方出现的概率几乎为0,所以可以通过扫描这个特定图形来实现QR码的快速定位。
(2) 空白区:它环绕QR条码四周,宽度为4个模块。
(3) 符号和版本规格确定。QR码分40种规格,QR 码由21 × 21个模块组成,每增加一个版本,则边长增加4个模块。即版本为V 的符号边长含有 4V + 17 个模块,这个特征可以用来实现 QR 条码的码字提取。
QR码精确定位方法及步骤:
提取 QR 条码的码字信息前,先要完成 QR 条码的定位。 本项目参考标准译码方法中提供的 QR 码定位方法,利用 QR 条码的结构特征快速定位三个位置探测图形的中心点坐标,完成 QR 条码的精确定位,具体步骤如下:
具体方法如下:
(1) 位置探测图像确定。从第一行开始,对 QR 条码图形进行水平扫描, 当扫描到符合位置探测图形比例( 1:1:3:1:1) 的图案时,记录下左右边缘的像素点位置,分别记为A 和B,如图 5-2 所示。 继续向下一行扫描,记录满足要求点的坐标位置,直到整幅 QR 码图像横向扫描完毕。 假设单个模块的宽度为 x 个像素点,在计算过程中,探测到条空模块的宽度为 y 个像素,当0.5x <= y <= 1.5x时认为 y 的宽度为一个模块,允许有 0.5x 个模块的误差,依此类推;
(2) 从 QR 条码图像第一列开始竖直扫描,重复步骤( 1),记录满足 1:1:3:1:1的图像的内外边缘像素点的坐标位置,分别记为C 和D;
(3) 位置探测图形的中心点坐标的确定。将步骤( 1)中记录下的边缘点 A、B 连线的中点连成一条直线,同理,将步骤( 2)中记录下的边缘点 C、 D 连线的中点连成一条直线。这两条直线会相交于一点,这个点就是 QR 条码位置探测图形的中心点;(4) 重复以上步骤就可以求出其他两个位置探测图形的中心点的坐标位置,这样就定位出了 QR 条码的三个位置探测图形中心点位置坐标,将定位点用十字符号标记,如下图:
QR 码三个位置探测图形的中心点坐标, 利用这三个点的坐标可以求得 QR 码的倾斜角度,进而将图像旋转至水平状态。 首先将三个中心点连接成一个三角形,A、B、C 分别代表三个位置探测图形的中心坐标点,t为条码需要旋转的角度, 为方便观察,将位置探测图形的颜色做了改变。扫描图像从上往下,从左往右,假定确定寻像图像中心点的顺序依次为A、B、C点。在几何形变不是很严重的情况下, QR 条码仍可作为矩形来处理,则三个中心点的连续构成了一个等腰直角三角形,直角边对应的夹角为45度。作两条辅助线,然后就可以求得旋转角度。在下图中,我们可以根据一些基本知识求得这个旋转角就是t=pi/4-t1。
接下来就要进行二维码的校正:
QR 条码校正的关键在于四个控制点的准确获取,本文采用直线拟合的方法来计算控制点坐标位置。前一小节计算条码倾斜角度时标记了 QR 条码三个位置探测图形的边缘点坐标信息。 QR 条码做左边界和上边界由于分布了两个位置探测图形,用于计算边界直线的点更多,而且分布在直线的两头,实验中发现可以非常准确的确定这两条直线, 但底线和右边的直线会出现不够准确的情况,计算 4 条直线交点时,可以准确的得到左上、左下和右上角的顶点,右下角的顶点经常出现一定程度的偏差,故此方法计算出来的右下角顶点不能作为准确的控制点,只能作为参考点, 本文对第四个控制点的计算方法做了如下修正:
(1) 以 QR 码左下角为起始点,拟合出的 QR 码底边界线作为基准线,在正负2的范围内以步长 0.05 从左至右进行扫描,记录像素点从黑到白的跳变次数,选取跳变次数最多的那条直线作为 QR 码的底部边界线, 则此方法可精确到0.05。
(2)重复步骤 1,计算出 QR 条码的右边界线。
(3) 计算两条直线的交点,将此交点作为 QR 条码几何畸变校正的第四个控制点。