实现效果:


code

import cv2 as cv
import numpy as np# 轮廓排序 默认从左到右
# --cnts 待排序的轮廓列表
# --method 排序方法 自上而下,从左到右等
def sort_contours(cnts, method="left-to-right"):# 初始化反向标志和排序索引reverse = Falsei = 0# 处理是否需要逆向排序if method == "right-to-left" or method == "bottom-to-top":reverse = True# 处理时根据边界框的x坐标排序还是y坐标排序,如果是自上而下或者自下而上则需要根据y坐标排序而不是x坐标if method == "top-to-bottom" or method == "bottom-to-top":i = 1# 构建边界框list 并使用python魔术lambda表达式进行排序boundingBoxes = [cv.boundingRect(c) for c in cnts](cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))# 返回排序后的轮廓和边界框return (cnts, boundingBoxes)# 显示图像
def cv_show(name, img):cv.imshow(name, img)# cv.waitKey(0)# cv.destroyAllWindows()# =================================1.读入模板图像================================def loadTemplate():img = cv.imread('template.png')cv_show('src', img)# 灰度图ref = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv_show('gray', ref)# 二值化ref = cv.threshold(ref, 10, 255, cv.THRESH_BINARY_INV)[1]cv_show('binary', ref)# 计算轮廓  外轮廓refCnts, hierarchy = cv.findContours(ref.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)print(np.array(refCnts).shape)# print('---contours', contours)# -1画所有的轮廓cv.drawContours(img, refCnts, -1, (0, 255, 0), 3)cv_show('canny', img)digits = {}# 对轮廓进行排序refCnts = sort_contours(refCnts)[0]## 模板值的对应for (i, c) in enumerate(refCnts):(x, y, w, h) = cv.boundingRect(c)# print(i, ":", (x, y, w, h))roi = ref[y:y + h, x:x + w]roi = cv.resize(roi, (57, 88))# cv_show('roi',roi)digits[i] = roireturn digits# ==========================2.读入输入图像进行处理===============================
def dealProcess(digits):# 初始化卷积核rectKernel = cv.getStructuringElement(cv.MORPH_RECT, (9, 3))sqKernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))src = cv.imread('card.png')cv_show('src', src)inGray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv_show('inGray', inGray)# 礼帽操作tophat = cv.morphologyEx(inGray, cv.MORPH_TOPHAT, rectKernel)cv_show('tophat', tophat)# ksize=-1 3X3gradX = cv.Sobel(tophat, ddepth=cv.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")cv_show('gradX', gradX)# 闭操作gradX = cv.morphologyEx(gradX, cv.MORPH_CLOSE, rectKernel)cv_show('MORPH_CLOSE', gradX)# 自动寻找合适的阈值thresh = cv.threshold(gradX, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)[1]cv_show('thresh', thresh)thresh = cv.morphologyEx(thresh, cv.MORPH_CROSS, sqKernel)cv_show('thresh-close', thresh)# 计算轮廓srcCnts, srcHierarchy = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)print(type(srcCnts))src2 = src.copy()cv.drawContours(src2, srcCnts, -1, (0, 255, 0), 3)cv_show('src', src2)locs = []for (i, c) in enumerate(srcCnts):(x, y, w, h) = cv.boundingRect(c)ar = w / float(h)# print(i, ":","rect->",(x, y, w, h), ar)if 2.8 < ar < 4.0:if (50 < w < 65) and (15 < h < 33):locs.append((x, y, w, h))locs = sorted(locs, key=lambda x: x[0])print('-------------------------')print(locs)output = []for (i, (gX, gY, gW, gH)) in enumerate(locs):groupOutput = []# 截取图像group = inGray[gY - 5:gY + gH + 5, gX - 5:gX + gW + 5]# cv_show('group', group)# 预处理  二值化group = cv.threshold(group, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)[1]cv_show('group', group)# 计算一组轮廓digitCnts, hierarchy = cv.findContours(group.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)digitCnts = sort_contours(digitCnts)[0]# 计算每一组中每一个数值for c in digitCnts:# 找到当前数值轮廓,resize 到合适的大小(x, y, w, h) = cv.boundingRect(c)roi = group[y:y + h, x:x + w]roi = cv.resize(roi, (57, 88))# 计算匹配得分scores = []# 在模板中计算每一个的得分for (digit, digitROI) in digits.items():# 模板匹配result = cv.matchTemplate(roi, digitROI, cv.TM_CCOEFF)# 相关系数(minVal, maxVal, minLoc, maxLoc) = cv.minMaxLoc(result)scores.append(maxVal)# print(maxVal)# 得到合适的数字groupOutput.append(str(np.argmax(scores)))cv.rectangle(src, (gX - -5, gY - 5), (gX + gW + 5, gY + gH + 5), (0, 0, 255), 1)cv.putText(src, "".join(groupOutput), (gX, gY - 15), cv.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)# 得到结果output.extend(groupOutput)return (src, output)if __name__ == '__main__':digits = loadTemplate()(src, output) = dealProcess(digits)# 打印输出结果print("res:{}".format("".join(output)))cv_show('res', src)cv.waitKey()

用到的资源图片:

感谢支持,欢迎讨论交流,谢谢!

python-openCV实现银行卡卡号识别相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. Python OpenCV开发MR智能人脸识别打卡系统(五、程序入口设计与测试)

    需要源码请点赞关注收藏后评论区留言私信~~~ 整体系统讲解如下 Python OpenCV开发MR智能人脸识别打卡系统(一.需求分析与系统设计) Python OpenCV开发MR智能人脸识别打卡系统 ...

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

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

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

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

最新文章

  1. 如何定义带有可选参数的函数python_Python如何定义有可选参数的元类
  2. jQuery 取选中的radio的值方法
  3. FZU 1019猫捉老鼠
  4. Leetcode70场双周赛-第一题2144. 打折购买糖果的最小开销
  5. 小程序 获取用户信息 openid 等
  6. Java 远程mapduce_java – 如何远程运行mapreduce作业
  7. 把HTML代码上传到gitee,使用git上传项目到gitee以及VS使用git管理项目
  8. Linux引导流程(第二版)
  9. 表达式必须具有与对应表达式相同的数据类型_跟光磊学Java开发-运算符和表达式...
  10. Scala学习--《Scala编程》
  11. 串口和TCP调试助手
  12. oh-my-zsh主题添加命令显示执行时间和当前时间
  13. UVA 12304 /// 圆的综合题 圆的模板
  14. idea的java项目怎么连数据库_idea 使用Java连接SQL Server数据库教程
  15. 怎么批量下载哗哩哗哩B站主页视频
  16. idea配置tomcat日志中文乱码,且修改后idea正常,但cmd窗口任然中文乱码解决方法
  17. python编程超市购物系统_淘淘购物系统 (Python)
  18. 金电联行:大数据征信、大数据风险量化、大数据信用融资 | 百万人学AI评选
  19. 快递webservice接口
  20. 《动手学深度学习》task7_3 词嵌入进阶

热门文章

  1. LevelDB初体验 【转】
  2. 首席新媒体运营商学院创始人黎想:如何做“新客户新粉丝”的快速拉新
  3. Java 实现 Springboot 定时任务(每隔一段时间自动执行一次)
  4. 【苹果相册推】专门用作家庭推可增加的UDID
  5. Java 读写二维码
  6. wmf和emf图片公式转png
  7. 那些你所不知道的小技巧:硬盘照片恢复
  8. proxmox 直通显卡(GPU)
  9. 每个人的心里都有一团火,路过的人只看到烟。
  10. 《机器学习技法》---核型SVM