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

相关文章

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为