使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能

本文将使用Python+OpenCV实现模板匹配算法,以自动识别卡的类型和以及16位卡号数字,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧

目录

1. 效果图

2. 原理

2.1 OCR-A字体

2.2 检测过程步骤

2.3 优化

3. 源代码

这篇博客将介绍如何通过OpenCV和Python使用模板匹配执行光学字符识别(OCR)。具体来说,将使用Python+OpenCV实现模板匹配算法,以自动识别卡的类型和以及16位卡号数字。

在比较数字时,模板匹配是一种非常快速的方法。

为此将图像处理管道分为4个步骤:

通过各种图像处理技术检测信用卡上四组四个数字,包括形态学操作、阈值和轮廓提取。

从四个分组中提取每个单独的数字,得到16个需要分类的数字。

将模板匹配应用于每个数字,将其与OCR-A字体进行比较,以获得数字分类。

检查信用卡号的第一位数字以确定发卡公司。

在对信用卡OCR系统进行评估后,发现如果发卡信用卡公司使用OCR-A字体作为数字,该系统的准确率为100%。 优化可以考虑在野外采集信用卡的真实图像,并训练机器学习模型(通过标准特征提取或训练或卷积神经网络),以进一步提高此系统的准确性。

1. 效果图

首先了解一下卡的组成:

OCR-A 参考字体识别如下:原始图 VS 灰度图 VS 阈值化图 VS 轮廓每个数字提取图:

灰度图:忽略颜色对轮廓提取的影响

阈值化图:使得轮廓在前景白色,背景黑色便于轮廓提取。

轮廓提取图:提取每个数字ROI并记录,方便后续对比卡片中的区域以识别出对应的数字。

以下卡号均是演示卡,

正确的识别卡的类型和卡号,效果图1:

识别过程1――原图 VS 灰度图 VS 白帽图 VS 梯度图如下:

灰度图:忽略色彩影响

白帽图:从较暗的背景中提取较亮的区域

梯度图:计算Schaar梯度图,便于了解图像的色彩分配及提取;

识别过程2――形态学闭合图 VS 二值化图1 VS 阈值化图2 如下:

形态学闭合图:矩形框形态学闭合操作,以帮助闭合信用卡数字之间的小的缝隙

二值化图:以便于提取

阈值化图:方形框形态学闭合操作,以二次帮助闭合信用卡数字区域之间的缝隙

识别过程3――轮廓过滤图 VS 提取最终效果图 如下:

轮廓过滤图:根据面积及纵横比,只保留卡片中的卡号区

最终效果图:提取4组4数字每一个组,然后对每一个组中的4个数字进行截取ROI并识别,并与之前存储的数字ROI进行模板匹配,选取匹配值最高的作为最终结果。

2. 原理

2.1 OCR-A字体

OCR-A字体,是一种专门用于辅助光学字符识别算法的字体。

主要分为:

检测图像中信用卡的位置;本地化信用卡上的四组四位数字;应用OCR识别信用卡上的16位数字;识别信用卡的类型。

Tesseract库在某些情况无法正确识别数字(这可能是因为Tesseract未接受信用卡示例字体培训)。

2.2 检测过程步骤

在字典中存储卡类型映射关系(卡号的第一位数字代表卡类型)。获取参考图像并提取数字。将数字模板存储在字典中。本地化四个信用卡号组,每个组有四位数字(总共16位)。提取要“匹配”的数字。对每个数字执行模板匹配,将每个单独的ROI与每个数字模板0-9进行比较,同时存储每个尝试匹配的分数。查找每个候选数字的最高分数,并构建一个名为“输出”的列表。其中包含信用卡号。将信用卡号和信用卡类型输出到终端,并将输出图像显示到屏幕上。

2.3 优化

使用OpenCV和Python匹配OCR脚本的模板在100%的时间内正确识别了16位数字中的每一位。然而在将OCR图像应用于真实的信用卡图像时,考虑到照明条件、视角和其他一般噪音的变化,可能需要采取更面向机器学习的方法。

3. 源代码

