银行卡卡号识别步骤

1.对模板数字进行处理,得到每个模板的数字。

代码如下(示例):

import cv2
import numpy as npdef sort_contours(cnts,method = 'left-to-right'):reverse = Falsei = 0if method =='right-to-left' or method =='bottom-to-top':reverse = Trueif method == 'top-to-bottom'or method =='bottom-to-top':i = 1boundingBoxes = [cv2.boundingRect(cnt)for cnt in cnts](cnts,boundingBoxes) = zip(*sorted(zip(cnts,boundingBoxes),key = lambda b: b[1][i],reverse = reverse))return cnts,boundingBoxesdef cv_show(name,img):#定义一个函数cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()img = cv2.imread('ocr_a_reference.png')#读模板
# cv_show('img',img)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#色彩空间转化,转化为灰度图
# cv_show('img_gray',img_gray)
ret,img_binary = cv2.threshold(img_gray,127,255,1)#二值化
cv_show('img_binary',img_binary)cnts,hierarchy = cv2.findContours(img_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#查找外轮廓
img_rect = cv2.drawContours(img,cnts,-1,(0,0,255),2)# 绘制轮廓
cv_show('img_rect',img_rect)
cnts = sort_contours(cnts)[0]
number = {}for (i,cnt) in enumerate(cnts):(x,y,w,h) = cv2.boundingRect(cnt)roi = img_binary[y:y+h,x:x+w]roi = cv2.resize(roi,(57,88))number[i] = roi


2.对银行卡上的数字进行选取

# 读取信用卡图片
cardImg = cv2.imread('credit_card_01.png')
cardImg = cv2.resize(cardImg,(300,int(float(300/cardImg.shape[1])*cardImg.shape[0])),interpolation = cv2.INTER_AREA)
# cv_show('cardImg',cardImg)
cardImg_gray = cv2.cvtColor(cardImg,cv2.COLOR_RGB2GRAY)
# cv_show('cardImg_gray',cardImg_gray)
# 指定卷积恢大小
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# 进行礼帽操作
cardImg_tophat = cv2.morphologyEx(cardImg_gray,cv2.MORPH_TOPHAT,rectKernel)
cv_show('cardImg_tophat',cardImg_tophat)


3.对非卡号数字进行剔除

# 使用sobel算子进行边缘检测,这里仅适用x方向的梯度。因为经过实验,适用x,y混合的梯度,效果并不理想
sobelx = cv2.Sobel(cardImg_tophat,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
(minX,maxX) = (np.min(sobelx),np.max(sobelx))
sobelx = (255*((sobelx-minX)/(maxX-minX)))
sobelx = sobelx.astype('uint8')
# cv_show('sobelx',sobelx)
# 进行数字闭运算,使相邻的数字连接起来,这样便于删选
cardImg_close = cv2.morphologyEx(sobelx,cv2.MORPH_CLOSE, rectKernel)
# cv_show('cardImg_close',cardImg_close)cardImg_binary = cv2.threshold(cardImg_close,0,255,cv2.THRESH_OTSU | cv2.THRESH_BINARY)[1]
# cv_show('cardImg_binary',cardImg_binary)cardImg_close = cv2.morphologyEx(cardImg_binary,cv2.MORPH_CLOSE,sqKernel)
cv_show('cardImg_close',cardImg_close)
# 轮廓检测,检测出每一个数字区块
cnts,hierarchy = cv2.findContours(cardImg_close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cardImg_cnts = cv2.drawContours(cardImg.copy(),cnts,-1,(0,0,255),2)
cv_show('cardImg_cnts',cardImg_cnts)
# 对轮廓进行删选,根据边框的尺寸仅保留卡号区域
locs = []
for (i,c) in enumerate(cnts):(x,y,w,h) = cv2.boundingRect(c)ar = w/ float(h)if ar > 2.5 and ar <4.0:if (w>40 and w<55) and (h>10 and h<20):locs.append((x,y,w,h))
loce = sorted(locs,key = lambda x:x[0])# for (x,y,w,h) in locs:
#     cv2.rectangle(cardImg_cnts,(x,y),(x+w,y+h),(0,0,0),1)
# cv_show('cardImg_cnts',cardImg_cnts)



4.将卡号进行数字划分,进行模板匹配,得到每个数字图像所对应的数字

output = []
# 对每4个数字块进行处理
for (i,(x,y,w,h)) in enumerate(locs):group_output = []group = cardImg_gray[y-5:y+h+5,x-5:x+w+5]group = cv2.threshold(group,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY)[1]cv_show('group',group)group_cnts,group_hierarchy = cv2.findContours(group,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)group_cnts = sort_contours(group_cnts,method='left-to-right')[0]# 分割每个数字for cnt in group_cnts:(nx,ny,nw,nh) = cv2.boundingRect(cnt)roi = group[ny:ny+nh,nx:nx+nw]roi = cv2.resize(roi,(57,88))
#         cv_show('roi',roi)score = []# 对每个数字进行模板匹配for (number_i,number_roi) in number.items():result = cv2.matchTemplate(roi,number_roi,cv2.TM_CCOEFF)score_ = cv2.minMaxLoc(result)[1]score.append(score_)group_output.append(str(np.argmax(score)))# 绘制每个数字    cv2.rectangle(cardImg,(x-5,y-5),(x+w+5,y+h+5),(0,0,255),1)cv2.putText(cardImg,"".join(group_output),(x,y-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)output.append(group_output)
cv_show('cardImg',cardImg)

OpenCV 银行卡卡号识别相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 银行卡三元素检测 根据姓名+身份证号+银行卡卡号验证信息是否匹配

    银行卡检测api,根据姓名+身份证号+银行卡卡号验证信息是否匹配. 接口名称:银行卡检测api 接口平台:聚合数据 接口地址:http://v.juhe.cn/verifybankcard3/quer ...

  10. appium使用sendkeys输入银行卡卡号(每4个数字自动空一格)总是输入不正确的解决办法

    appium使用sendkeys输入银行卡卡号(每4个数字自动空一格)总是输入不正确的解决办法 方法一: public static void inputComsumeInfo(WebElement ...

最新文章

  1. 【vue】使用vue+element搭建项目,Tree树形控件使用
  2. 如何从中级Java程序员过渡到高级Java程序员
  3. 怎么将手机QQ浏览器里面的文章分享给QQ好友
  4. C++socket编程(三):3.6 服务端recv客户端发送的数据
  5. java pic 通信_dsPic33E:RS485通信问题
  6. RabbitMQ入门(2)--工作队列
  7. android 键盘回车按钮事件,android 监听软键盘 回车键
  8. 数据挖掘的办法有哪些
  9. 【PHP 跨域问题】
  10. 《图解网络硬件》网络硬件通用基础知识
  11. php公益培训,周日晚上听seo的课,yy88354001
  12. 快速学习OSG(2)——光照
  13. 蓝牙 - 配对和连接
  14. Oracle数据库学习--2个不错的网站
  15. 计算机p是什么单位是什么,功率的计算公式及单位
  16. 如何写一个简单的手写识别算法?
  17. 【人脸识别】人数统计【含GUI Matlab源码 2121期】
  18. 分享贴:以亚洲银行为例,分享离岸银行跨境金融服务的业务范围
  19. sql字符串包含单引号
  20. Redis系列-php怎么通过redis扩展使用redis

热门文章

  1. SafeTpack — 基于 AURI 2G 实现功能安全目标
  2. Facebook的新算法可以预测出你的贫富阶级
  3. Unicode program converted
  4. java 不登录购物车_java-没有用户登录时存储购物车(playframework疑问)
  5. 2021年黄石二中高考成绩查询,【黄石二中2018高考金榜】黄石二中2004届高考总结...
  6. UOJ #60 [UR #5] 怎样提高智商
  7. 北京亿阳信通Oracle笔试题
  8. 为Ribbon Client自定义配置
  9. grpc复用client连接
  10. 由于找不到 MSVCR120.dll,无法继续执行代码终极解决方法