Python开发之基于模板匹配的信用卡数字识别功能
环境介绍
Python3.6+OpenCV3.4.1.15
原理介绍
首先,提取出模板中每一个数字的轮廓,再对信用卡图像进行处理,提取其中的数字部分,将该部分数字与模板进行匹配,即可得到结果。
模板展示
完整代码
#!/usr/bin/envpython
#—*—coding:utf-8—*—
#@Time:2020/1/1114:57
#@Author:Martin
#@File:utils.py
#@Software:PyCharm
importcv2
defsort_contours(cnts,method='left-to-right'):
reverse=False
i=0
ifmethod=='right-to-left'ormethod=='bottom-to-top':
reverse=True
ifmethod=='top-to-bottom'ormethod=='bottom-to-top':
i=1
boundingboxes=[cv2.boundingRect(c)forcincnts]
(cnts,boundingboxes)=zip(*sorted(zip(cnts,boundingboxes),key=lambdab:b[1][i],reverse=reverse))
returncnts,boundingboxes
defresize(image,width=None,height=None,inter=cv2.INTER_AREA):
(h,w)=image.shape[:2]
ifwidthisNoneandheightisNone:
returnimage
ifwidthisNone:
r=height/float(h)
dim=(int(w*r),height)
else:
r=width/float(w)
dim=(width,int(h*r))
resized=cv2.resize(image,dim,interpolation=inter)
returnresized
#!/usr/bin/envpython
#—*—coding:utf-8—*—
#@Time:2020/1/1114:57
#@Author:Martin
#@File:template_match.py
#@Software:PyCharm
"""
基于模板匹配的信用卡数字识别
"""
importcv2
importutils
importnumpyasnp
#指定信用卡类型
FIRST_NUMBER={
'3':'AmericanExpress',
'4':'Visa',
'5':'MasterCard',
'6':'DiscoverCard'
}
#绘图显示
defcv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#读取模板图像
img=cv2.imread('./images/ocr_a_reference.png')
cv_show('img',img)
#转化成灰度图
ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv_show('ref',ref)
#转化成二值图像
ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]
cv_show('ref',ref)
#计算轮廓
ref_,refCnts,hierarchy=cv2.findContours(ref.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,refCnts,-1,(0,0,255),3)
cv_show('img',img)
print(np.array(refCnts).shape)
#排序,从左到右,从上到下
refCnts=utils.sort_contours(refCnts,method='left-to-right')[0]
digits={}
#遍历每一个轮廓
for(i,c)inenumerate(refCnts):
(x,y,w,h)=cv2.boundingRect(c)
roi=ref[y:y+h,x:x+w]
roi=cv2.resize(roi,(57,88))
digits[i]=roi
#初始化卷积核
rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
#读取输入图像,预处理
img_path=input("Inputthepathandimagename:")
image_input=cv2.imread(img_path)
cv_show('image',image_input)
image_input=utils.resize(image_input,width=300)
gray=cv2.cvtColor(image_input,cv2.COLOR_BGR2GRAY)
cv_show('gray',gray)
#礼帽操作,突出更明亮的区域
tophat=cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)
cv_show('tophat',tophat)
gradX=cv2.Sobel(tophat,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
gradX=np.absolute(gradX)
(minVal,maxVal)=(np.min(gradX),np.max(gradX))
gradX=(255*((gradX-minVal)/(maxVal-minVal)))
gradX=gradX.astype("uint8")
print(np.array(gradX).shape)
cv_show('gradX',gradX)
#闭操作
gradX=cv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel)
cv_show('gradX',gradX)
thresh=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
cv_show('thresh',thresh)
thresh=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)
cv_show('thresh',thresh)
#计算轮廓
thresh_,threshCnts,hierarchy=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts=threshCnts
cur_img=image_input.copy()
cv2.drawContours(cur_img,cnts,-1,(0,0,255),3)
cv_show('img',cur_img)
locs=[]
#遍历轮廓
for(i,c)inenumerate(cnts):
(x,y,w,h)=cv2.boundingRect(c)
ar=w/float(h)
if2.5
结果展示
CreditCardType:Visa
CreditCard#:4020340002345678
总结
以上所述是小编给大家介绍的Python开发之基于模板匹配的信用卡数字识别功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。