计算机视觉-OpenCV(银行卡号识别)
银行卡号识别(模板匹配)
1、模板预处理
2、卡片图片预处理
3、模板匹配
import cv2
import numpy as np
import myutils
from imutils import contoursdef cv_show(img,name):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
#读取模板文件
img=cv2.imread(r"D:\pythonProject\NewProject\PIc\number.png")
#cv_show(img,'number')
#转换灰度图
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv_show(gray,'gray_number')
#转换为二值图
ret,ref=cv2.threshold(gray,10,255,cv2.THRESH_BINARY_INV)
#cv_show(ref,'ref')
#检测轮廓
refCnts,hierarchy=cv2.findContours(ref,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#绘制轮廓
res=cv2.drawContours(img.copy(),refCnts,-1,(0,0,255),2)
#cv_show(res,'res')
#检查绘制轮廓的数量
print(np.array(refCnts).shape)
#排序轮廓(从左到右),返回值:轮廓坐标,boundingBoxes
refCnts,boundingBoxes=contours.sort_contours(refCnts,method="left-to-right")
#print(refCnts)digits={}
#遍历每一个轮廓
for (i,c) in enumerate(refCnts):#计算外接矩形(x,y,w,h)=cv2.boundingRect(c)roi=ref[y:y+h,x:x+w]#重设大小roi=cv2.resize(roi,(57,58))digits[i]=roi
#cv_show(digits[3],'1')
#print('------------',digits)#输入文件处理
#初始化卷积核
rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#卡片图像读取
image=cv2.imread(r"D:\pythonProject\NewProject\PIc\card.png")#cv_show(image,'image')gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
high,width=gray_image.shape
gray_image=cv2.resize(gray_image,(int(width / 12), int(high / 12)))
#cv_show(gray_image,'gray_image')
print(gray_image.shape)#礼帽操作(突出更明亮的区域)
tophat=cv2.morphologyEx(gray_image,cv2.MORPH_TOPHAT,rectKernel)
#cv_show(tophat,'tophat')
'''
#加转二值图
ret,ref1=cv2.threshold(tophat,10,255,cv2.THRESH_BINARY_INV)
cv_show(ref1,'ref')
'''
#Sobel算子 检测边缘,ksize=-1相当于3×3
gradX=cv2.Sobel(tophat,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)
#负数取绝对值,与cv2.convertScaleAbs类似
gradX=np.absolute(gradX)
#cv_show(gradX,'1')
#归一化
(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_OTSY会自动寻找合适阈值,适合双峰,需把阈值参数设成0
thresh=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
#cv_show(thresh,'thresh1')#计算外轮廓
threshCnts,hierarchy=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#画轮廓
image_res=cv2.drawContours(gray_image.copy(),threshCnts,-1,(0,0,255),2)
#cv_show(image_res,'image_res')locs=[]
#遍历轮廓
for (i,c) in enumerate(threshCnts):(x,y,w,h)=cv2.boundingRect(c)ar = w/float(h)#选择合适的轮廓区域if ar > 3.5 and ar<4.0:locs.append((x,y,w,h))#im = cv2.drawContours(gray_image.copy(), c, -1, (0, 0, 255), 2)#cv_show(im, 'im')
#排序
locs=sorted(locs,key=lambda x:x[0])
output=[]#遍历每一个轮廓中数字
for (i,(gX,gY,gW,gH)) in enumerate(locs):groupOutput=[]#根据坐标提取每一个组(根据轮廓往外稍扩一些)group=gray_image[gY-3:gY+gH+3,gX-3:gX+gW+3]#cv_show(group,'group')#预处理#二值化group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]#cv_show(group, 'group')#轮廓检测groupCnts, hierarchy = cv2.findContours(group, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)#排序cardCnts, boundingBoxes = contours.sort_contours(groupCnts, method="left-to-right")#计算每一组中的每一个数值for c in cardCnts:#找到当前数值的轮廓,resize数值大小,与模板大小一致(x,y,w,h)=cv2.boundingRect(c)roi = thresh[y:y + h, x:x + w]# 重设大小roi = cv2.resize(roi, (57, 58))#cv_show(roi,'roi')scores=[]#在模板中计算每一个的得分for (digit,digitROI) in digits.items():#模板匹配result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)(_,score,_,_)=cv2.minMaxLoc(result)scores.append(score)#np.argmax,返回最大值的索引值groupOutput.append(str(np.argmax(scores)))#画出来#cv2.rectangle(gray_image,())cv2.putText(gray_image,"".join(groupOutput),(gX,gY-15),cv2.FONT_HERSHEY_SIMPLEX,0.35,(0,0,255),2)output.extend(groupOutput)
print(output)
#cv_show(gray_image,'gray_imageend')
计算机视觉-OpenCV(银行卡号识别)相关推荐
- 计算机视觉-opencv银行卡识别
1.首先下载opencv-python库,这个库的版本一定要固定 pip install opencv-python==4.1.2.30 2.准备下载模板图片,如下,在代码中命名为1.jpg 3.准备 ...
- 计算机视觉---opencv人脸识别
import cv2#步骤1:载入图像 img = cv2.imread(r'C:\Users\yu\Desktop\1.jpg') img = cv2.resize(img,(int(img.sha ...
- 银行卡号识别python_银行卡号识别 基于 OpenCV 光学字符识别(OCR)
银行卡号识别 基于 OpenCV 光学字符识别(OCR) 今天的博客文章是我们最近关于光学字符识别(OCR)和计算机视觉的系列的延续. 在之前的博客文章中,我们学习了如何安装Tesseract二进制文 ...
- 计算机视觉OpenCV之人脸识别的示例(Python)
计算机视觉之人脸识别看起来很高大上,但是用OpenCV解决很方便,OpenCV真的太强大了.. 直接上代码: #!/usr/bin/env python3import cv2image = cv2.i ...
- android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别
前言 在日常的开发中,我们有时会遇到添加银行卡的需求,这时候,产品可能会让你仿一下支付宝之类的相机扫描识别银行卡号.很多时候,做这样的需求会去找找稳定的第三方,本文通过 OpenCV 结合识别的需求带 ...
- OCR-基于OpenCV、Tesseract的银行卡号识别
title: 'OCR:基于OpenCV.Tesseract的银行卡号识别' type: categories date: 2016-12-01 16:50:30 categories: OC tag ...
- python人脸照片分类_Python OpenCV 人脸识别(一)
前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...
- opencv +数字识别
现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...
- c# opencv车牌识别_opencv +数字识别
现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...
- 共有65款 计算机视觉库/人脸识别开源软件
转载:https://www.cnblogs.com/Anita9002/p/5038533.html. 引自:http://www.oschina.net/project/tag/316/openc ...
最新文章
- 单端信号和差分信号的区别
- Java中Date各种相关用法
- TensorFlow tf.data 导入数据(tf.data官方教程) * * * * *
- 数据分析实战-PUBG数据集EDA
- System.Text.Json中时间格式化
- python工作状态_[Python设计模式] 第16章 上班,干活,下班,加班——状态模式
- Windows Azure奇趣应用之Swingify
- java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...
- 渭南师范计算机科学与技术,渭南师范学院计算机科学与技术专业2016年在陕西理科高考录取最低分数线...
- python踩坑记录篇,持续更新
- LINUX自带库与系统重名怎么办
- 【ASUS】win7下安装USB3.0驱动蓝屏死机问题
- matlab如何批量去背景,ImageJ怎么消除背景 批量去背景教程
- 第二十四天:2019年第九届MathorCup高校数学建模挑战赛A题
- 重磅!中国科学技术大学,成立新学院!
- 深剖基类和派生类的虚函数表
- Java打怪升级道路
- 专访前C#编译器组首席工程师Eric Lippert
- plant simulation 建模案例分析
- 【VAR | 时间序列】应用VAR模型时的15个注意点