嫌弃b站无代码块看不清楚的各位可以去我的csdn博客上看。。

https://blog.csdn.net/weixin_44543614/article/details/105471010

项目的预览图:

QWQ

那么第一步先梳理一下我们的项目逻辑:

一. 找素材 (数字模板,银行卡照片等)

二. 识别数字则需要我们对数字模板进行处理。因此下面我们开始处理数字模板。

1.将数字模板处理成灰度图,再进行二值处理.这样图像就变成双通道图.

2.计算模板边缘轮廓.将数字模板每个数字的轮廓计算出来.

3.画出每个数字轮廓的外接矩形。最后将其分别保存到一个字典里.

三. 数字模板处理完成,已经洗净切块备用啦!现在让我们处理正餐-银行卡。

1.和模板一样先进行图像处理.灰度图 —— 二值处理

2.初始化一个(9,3)和(5,5)的卷积核放在旁边备用.

3.将已经处理的银行卡图像进行礼帽操作,去掉多余无用的部分.

4.运用Sobel算子,突出边界.

5.闭操作*1,二值操作 , 接着闭操作*2. 尽量让银行卡上轮廓中充满白色,利于我们下一步的边缘检测,使我们的轮廓检测的更准确.

6.计算轮廓。找出我们银行卡中数字部分呈现的大致比例,与我们计算的轮廓的长宽进行比较。符合条件我们就把它放到一个字典里。不需要则舍弃。

7.这时候我们的轮廓还是四个数字一组。接下来的步骤很明显啦。还是将这些轮廓预处理,接着按照每个数字大致的比例进行分别保存到字典里,进行轮廓检测。

8.将所有数字切成小块备用完成后,就可以将我们的数字轮廓与数字模板进行比较啦。先建一个数组,准备储存比对得分。接下来就是将这个数字轮廓与所有数字模板一个个比对。最后从所有的得分中选取得分最高的那个。

9.最后就是将我们每个数字轮廓的外界矩形画出来最后将数字放在它的头顶上。这样这道菜就做成啦!

下面上代码!!!!

想要看步骤展示的把每个cv_show前面的注释关掉运行就可以啦!

顺带一提,myutils是一个工具类哦。不是原有就有的包。

from imutils import contours

import numpy as np

import cv2

import imutils

import argparse

from cardnumber import myutils

# 设置参数

ap = argparse.ArgumentParser()

ap.add_argument("-i", "--image", required=True,

help="path to input image")

ap.add_argument("-t", "--template", required=True,

help="path to template OCR-A image")

args = vars(ap.parse_args())

# 指定信用卡类型

FIRST_NUMBER = {

"3": "American Express",

"4": "Visa",

"5": "MasterCard",

"6": "Discovery Card"

}

def cv_show(name, img):

cv2.imshow(name, img)

cv2.waitKey(0)

cv2.destroyAllWindows()

# 读取一个模板图像

img = cv2.imread(args["template"])

# cv_show('img', img)

#灰度图

ref = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# cv_show('img',ref)

#二值图像

ref = cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]

# cv_show('ref',ref)

#轮廓检测

ref_, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(img,refCnts,-1,(0,0,255),3)

# cv_show('img',img)

print(np.array(refCnts).shape)

refCnts = myutils.sort_contours(refCnts, method="left-to-right")[0]    #排序,从左到右从上到下

digits = {}

for (i, c) in enumerate(refCnts):

(x, y, w, h) = cv2.boundingRect(c)

rol = ref[y:y + h, x:x + w]

rol = cv2.resize(rol, (57,88))

digits[i] = rol

#初始化卷积核

rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))

sqKernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

#读取,预处理

image = cv2.imread(args['image'])

#

image = myutils.resize(image, width=300)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# cv_show('img', gray)

#礼帽操作

tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

# cv_show('image', tophat)

#Soble算子

gradX = cv2.Sobel(tophat, ddepth=cv2.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')

print(np.array(gradX).shape)

# cv_show('grad', gradX)

#闭操作

gradX = cv2.morphologyEx(gradX, cv2.MORPH_CLOSE, rectKernel)

# cv_show('img',gradX)

#二值

thresh = cv2.threshold(gradX, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

# cv_show('thresh',thresh)

#闭操作*2

thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, sqKernel)

# cv_show('img',thresh)

#计算轮廓

thresh_, threshCnds, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cnts = threshCnds

cur_image = image.copy()

cv2.drawContours(cur_image, cnts, -1, (0,255))

# cv_show('img', cur_image)

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):

groupout = []

#根据坐标遍历每一个轮廓

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)

#计算每一组的轮廓

