一、前言

随着移动互联的发展,商业移动应用越来越多,这些商业移动应用很多涉及到个人银行卡账户的绑定,实际测试中手动输入16—19位银行卡号码,速度慢,易出错,用户体验非常差。为了提高在移动终端上输入银行卡号的速度和准确性准备自己动手实现一个银行卡号识别系统,这样便可自动识别银行卡号。
书接上文,上文提到如何对模板图像进行处理,本文继续讲解对输入图像如何处理以及具体的代码实现,代码我会给出相应的注释,以便大家能够看懂,希望大家学习愉快,在评论区多多互动,如果能点赞支持就更好了!首先在这里简单说一下银行卡号识别的思路。

  • 模板图像的处理算法
    读取图像->灰度图->二值图->找到所有数字的外轮廓->画出轮廓->对轮廓进行排序->将单个数字制成一个模板

二、输入图像的处理流程

  • 输入图像的处理算法
    读取输入图像->调整图片size->转换为灰度图->进行礼帽操作,突出明亮的区域->Sobel算子进行边缘检测->进行闭操作,以便数字区域可以连成一篇区域->转换为二值图->继续一个闭操作,进一步让数字连成一片区域->找到所有符合要求的轮廓->对筛选得到的轮廓进行排序->遍历每个区域的各个数字->利用模板匹配法进行匹配,输出银行卡号!

三、代码实现

# 初始化卷积核
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))#读取输入图像,预处理
image = cv2.imread(args["image"])
cv_show('image',image) # 展示输入图像# 调整图像的size
image = myutils.resize(image, width=300)# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv_show('gray', gray)#礼帽操作,突出更明亮的区域  TODO:什么是礼帽操作
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)
cv_show('tophat', tophat)'''利用Sobel算子进行边缘检测:return 返回输入图像的梯度图
'''
gradX = cv2.Sobel(tophat, ddepth=cv2.CV_32F, dx=1, dy=0, #ksize=-1相当于用3*3的ksize=-1)gradX = np.absolute(gradX)  # 获得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_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0
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)
threshCnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cnts = threshCnts
cur_img = image.copy()
cv2.drawContours(cur_img, cnts, -1, (0, 0, 255), 3)
cv_show('img', cur_img)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))# 将符合的轮廓从左到右排序
locs = sorted(locs, key=lambda x:x[0])
output = []# 遍历每一个轮廓中的数字
for (i, (gX, gY, gW, gH)) in enumerate(locs):# initialize the list of group digitsgroupOutput = []# 根据坐标提取每一个组group = gray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]cv_show('group',group)# 预处理group = cv2.threshold(group, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]cv_show('group',group)# 计算每一组的轮廓# group_,digitCnts,hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)digitCnts,hierarchy = cv2.findContours(group.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)digitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]
# 计算每一组中的每一个数值for c in digitCnts:# 找到当前数值的轮廓,resize成合适的的大小(x, y, w, h) = cv2.boundingRect(c)roi = group[y:y + h, x:x + w]roi = cv2.resize(roi, (57, 88))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)# 得到最合适的数字groupOutput.append(str(np.argmax(scores)))# 画出来cv2.rectangle(image, (gX - 5, gY - 5),(gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)cv2.putText(image, "".join(groupOutput), (gX, gY - 15),cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)# 得到结果output.extend(groupOutput)# 打印结果
print("Credit Card Type: {}".format(FIRST_NUMBER[output[0]]))
print("Credit Card #: {}".format("".join(output)))
cv2.imshow("Image", image)
cv2.waitKey(0)

四、实验结果

  • 输入图像
  • 转为灰度图
  • 礼帽操作,突出更明亮的区域
  • Sobel算子边缘检测
  • 闭操作
  • THRESH_OTSU会自动寻找合适的阈值,适合双峰,需把阈值参数设置为0,然后再来一个闭操作
  • 找到并画出轮廓
  • 识别结果

