01、识别信用卡卡号

2023-10-28 14:10
文章标签 01 识别 信用卡 卡号

本文主要是介绍01、识别信用卡卡号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import myutils
#一、绘制图像
def img_show(img_name,img):cv.imshow(img_name,img)cv.waitKey(0)cv.destroyAllWindows()#二、模板操作
#1、读取模板图像
template = cv.imread('./images/ocr_a_reference.png')
#2、将模板图像转化为灰度图像
gray = cv.cvtColor(template,cv.COLOR_BGR2GRAY)
#3、将灰度图像转化为二值图像
binary = cv.threshold(gray,10,255,cv.THRESH_BINARY_INV)[1]
#4、计算模板图像轮廓
cnts = cv.findContours(binary.copy(),cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)[0]
#5、绘制模板轮廓
cv.drawContours(template,cnts,-1,(0,0,255),3)
#6、将模板轮廓中所有轮廓从左到右排序
sort_cnts = myutils.sort_contours(cnts,method='left-to-right')[0]
#7、将每个模板与其对应的数字联系起来
digits = {}  
for (i,c) in enumerate(sort_cnts): #便利每一个轮廓(x,y,w,h) = cv.boundingRect(c) #计算外界矩形并resize成合适的大小roi = binary[y:y+h, x:x+w]roi = cv.resize(roi,(57,88))digits[i] = roi  #digit[i] 对应一个模板#三、信用卡图片操作
#1、初始化卷积核
rectKernel = cv.getStructuringElement(cv.MORPH_RECT,(9,3))
sqKernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
#2、读取信用卡图像
img = cv.imread('./images/credit_card_04.png')
#3、调整图像大小
img = myutils.resize(img,width=300)
#4、将图像转为灰度图
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#5、礼貌操作 突出更明亮的区域
tophat = cv.morphologyEx(gray,cv.MORPH_TOPHAT,rectKernel)
#6、Sobel算子提取信用卡边缘信息
gradX = cv.Sobel(tophat,ddepth=cv.CV_32F,dx=1,dy=0,ksize=-1) #ksize=-1 <=> ksize=(3,3)
# gradX = cv.convertScaleAbs(gradX)
gradX = np.absolute(gradX)
(minval,maxval) = (np.min(gradX),np.max(gradX))
gradX = (255 * ((gradX - minval) / (maxval - minval)))
gradX = gradX.astype('uint8')
#7、闭操作,将靠近的数字连起来 将16个数字划分为4个区域
close = cv.morphologyEx(gradX,cv.MORPH_CLOSE,rectKernel)
#8、二值操作    THRESH_OTSU+thresh=0 :寻找合适的阈值,适合双峰
binary = cv.threshold(close,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)[1] 
#9、闭操作 填补数字块(4个数字相连)中间的空洞
close = cv.morphologyEx(binary,cv.MORPH_CLOSE,sqKernel)
#10、计算轮廓,并在原始图片上画出轮廓
cnts = cv.findContours(close,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)[0]
# cur_img = img.copy()
# cv.drawContours(cur_img,cnts,-1,(0,0,255),3)
#11、筛选出符合宽高比,宽高范围的所有4个数字相连的轮廓
locs = []
for (i,c) in enumerate(cnts):(x,y,w,h) = cv.boundingRect(c)w_h = w / float(h)if w_h >2.5 and w_h < 4.0:   #这里要根据实际情况自己调节合适的筛选条件if (w>40 and w<55) and (h>10 and h<20):locs.append((x,y,w,h))
#12、将符合的轮廓从左到右排序
locs = sorted(locs,key=lambda x:x[0]) #四、用模板数字来匹配信用卡中的4个大轮廓
output = []
for (i,(lx,ly,lw,lh)) in enumerate(locs):groupOutput = []#1、根据坐标,提取每一组(4个数字)group = gray[ly-5:ly+lh+5,lx-5:lx+lw+5] #2、预处理  二值化group = cv.threshold(group,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)[1]#3、计算每一组的所有轮廓 并排序  digitCnts = cv.findContours(group.copy(),cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)[0]digitCnts = myutils.sort_contours(digitCnts,method='left-to-right')[0]#计算每一组中的每一个值for c in digitCnts:#1、显示每个轮廓的每个数字(x,y,w,h) = cv.boundingRect(c)roi = group[y:y+h,x:x+w]roi = cv.resize(roi,(57,88))#2、统计数字roi与模板中每个数字匹配后的得分scores = []for (digit,digitLoc) in digits.items():#模板匹配res = cv.matchTemplate(roi,digitLoc,cv.TM_CCOEFF_NORMED)score = cv.minMaxLoc(res)[1]scores.append(score)#将数字roi在模板中匹配到的坐标(值)存在groupOutput中groupOutput.append(str(np.argmax(scores)))#把每个小方块(四个数字)显示出来cv.rectangle(img,(lx-5,ly-5),(lx+lw+5,ly+lh+5),(0,0,255),2)output.extend(groupOutput)cv.putText(img,"".join(groupOutput),(lx,ly-15),cv.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2) #五、显示
print("Credit Card:{}".format("".join(output)))
img_show('img',img)