digit_thresh, digitCnts, hierarchy = cv2.findContours(group, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

digitCnts = contours.sort_contours(digitCnts, method="left-to-right")[0]

#计算一组中的每一个数字

for c in digitCnts:

(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)

#得到最适应的数字

groupout.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(groupout), (gX, gY - 15),

cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0,0,255), 2)

#得到结果

output.extend(groupout)

#展示结果

print("Credit card type: {}".format(FIRST_NUMBER[output[0]]))

print("Credit card #:{}".format("".join(output)))

cv_show("result", image)

cv2.waitKey(0)

喜欢别忘了点个关注点个赞。下一个更新ORC扫描叭。

python识别银行卡数字_Python银行卡数字识别项目 (Opencv)相关推荐

  1. python识图自动化_Python自动化测试-验证识别

    一.准备 1.环境基础:Python3 + pycharm + selenium + request + Pillow,chrome浏览器的驱动程序 1)python:这里用的是Python3.7的, ...

  2. python识别中文验证码_Python实现验证码识别

    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1.计算验证码 2.滑块验证码 3.识图验证码 4.语音验证码 这篇博客主要写的就是识图验 ...

  3. python人脸检测代码_python实现人脸识别代码

    从实时视频流中识别出人脸区域,从原理上看,其依然属于机器学习的领域之一,本质上与谷歌利用深度学习识别出猫没有什么区别.程序通过大量的人脸图片数据进行训练,利用数学算法建立建立可靠的人脸特征模型,如此即 ...

  4. python抓取图片数字_Python提取数字图片特征向量 | kTWO-个人博客

    引言 在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取.将特征值点阵转化为特征向量.进行模型训练.第一步便是提取图片中的特征提取.数据的预处 ...

  5. python的整数类型_Python int 数字整型类型 定义int()范围大小转换

    本文主题是讲python数字类型python int整型使用方法及技巧.它是不可变数据类型中的一种,它的一些性质和字符串是一样的,注意是整型不是整形哦. Python int有多种数字类型:整型int ...

  6. python判断性别程序_python 实现性别识别

    使用keras实现性别识别,模型数据使用的是oarriaga/face_classification的模型 实现效果 准备工作 在开始之前先要安装keras和tensorflow 安装keras使用命 ...

  7. python生成数字_Python生成数字图片代码分享

    本文向大家分享了几段Python生成数字图片的代码,喜欢的朋友可以参考.具体如下: 最终版本 # -*- coding:utf-8 -*- from PIL import Image,ImageFon ...

  8. python图片识别训练汽车_python实现图片识别汽车功能

    本文实例为大家分享了python实现图片识别汽车的具体代码,供大家参考,具体内容如下 准备工作 1.登陆 2.安装 pip install baidu-aip 模块 原理读取图片的二进制信息,调用百度 ...

  9. python判断偶数奇数_Python程序检查数字是奇数还是偶数

    python判断偶数奇数 Here you will get python program to check number is odd or even. 在这里,您将获得python程序以检查数字是 ...

最新文章

  1. oracle11g安装补丁升级
  2. JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
  3. 用python怎么赚钱-用python赚钱(python新手怎么兼职)
  4. linux启动和关闭
  5. 订单可视化(智能制造、流程再造、企业信息化) 第三篇 订单可视化定义及目标...
  6. HarmonyOS之深入解析通知的使用
  7. k64 datasheet学习笔记12---System Integration Module (SIM)
  8. 硬盘安装linux_Surface-Laptop3 安装Archlinux折腾小记
  9. 用Java动态代理实现AOP
  10. 2018年计算机二级知识点,2018年计算机二级考试公共基础知识点:栈及其基本运算...
  11. markdown常用字体
  12. python网络爬虫学习笔记(一):网页基础
  13. char,varchar,nvarchar以及datetime和smalldatetime的区别
  14. 2021-07-20 计算两个日期间的工作日天数VBA函数
  15. 神奇的数字之回文数c语言,奇妙的数字
  16. es 创建索引 指定id_Elasticsearch创建索引流程
  17. 前端-微信、企业微信JS-SDK实时调试方法
  18. CocosCreator学习3:定义全局变量
  19. 生成百度网盘文件目录_艾孜尔江撰稿
  20. 11.1 WAN接入配置

热门文章

  1. oracle开启未活动连接清理,Oracle inactive session的清理
  2. 百度小程序html解析图片过大_如何快速高效爬取谷歌百度必应的图片
  3. maven下载安装环境配置
  4. 出现这6种评估违法状况,征收补偿决定可能被撤销!
  5. android8.0华为荣耀8,一线|华为手机开启重大升级 荣耀成安卓8.0覆盖机型最多品牌...
  6. MySQL 存储过程的变量
  7. Ztree勾选节点后取消勾选其父子节点
  8. PPT,要你好看(全彩)pdf
  9. Swing 100行画图示例
  10. Creating and Destroying Objects