# 信用卡类型及卡号OCR系统 # USAGE # python ocr_template_match.py --reference images/ocr_a_reference.png --image images/credit_card_05.png import argparse import cv2 import imutils import numpy as np # 导入必要的包 from imutils import contours # 构建命令行参数及解析 # --image 必须 要进行OCR的输入图像 # --reference 必须 参考OCR-A图像 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image") ap.add_argument("-r", "--reference", required=True, help="path to reference OCR-A image") args = vars(ap.parse_args()) # 定义一个字典(映射信用卡第一位数字和信用卡类型的编号) FIRST_NUMBER = { "3": "American Express", "4": "Visa", "5": "MasterCard", "6": "Discover Card" } # 从磁盘加载参考OCR-A图像,转换为灰度图,阈值化图像以显示为白色前景和黑色背景 # 并反转图像 # and invert it, such that the digits appear as *white* on a *black* ref_origin = cv2.imread(args["reference"]) cv2.imshow("ref_origin", ref_origin) ref = ref_origin.copy() ref = cv2.cvtColor(ref, cv2.COLOR_BGR2GRAY) cv2.imshow("ref_gray", ref) ref = cv2.threshold(ref, 180, 255, cv2.THRESH_BINARY)[1] cv2.imshow("ref_threshhold", ref) cv2.waitKey(0) # 寻找OCR-A图像中的轮廓(数字的外轮廓线) # 并从左到右排序轮廓,初始化一个字典来存储数字ROI refCnts = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) print('findContours: ', len(refCnts)) refCnts = imutils.grab_contours(refCnts) refCnts = contours.sort_contours(refCnts, method="left-to-right")[0] digits = {} # 遍历OCR-A轮廓 for (i, c) in enumerate(refCnts): # 计算数字的边界框,提取它,缩放到固定的大小 (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(ref_origin, (x, y), (x + w, y + h), (0, 255, 0), 2) roi = ref[y:y + h, x:x + w] roi = cv2.resize(roi, (57, 88)) # 更新数字字典,数字匹配ROI digits[i] = roi cv2.imshow("ref and digits", ref_origin) cv2.上一篇:女神相册密码忘记了 我只用Python写了20行代码下一篇:Python的内置数据类型中的数字 热门搜索:

Python数据类型 

数字类型 

显卡类型 

opencv识别数字 

卡尺的使用方法及读数视频 

相关文章

使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能

2021-09-10阅读(9031)评论(0)推荐()

本文将使用Python+OpenCV实现模板匹配算法,以自动识别卡的类型和以及16位卡号数字,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧

Python OpenCV招商银行信用卡卡号识别的方法

2021-11-20阅读(7293)评论(0)推荐()

这篇文章主要介绍了Python OpenCV招商银行信用卡卡号识别的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

迅捷OCR文字识别软件如何识别银行卡?

2021-09-28阅读(9496)评论(0)推荐()

迅捷OCR文字识别软件支持图片文字识别、图片文字转换成word、扫描文件转换成word等功能,本文中介绍的是使用该软件识别银行卡图片的方法,需要的朋友可以阅读本...

Python随机生成信用卡卡号的实现方法

2021-11-04阅读(3715)评论(0)推荐()

这篇文章主要介绍了Python随机生成信用卡卡号的实现方法,可实现生成信用卡卡号的功能,具有一定参考借鉴价值,需要的朋友可以参考下

excel中如何完整输入银行卡号、身份证号等数字型字符串?

2021-09-27阅读(6978)评论(0)推荐()

身份证号、银行卡号以及一些没有计算意义的数字型字符串是日常生活中经常需要存入数据库的信息。很

python opencv实现信用卡的数字识别

2021-10-05阅读(3977)评论(0)推荐()

这篇文章主要介绍了python opencv实现信用卡的数字识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

JS实现的获取银行卡号归属地及银行卡类型操作示例

2021-09-17阅读(2288)评论(0)推荐()

这篇文章主要介绍了JS实现的获取银行卡号归属地及银行卡类型操作,结合实例形式分析了javascript不依赖第三方接口计算银行卡归属地相关信息操作技巧,需要的朋...

取消

有人回复时邮件通知我

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print "hello python"这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,"Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr