使用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号

相关文章

本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存...
Python中的回车和换行是计算机中文本处理中的两个重要概念,...
SQL Server启动不了错误1067是一种比较常见的故障,主要原因...
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的...
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲...
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错...