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
0
投稿
猜你喜欢
- 本文实例讲述了CI操作cookie的方法。分享给大家供大家参考,具体如下:CI 操作cookie 有三种方法,2中Ci自带的,其
- asp连接sql server代码如下:dim connset conn = Serve
- 一、理解装饰器所有东西都是对象(函数可以当做对象传递)由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。de
- 在今天网络开发方面,JavaScript起了很关键的作用;像jQuery, MooTools, Prototype等等JavaScript框
- 在使用Keras搭建验证码识别模型时,需要大量的验证码图片。在这里,使用captcha模块生成验证码图片,验证码图片名称为验证码上显示的字符
- 1. 二维数据曲线图1.1 绘制二维曲线的基本函数1.plot()函数 plot函数用于绘制二维平面上的线性坐标曲线图,要提供一组x坐标和对
- 向数据库加入字符类型的数据时,我老爱写错数据中含有单引号的语句而导致操作失败像:正确的SQL语句:INSERT baby 
- XML Web Service 是在 Internet 上进行分布式计算的基本构造块。开放的标准以及对用户和应用程序之间的通信和协作的关注产
- PDO::inTransactionPDO::inTransaction — 检查是否在一个事务内(PHP 5 >= 5.3.3, B
- asp判断网址格式是否合法代码 具体实现办法见下列代码:<% function checki
- 在js中调用asp文件的方法很简单,我们可以用在静态页面的点击数统计,虽然静态页面不支持asp程序,但是我们可以使用js调用,来变相的达到这
- asp之家注:有时候我们需要知道我们链接的远程图片是否正常,是否存在,当不存在时如果我们继续引用,就会在网页上留个大大的X,影响了页面美观。
- 这种情况在Access下可以通过,但SQL则不行,在百度搜索解决方法,发现N多人出现同样问题却找不到解决办法: 代码如下:set
- 本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下:import numpy as npimport matplo
- 1. 引言在使用Python的时候,通常会出现如下场景:array = [1, 2, 3, 3, 2, 1, 0, 2]获取array中元素
- 1、首先停止正在运行的MySQL进程 Linux下,运行 killall -TERM mysqld Windows下,如果写成服务的 可以运
- 前言当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响。这样的话,它们就不会干扰任何其他的测试函数,更不会日
- 最近,某水果手机厂在万众期待中开了一场没有发布万众期待的手机产品的发布会,发布了除手机外的其他一些产品,也包括最新的水果14系统。几天后,更
- 原来字母还可以组合成各种动物图案,真是佩服设计师的奇思妙想,很可爱,超级有趣的组合!Bembo's Zoo 猴子:羊是牛吗,勤劳的水
- 一、SeabornSeaborn 建于 matplotlib 库的之上。它有许多内置函数,使用这些函数,只需简单的代码行就可以创建漂亮的绘图