模板:

银行卡:

主要思路:用遮盖法 将无关紧要的上面和下面部分截掉,保留银行卡号差不多的位置,然后用opencv做图像处理,得到四个

连着数字的小框框,然后再在四个小框框里面提取出每一个单个的数字和模板里面的数字进行对比

难点是:如何使用opencv进行图像处理,最后只提取出银行卡卡号部分的图像 ;

如何保证从左到右输出的阅读顺序

import cv2
import numpy as np
roi2=[]
labels=[]
points=[]img=cv2.imread('ocr_a_reference.png')
img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_bit=cv2.threshold(img_gray,10,255,cv2.THRESH_BINARY_INV)[1]
cnts=cv2.findContours(img_bit,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]def cv_show(name,img):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()for i,cnt in enumerate(cnts):x,y,w,h = cv2.boundingRect(cnt)labels.append([x,y,w,h])labels.sort(key=lambda x : x[0])for i ,label in enumerate(labels) : x,y,w,h = label  #cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0),2)original=img_bit[y:y+h,x:x+w]#original = cv2.threshold(original, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]resize=cv2.resize(original, (57, 88))roi2.append(resize)#cv_show('roi',roi2[i])kernel=np.ones((3,3))
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 3)) #非常灵活 非常有用card1 = cv2.imread('./images/credit_card_05.png')
card=card1.copy()
card [0:card.shape[0]//2] = 0
card [2*card.shape[0]//3:] =0
cv_show('img',card)
card_gray = cv2.cvtColor(card,cv2.COLOR_BGR2GRAY)
#tophat = cv2.morphologyEx(card_gray, cv2.MORPH_TOPHAT, rectKernel) #加了之后效果反而变差了
#cv_show('tophat',tophat)
gradX = cv2.Sobel(card_gray, ddepth=cv2.CV_64F, dx=1, dy=0, #ksize=-1相当于用3*3的ksize=-1)
cv_show('gradX',gradX)
gradX=np.absolute(gradX)
(minVal, maxVal) = (np.min(gradX), np.max(gradX))
gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))
sobelx=np.uint8(gradX)close=cv2.morphologyEx(sobelx,cv2.MORPH_CLOSE,rectKernel)
thresh = cv2.threshold(close, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] close=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,rectKernel)
cv_show('close',close)
cnts=cv2.findContours(close.copy(),cv2.RETR_EXTERNAL,\cv2.CHAIN_APPROX_SIMPLE)[0]cv2.drawContours(card, cnts, -1, (0,0,255),3)
#cv_show('cnts',card)if len(cnts)>0:for cnt in cnts:if cv2.contourArea(cnt) >1000:L=cv2.arcLength(cnt,True )       approx=cv2.approxPolyDP(cnt,0.02*L, True)x,y,w,h=cv2.boundingRect(approx)points.append([x,y,w,h])#print(x)#cv2.rectangle(card1,(x,y),(x+w,y+h),(0,0,255),1)points.sort(key=lambda x: x[0])
print(points)
pic=card1.copy()
groupOutput = []
for point in points :numbox=[]getnumber=[]x,y,w,h = point    cv2.rectangle(card1,(x-10,y-5),(x+w+3,y+h+2),(0,0,255),1)box=card_gray[y-5:y+h+5,x-5:x+w+5]#cv_show('1', box)box_thresh=cv2.threshold(box, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] #cv_show('box_thresh',box_thresh)cnts=cv2.findContours(box_thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]for i,cnt in enumerate(cnts):x1,y1,w1,h1=cv2.boundingRect(cnt)#cv2.rectangle(box,(x1,y1),(x1+w1,y1+h1),(0,0,255),2)numbox.append([x1,y1,w1,h1])#cv_show('get', box)    numbox.sort(key=lambda x:x[0])#print('cnt',x1,y1,w1,h1)for num in numbox:x2,y2,w2,h2=numroi1=box_thresh[y2-1:y2+h2+1,x2-1:x2+w2+1]roi1=cv2.resize(roi1,(57,88))#cv_show('roi1',roi1)scores=[]for r in roi2 :#cv_show('r',r)result = cv2.matchTemplate(roi1,r,cv2.TM_CCOEFF)#print('r',result)#print(np.argmax(result))(_, score, _, _) = cv2.minMaxLoc(result)scores.append(score)groupOutput.append(str(np.argmax(scores)))getnumber.append(str(np.argmax(scores)))cv2.putText(card1, "".join(getnumber), (x-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8 , (0, 0, 255), 2)    \print('groupOutput',groupOutput)     cv2.imshow('out',card1)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

