发票二维码扫描增强_02_算法概述

技术选型

为了解决二维码无法扫描的问题,必须选择合适的技术手段。由于我们的App引用的是别人开发的基于Zbar的图像识别插件,在没有能力修改图像识别插件的前提下,我决定在服务端解决这个问题,考虑到算法的通用型,在服务端验证通过的程序后期也可以考虑移植到App端,提高本地扫描速度,降低服务器性能消耗。IOS和Android的插件都存在相机对焦完成的事件,在该事件中可以拿到图像信息,我计划在拿到对焦完成的图片后,进行简单压缩后传输至服务器进行解析处理,再将服务器返回的解析结果作为解码结果传递给前台应用。

对图片的分析与操作属于计算机图形处理的范畴,OpenCV是一个非常强大的图形处理库,比较适合当前这个需求。因为之前也没接触过图形处理这一块,基本上也是边学边做,主要是从处理思想去找对应的图形处理工具。

OpenCV支持多种语言,例如C++、Python,目前网络上比较多的参考文档都是基于C++,考虑到编程语言的简易程度,决定采用Python进行开发。考虑到需要发布HTTP服务给App端调用,最终Python程序需要集成到Django项目中。

所以最后采用的技术栈为:Python3.6 + opencv-python + numpy(用于支持矩阵运算),使用pip安装两个库:
pip install numpy
pip install opencv-python

思路分析

我们首先拿一张真实拍摄的二维码进行分析:

这张图片从肉眼来看,基本是一个正方形,用户基本是摄像头垂直于二维码上方拍摄,而不是倾斜拍摄,比较符合我们对客户的扫描结果预期。

如果我们可以拿到一张正方形的二维码图片,根据定位点和坐标点可以很容易构建坐标系去分割图像,获取每个点内的0/1值,从而构建一个新的二维码图像。

但是从该图片去建立坐标系时,可以发现该图片其实不是一个真正的正方形,并且连一个矩形都算不上,无法使用缩放的方式恢复正方形,从截图的二维码左右边长和红色框的长度比较可以看出来,左侧线段长度要比右侧线段短一些,所以连一个平行四边形都不算,这在后面我们选择图形变换算法时也是一个非常重要的决定项。

我们梳理一下解决思路,对于一张正常拍摄的完整二维码图像,我们需要进行以下步骤的处理来解析图像内容:
1.将图像转换成一个正方形
2.根据定位图形和坐标点信息建立坐标系
3.根据坐标系切割图像,并提取每一个单元格中的数据信息
4.根据提取的数据信息,重构一个标准的二维码图像

按照以上思路,我将程序主体拆分为以下三个部分,将在后续章节对每一个部分详细介绍

1.图像预处理
2.图像坐标系构建
3.数据读取和重构

原文地址:https://www.cnblogs.com/mousezhou/p/9256524.html

时间: 2024-10-09 02:47:34

发票二维码扫描增强_02_算法概述的相关文章

发票二维码扫描增强_05_构建目标二维码

根据前面获得的行.列分割,我们可以得到 37 * 37个矩阵.根据每个矩阵内的数值信息,可以计算出当前矩阵所代表的数据点,是黑色格子还是白色格子. 从发票的二维码分析,存在以下几种图形特征: 1.图形整体界限分明,每个黑色格子内容饱满,白色格子留白清晰 2.图形大体界限分明,白色格子留白清晰,存在部分黑色格子打印质量较差,无法占满一行,只能占中心部分 3.图形整体糊化严重,黑色格子边界溢出严重,白色格子严重被侵蚀 4.图形大体界限分明,部分格子出现向右溢出的情况,部分格子无法清晰的分辨黑白 根据

发票二维码扫描增强_06_持续优化

整个功能完成后,对扫描速度进行了测试,在I7 6700的CPU机器上,一个图片扫描的时间大概在5-7秒之间: "E:\python workspace\qrcode-complement\venv\Scripts\python.exe" "E:/python workspace/qrcode-complement/main.py" 对二维码部分进行切片处理:0.25531697273254395 对图片进行预处理:0.013962984085083008 对图片基于

php 实现 二维码 扫描登录

本人简单实现的示例,使用任意二维码工具打开二维码对应链接 http://www.vincentguo.cn/demo/scan 原理介绍: 第一步:访问登录页面,生成唯一key,例如MkhjDFL=,并且将此key 存入cache,对应值为-1 ,-1表示未登录 ,key有效期我设置的为5分钟,过期就会重新生成二维码图片 第二步:生成二维码,本人使用库(https://github.com/2amigos/yii2-qrcode-helper),二维码对应的链接 http://www.vince

二维码扫描的相关知识

1.二维码扫描 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍. 2.  编码范围广 该条码可以把图片.声音.文字.签字.指纹等可以数字化的信息进行编码,用条码表示出来:可以表示多种语言文字:可表示图像数据. 3.  容错能力强,具有纠错功能 这使得二维条码因穿孔.污损等引起局部损坏

二维码扫描

1.将ZBar的SDK导入工程 SDK下载地址:https://i.cnblogs.com/Files.aspx 或者去官网下载:https://github.com/bmorton/ZBarSDK 2.设置依赖库 需要添加AVFoundation  CoreMedia  CoreVideo QuartzCore libiconv 3.修改工程配置 1)      Framework Search Path 2)      如果使用xcode7.0以上 ,还需设置: /* 4. 版本说明  1.

iOS使用AVFoundation实现二维码扫描

实现过程如下: Step1:需要导入:AVFoundation Framework 包含头文件: #import <AVFoundation/AVFoundation.h> Step2:设置捕获会话 设置 AVCaptureSession 和 AVCaptureVideoPreviewLayer 成员 1 2 3 4 5 6 7 8 9 10 #import <AVFoundation/AVFoundation.h> static const char *kScanQRCodeQu

【转】 iOS使用AVFoundation实现二维码扫描

原文:http://strivingboy.github.io/blog/2014/11/08/scan-qrcode/ 关于二维码扫描有不少优秀第三方库如: ZBar SDK 里面有详细的文档,相应介绍也非常多,如:http://rdcworld-iphone.blogspot.in/2013/03/how-to-use-barcode-scanner-br-and-qr-in.html ZXing google推出的开源项目,相应介绍如:http://blog.devtang.com/blo

iOS开发-二维码扫描和应用跳转

iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦,出错也不方便调试.在iOS7之后,苹果自身提供了二维码的扫描功能,从效率上来说,原生的二维码远高于这些第三方框架.本文讲解如何使用原生框架实现二维码扫描功能,并且进行扫描后的项目跳转.ps:本期的源代码会在文章结尾给出链接 扫描相关类 二维码扫描需要获取摄像头并读取

Swift:使用系统AVFoundation实现二维码扫描和生成

系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统.之前的请用Zbar来替代 下载地址:http://download.csdn.net/detail/huobanbengkui/8881097 配置project: 引入: import Foundation import AVFoundation 接受AVCaptureMetadataOutputObjectsDelegate(如: class QrcodeVC: UIViewController,AVCaptureM