在这里插入图片描述
myutils.py

import cv2
# 对轮廓进行排序
def 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 = 1# 计算外接矩形 boundingBoxes是一个元组boundingBoxes = [cv2.boundingRect(c) for c in cnts] #用一个最小的矩形,把找到的形状包起来x,y,h,w# sorted排序(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i], reverse=reverse))return cnts, boundingBoxes  # 轮廓和boundingBoxess
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):dim = None(h, w) = image.shape[:2]if width is None and height is None:return imageif width is None:r = height / float(h)dim = (int(w * r), height)else:r = width / float(w)dim = (width, int(h * r))resized = cv2.resize(image, dim, interpolation=inter)return resized

这篇关于01、识别信用卡卡号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293735

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

BERN2(生物医学领域)命名实体识别与命名规范化工具

BERN2: an advanced neural biomedical named entity recognition and normalization tool 《Bioinformatics》2022 1 摘要 NER和NEN:在生物医学自然语言处理中,NER和NEN是关键任务,它们使得从生物医学文献中自动提取实体(如疾病和药物)成为可能。 BERN2:BERN2是一个工具,

行为智能识别摄像机

行为智能识别摄像机 是一种结合了人工智能技术和监控摄像技术的先进设备,它能够通过深度学习算法对监控画面进行实时分析,自动识别和分析监控画面中的各种行为动作。这种摄像机在安防领域有着广泛的应用,可以帮助监控人员及时发现异常行为,并采取相应的措施。 行为智能识别摄像机可以有效预防盗窃事件。在商场、超市等公共场所安装这种摄像机,可以通过识别异常行为等情况,及时报警并阻止不安全行为的发生

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题

flutter开发实战-flutter build web微信无法识别二维码及小程序码问题 GitHub Pages是一个直接从GitHub存储库托管的静态站点服务,‌它允许用户通过简单的配置,‌将个人的代码项目转化为一个可以在线访问的网站。‌这里使用flutter build web来构建web发布到GitHub Pages。 最近通过flutter build web,通过发布到GitHu

T1打卡——mnist手写数字识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.定义GPU import tensorflow as tfgpus=tf.config.list_physical_devices("GPU")if gpus:gpu0=gpus[0]tf.config.experimental.set_memort_groth(gpu0,True) #设置GPU现存用量按需

滚雪球学MyBatis(01):教程导读

MyBatis简介 前言 欢迎回到我们的MyBatis系列教程。在上期的内容中,我们详细介绍了MyBatis的基本概念、特点以及它与其他ORM框架(如Hibernate)的对比。我们还探讨了MyBatis在数据访问层中的优势,并解释了为什么选择MyBatis作为我们的持久化框架。在阅读了上期的内容后,相信大家对MyBatis有了初步的了解。 在本期内容中,我们将深入探讨MyBatis的基本配