opencv-python 银行卡卡号识别相关推荐

  1. 学习Opencv+Python之银行卡卡号识别

    学习Opencv+Python之银行卡卡号识别 思路: 获取模板轮廓 获取模板中每个数字的轮廓 获取银行卡卡号轮廓 分别提取卡号中的每个数字的轮廓 对比识别 代码: # 导入工具包 from imut ...

  2. 基于Python的Opencv 自动识别银行卡卡号系统

    一. 摘要 此应用功能为自动识别并获取银行卡卡号,通过导入需要识别的银行卡图片,以及跟银行卡上卡号的数字相一致的数字模型,则可以成功实现识别并获取银行卡卡号的功能.如果你对此感兴趣的话,下面将会详细介 ...

  3. python-openCV实现银行卡卡号识别

    实现效果: code import cv2 as cv import numpy as np# 轮廓排序 默认从左到右 # --cnts 待排序的轮廓列表 # --method 排序方法 自上而下,从 ...

  4. Python+OpenCV 识别银行卡卡号

    Python+OpenCV 识别银行卡卡号 今天尝试一下用python+OpenCV,使用模板匹配的方式做个简单地识别银行卡卡号(大部分参考网上的,自己改了一部分,代码写的有点不太好,但是思路很清晰, ...

  5. 招商银行信用卡卡号识别项目(第一篇),Python OpenCV 图像处理取经之旅第 53 篇

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 53 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  6. 【项目实战二】基于模板匹配和形态学操作的信用卡卡号识别(OpenCV+Python)

    前言:信用卡卡号识别技术的发展有利于提高银行系统的业务水平和办事效率.相信此次通过学习使用OpenCV中的图像处理方法来实现信用卡卡号识别的项目,能让大家清楚地了解图像处理技术的一般方法与步骤以及如何 ...

  7. OpenCv NDK 银行卡/身份证号识别(3) 银行卡/身份证图像处理和卡号区域剪切

    通过前两篇我们已经对Opencv有所了解了,接下来就要真正的来处理我们的图像,然后把卡号给提取出来.首先我们先简单分析以下银行卡然后把处理流程列出来: 由上图我们很容易知道既然我们要找到卡号,银行卡的 ...

  8. opencv+python+OpenPose姿态实时识别

    opencv+python+OpenPose 姿态实时识别 1.姿态识别 标记 颈.肩.肘.腕.腰.膝.踝 等特征点进行姿态识别,这些关节都有一定程度的自由度. 2.OPenPose OpenPose ...

  9. 前端JS校验银行卡卡号和身份证号码(附ES6版方法)

    1.银行卡卡号校验方法. function luhnCheck(bankno) { var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一 ...

  10. 银行卡卡号格式规范 每隔4为一个空格

    最近涉及到一个绑定银行卡的需求,需要格式化银行卡卡号.即:每隔4为做一个空格. 一个很简单的功能,大牛请自动忽略... 做个笔记O(∩_∩)O哈! bankCardNoEditTxt.addTextC ...

最新文章

  1. EntityFramework之原始查询及性能优化(六)
  2. 设计模式-依赖倒置-Dependency Inversion Principle
  3. 你可能没看懂Supercell的新游戏
  4. IntelliJ IDEA for Mac下载、安装、使用TunnelliJ插件(一种TCP/IP Monitor)
  5. rails i18n模型_Rails国际化的完整指南(i18n)
  6. python中url是什么意思_Python中url标签使用详解
  7. 基于ubuntu20.4安装谷歌拼音中文输入法
  8. (10)ERStudio
  9. 爆火GitHub 的十大最火 Python 项目,三天收藏突破10w+
  10. 斯特林数 java实现_斯特林数
  11. 用“狗屁不通文章生成器”写作文,竟打败73.5%的学生?
  12. T-S模糊模型与状态反馈控制及Matlab仿真 (附代码)
  13. Java项目:流浪猫狗救助管理系统(java+SSM+JSP+bootstrap+jQuery+mysql)
  14. GitLab CI/CD .gitlab-ci.yaml 关键词(三):制品artifacts,缓存cache
  15. 斐波那契数列python循环算法求解_斐波那契数列的算法实现 —— python
  16. c语言在数学方面的应用编程,浅谈数学在C语言编程中的应用.doc
  17. 【字体压缩】ttf字体压缩软件,默认保留常用3500字,可手动添加删减文字
  18. H3CTE-OSPF的掌握指标
  19. [Git] git pull冲突和git stash pop冲突解决
  20. 疫苗接种预约挂号排队通知助手系统开发

热门文章

  1. CAN/RS-485为什么要用双绞线?
  2. 计算机总自动开机 如何关闭,手把手教你win10电脑关机后自动开机怎么解决
  3. 《SRE Google运维解密》散文
  4. matlab求解vrp问题遗传算法,vrp问题(遗传算法vrp问题)
  5. chrome浏览器完整保存整个网页 可离线访问
  6. 《那些年啊,那些事——一个程序员的奋斗史》——10
  7. 基于web版kettle开发的用户专业版B/S架构工具
  8. UnityShader实现漫反射光照模型和高光反射光照模型
  9. Unity Shader :实现漫反射与高光反射
  10. 缩写月份单词python代码_Python替换月份为英文缩写的实现方法