Python+OpenCV实现信用卡数字识别的方法详解
作者:泡泡怡 发布时间:2022-01-15 14:25:41
标签:Python,OpenCV,信用卡,数字,识别
一、模板图像处理
(1)灰度图、二值图转化
template = cv2.imread('C:/Users/bwy/Desktop/number.png')
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
cv_show('template_gray', template_gray)
# 形成二值图像,因为要做轮廓检测
ret, template_thresh = cv2.threshold(template_gray, 127, 255, cv2.THRESH_BINARY_INV)
cv_show('template_thresh', template_thresh)
结果如图所示:
(2)进行轮廓提取接受参数为二值图像,得到数字的信息,RETR_EXTERNAL 就是只是需要外轮廓,cv2.CHAIN_APPROX_SIMPLE只保留终点坐标。
template_contours, hierarchy = cv2.findContours(template_thresh,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(template,template_contours,-1,(0,0,255),2)
cv_show('template',template)
-1:代表所的轮廓,我们这里画出来10个轮廓。(可以用代码验证一下)
print(np.array(refCnts,-1,(0,0,255),3)
结果:10
结果如图所示:
(3)我们需要将轮廓进行大小排序(我们拿到的数据模板不一定向我们前面所展示的从0-9按顺序的,所以我们需要进行排序、resize。
def contours_sort(contours, method=0):
if method == 0:
contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0])
else:
contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0], reverse=True)
return contours
我们调用函数#将轮廓排序,位置从小到大就是数字的信息。然后我们遍历模板,使用cv2.boudingRect获得轮廓的位置,提取位置对应的图片,与数字结合构造成模板字典,dsize = (55, 88),统一大小。
dict_template = {}
for i, contour in enumerate(template_contours):
# 画出其外接矩阵,获得其位置信息
x, y, w, h = cv2.boundingRect(contour)
template_img = template_thresh[y:y + h, x:x + w]
# 使用cv2.resize变化模板的大小
template_img = cv2.resize(template_img, dsize)
cv_show('template_img{}'.format(i), template_img)
dict_template[i] = template_img
结果如图所示:
。。。。。。。。。。
二、信用卡图片预处理
(1)进行灰度值
card_gray = cv2.cvtColor(card, cv2.COLOR_BGR2GRAY)
cv_show('card_gray',card_gray)
(2)形成二值图像,因为要做轮廓检测,解释参数:THRESH_OTSU会自动寻找合适的阈值,适合双峰,需要阈值参数设置为零 二值化
card_thresh =cv2.threshold(card_gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
cv_show('card_thresh',card_thresh)
结果如图所示:
(3) 我们观察一下图片,我们识别图片上的数字但也会存在黄框和红框中的干扰,这时候我们可以想到前面所学到的形态学操作礼帽,闭运算...
先进行礼帽操作,突出更明亮的区域:
kernel=np.ones((9,3),np.uint8)
card_tophat=cv2.morphologyEx(card_gray,cv2.MORPH_TOPHAT,kernel)
cv_show('card_tophat',card_tophat)
结果如图:
(4)我们进行图像的轮廓检测只取外轮廓。在这个图上有不同的区域,我们如何区分呢,我们可以用h的大小进行估计,这个数据根据项目而定
bankcard_contours, hierarchy = cv2.findContours(card_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
banck_card_cnts = []
draw_img = card.copy()
for i, contour in enumerate(bankcard_contours):
x, y, w, h = cv2.boundingRect(contour)
# 数字的x 坐标在 一定的位置范围
if 0.5 * card_h < y < 0.6 * card_h:
banck_card_cnts.append((x, y, w, h))
draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),
thickness=2) # 画出这个矩形,会在原图上画
cv_show_image('rectangle_contours_img', draw_img)
结果如图:
(5)模板匹配,读出图像。
for i, locs in enumerate(banck_card_cnts):
x, y, w, h = locs[:] # 保留了在原始图像的位置信息
dst_img = card_thresh[y:y + h, x:x + w] # 获得当前图像的位置和区域
dst_img = cv2.resize(dst_img, dsize)
cv_show('rectangle_contours_img', dst_img)
tm_vals = {}
for number, temp_img in dict_template.items():
# 模板匹配,采用计算相关性系数,值越大越相关
res = cv2.matchTemplate(dst_img, temp_img, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
tm_vals[number] = max_val
number_tm = max(tm_vals, key=tm_vals.get)
# 在图像上画出结果来
draw_img = cv2.rectangle(draw_img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255),
thickness=2)
cv2.putText(draw_img, str(number_tm), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.65,
color=(0, 0, 255), thickness=2)
cv_show_image('final_result', draw_img)
结果如图所示:
只是展示一部分(倒序输出)
来源:https://blog.csdn.net/m0_72662900/article/details/126909642


猜你喜欢
- 前言matplotlib是一个非常强大的Python第三方绘图包,可以绘制非常多非常漂亮的图形。import numpy as npimpo
- 我在使用conda安装虚拟环境的过程中,下载一些包,比如torch等,发现在虚拟环境中有一份以外,pkgs文件夹下同样也会出现一份,大小一样
- 1、下载从如下地址下载mycat的安装包:http://www.mycat.io/2、解压解压下载的安装包3、安装安装mycat
- 从Python3.2引入的concurrent.futures模块,Python2.5以上需要在pypi中安装futures包。future
- 本文实例讲述了python实现合并两个数组的方法。分享给大家供大家参考。具体如下:python合并两个数组,将两个数组连接成一个数组,例如,
- 很多人都听过WAMP这个词吧,首先来看WAMP是什么意思?Windows下的Apache+MySQL+PHP,称为WAMP。属于WAMP环境
- python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,
- 一、条件简化我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这
- 目录一、Python 3.8 安装1.通过 Apt 安装Python3.82.配置 python3.8 为系统默认 python3二、卸载p
- 1.HTTP请求格式: <request line> <headers> <blank line> [&
- 昨天在群里看到有新同学还在问MySQL无法启动的问题,于是总结了几个常见情况,权当普及帖了,老鸟自觉飞过。 问题1:目录、文件权限设置不正确
- 在Python项目中,我们通常需要使用许多第三方库来提供额外的功能和工具。但是,直接将这些库上传到Git仓库并不是一种好的做法,因为这会使得
- 其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不
- 我们讲了requests的用法以及利用requests简单爬取、保存网页的方法,这节课我们主要讲urllib和requests的区别。1、获
- 需求描述上周突然接到一个任务,要通过XX网站导出XX年-XX年之间的数据,导出后的文件名就是对应日期,导出后发现,竟然有的文件大小是一样,但
- 今天在打开sql server 的时候打不开。报了一个错误,然后我打开sql server配置管理器,就看到了如下图这个错误。然后就去网上搜
- asp.net MVC中Action参数不只是一些基本类型,也支持实体参数。那么从客户端传来的数据如何映射或转换成实体对象呢?就是通过实体绑
- 在vue中使用ant-design-vue组件官方地址:Ant Design Vue1. 安装首先使用vue-cli创建项目,然后进入项目,
- 1.find函数find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含
- 天极网软件频道的图片切换特效,完全是由XHTML+CSS+JS实现的图片切换特效,弄了好半天啊!!如果您使用或者转载请别忘了加我的一个连接啊