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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。