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

相关文章

使用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不兼容的问题关键实现流程总结前言作为

阿里开源语音识别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