基于OpenCV的银行卡号识别系统实现(三)-----输入图像的处理+代码实现相关推荐

  1. Python 基于 opencv 的车牌识别系统, 可以准确识别车牌号

    大家好,我是程序员徐师兄,6 年大厂程序员经验,点击关注我 简介 毕业设计基于Opencv的车牌识别系统 车牌搜索识别找出某个车牌号 对比识别车牌系统 车牌数据库认证系统 车牌图文搜索系统 车牌数据库 ...

  2. 基于OpenCV的人脸识别系统的pyhon源代码

    本论文主要阐述了基于OpenCV的人脸识别原型系统.基于生物特征识别的身份认证方法有指纹.掌纹.眼睛虹膜.人脸等,其中,由于人脸的稳定性和可见性,人脸识别的研究与应用成为热点,本文针对出租公寓安全管理 ...

  3. 基于Opencv的车牌识别系统想必大家都会了,那么识别后计费系统会了吗?

    概述 车牌识别脚本我相信大家都见过很多,最多的应该就是基于Opencv来实现的,这个小编也是写过几篇,如果有感兴趣的可以关注小编去查看一下.最近听学弟讲,毕业设计是越来越难了.以前毕设只需要实现车牌识 ...

  4. 基于OpenCV的数字识别系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 综述 2012年iOS应用商店中发布了一个名为FuelMate的G ...

  5. 毕业设计-基于机器视觉的银行卡号识别系统

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

  6. 基于OpenCV的车牌识别的设计与实现

    随着大数据和互联网技术的快速发展,利用人工智能技术实现车牌信息的自动识别推荐成为研究的热门话题.通过对基于OpenCV的车牌识别系统的网站功能需要进行讨论研究,这种跨平台计算机视觉和机器学习非常适用于 ...

  7. 案例-使用python实现基于opencv的车辆识别

    写在开头,接触opencv也有很长一段时间了,中间还接触了halcon.但都是基于C++实现,发现如果有什么idea,还是使用python可以快速实现.基于C++版本的后期会有更新. 首先,这个案例是 ...

  8. 基于百度云人脸识别API与opencv的人脸识别系统

    基于百度云人脸识别API与opencv的人脸识别系统 简介 弄这个东西是因为参加了学校的项目,第一次开发做的不是很好. 本系统是基于百度云人脸识别API.opencv级联器.PYQT5进行开发.百度云 ...

  9. 基于tensorflow2.0+opencv的花卉识别系统源码(含数据集)

    花卉识别-基于tensorflow2.3实现 完整代码下载地址:基于tensorflow2.0+opencv的花卉识别系统源码( 文件目录 # 数据下载地址 https://storage.googl ...

  10. 基于PP-ShiTu的商品识别系统

    转自AI Studio,原文链接:基于PP-ShiTu的商品识别系统 - 飞桨AI Studio 基于PP-ShiTu图像识别系统的商品识别 背景介绍 1.项目效果 视频地址 2.发展概况 随着无人超 ...

最新文章

  1. 串口与COM口 USB口、TTL、RS-232、RS-485区别 释疑
  2. go语言复数包_Go语言中包的风格指南
  3. 《学习之道》第四章学习语言和记忆痕迹
  4. ArcGIS百米网格自动生成
  5. UART0串口编程(三):中断方式的串口编程;用中断编写发送函数
  6. 【pointnet++点云识别】基于pointnet++的点云地理数据识别的MATLAB仿真
  7. 安装veket到移动硬盘NTFS分区
  8. “双十一”即将来临,先来看看快递物流企业的大数据
  9. 如何使用UDP进行跨网段广播
  10. cnm的下载频道,再c一次。
  11. excel 行列转换
  12. JavaWeb学习笔记(上)
  13. 外设键盘win和alt功能互换解决方法
  14. Classic界面chatter中的子选项卡配置
  15. 租车APP开发的市场优势和主要功能
  16. 音视频SDK封装截图
  17. MeiShe Face Sticker Design Plugin AR Scene Editor Instruction
  18. 野心外漏?Windows Defender或将独霸杀毒软件市场?
  19. 运算放大器:电压比较器、电压跟随器、同相比例放大器
  20. 应用zigbee实现智能家居项目

热门文章

  1. 波特率和比特率的定义及计算
  2. emos-第一章、项目前置准备
  3. git(icode)分支及发布管理方式
  4. 云优CMS批量翻译插件
  5. jetty中war包解压路径
  6. cad快看_CAD中遇到文件损坏,别着急,这几招能帮你挽回损失
  7. 【超图+CESIUM】【基础API使用示例】30、超图|CESIUM -【坐标转换】世界坐标转屏幕坐标
  8. movielens处理代码
  9. python 生意参谋操作
  10. iOS开发系列--音频播放、录音、视频播放、拍照、视频录制 (转)