经过对二维条码的预处理过程,去除了条码中包含的大部分背景信息,初步定定位了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 条码几何畸变校正的第四个控制点。

数字图象处理之二维码图像提取算法(九)相关推荐

  1. 一维二维码的提取、识别和产生

    一维二维码的提取.识别和产生 零.相关说明:     在"jsxyhelu.cnblogs.com/机器视觉"栏目主要介绍和图像处理和机器视觉相关的的成套的解决方案.思路和软件集. ...

  2. 用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中

    摄像头扫到二维码后提取二维码中的信息分别放到数组中 把想要的信息编辑好放到二维码中(网上有好多在线生成二维码的工具) /** *作者:魏波 *时间:2017.6.6 * **/char name[6] ...

  3. 字符串生成二维码图像(C++,Qt)

    字符串转换二维码图像

  4. 关于二维码分块上色(彩色二维码)的算法研究

    原文:关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成.但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳.本文试着从分块上色的 ...

  5. 二维码里德所罗门算法

    这是一个相当古老的项目了. 前序 之前一直想写一个有关二维码生成器的教程,由于各种各样的原因,当然主要原因是懒,一直没有下手.最近感觉还是要做点什么,不然有种要烂尾的冲动. 我之所以要写这个教程,主要 ...

  6. 一维码和二维码图像的识别

    1.步骤 (1) 提取图像中条码区 (2) 识别条码 2.示例 2.1.一维码的识别 图1.1原图 图1.2提取条码区 图1.3识别结果 2.2.二维码的识别 图2.1原图 图2.2提取条码区 图2. ...

  7. python 二维码_Python提取支付宝和微信支付二维码

    本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客. 支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二 ...

  8. python制作微信二维码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  9. Android数字转条形码二维码

    项目中有需求将imei号显示成条形码. 直接说重点. 要将数字转换成条形码,用到了谷歌zxing.jar静态库.有兴趣的同学可以自己去了解. 下面直接贴代码: 导入包zxing.jar 如果是Andr ...

最新文章

  1. Yarn 问题发现与解决
  2. 测试udp端口状态 curl_检测TCP/UDP端口的连通性
  3. Qt学习之路(29): 绘图设备
  4. 理解Fragment生命周期
  5. CodeForces - 1110G Tree-Tac-Toe(博弈+构造)
  6. 软件测试面试选择判断提,软件测试面试常考判断题
  7. 回文算法java实现_java算法题:最长回文串
  8. 2017.9.14 仪仗队 思考记录
  9. 笔记本电脑如何重装系统win11专业版
  10. Atitit 提升科技影响力 目录 1. 大原则 2 1.1. 科技强人必须是创新型[ 2 1.2. 要有一定的体量和规模 2 2. 创新能力主要科技指标 2 2.1. 领域科技大奖与荣誉 2 2
  11. bat调用vbs脚本
  12. TimesTen 介绍
  13. 基于IAAS和SAAS的运维自动化-张克琛
  14. 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环10 次(线程面试:windows下实现)
  15. 这里告诉你如何计算算法的时间复杂度(大O阶)
  16. 北华航天工业学院计算机如何,北华航天工业学院的实力怎么样?如何评价这所学校?...
  17. 学计算机应该怎样学,初学者该如何学习电脑知识
  18. MP3 MP4 里不能缺少的231首歌!
  19. 精确计算时,不要使用float或double
  20. 软件著作权和专利的区别

热门文章

  1. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题
  2. python的pandas_python之pandas(一)
  3. android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
  4. python多进程_python语法:多进程
  5. hello world!!(Java)
  6. html5 生存游戏,html5版生命游戏
  7. 电脑基础操作_学打碟基础技术 - 数码打碟篇
  8. Powershell(3)
  9. (19)Reactor Processors——响应式Spring的道法术器
  10. Python 列表 insert() 方法