opencv项目实践二(银行卡卡号识别)

任务说明

在这里插入图片描述
将银行卡卡号打印输出

实现

、思路
1、定位银行卡卡号数字区域
2、将银行卡每个卡号数字单独提取出来
3、处理模板图片,将每个模板数字单独提取出来
4、通过模板匹配来识别每个卡号

、具体代码实现
1、处理模板
卡号数字模板
在这里插入图片描述

# 读取模板图片
img_m = cv2.imread("ocr_a_reference.png",1)
img_m_g = cv2.cvtColor(img_m,cv2.COLOR_BGR2GRAY)
# 反二值化处理,常见的二值图像一般前景为白色,背景为黑色
img_m_g = cv2.threshold(img_m_g,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)[1]
# 查找图像的轮廓
img_m_g_con = cv2.findContours(img_m_g,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
img_m_g_dst = cv2.drawContours(img_m.copy(),img_m_g_con,-1,(0,0,255),2)
imshow(img_m_g_dst)

在这里插入图片描述
将每个模板数字分割开,并保存到字典中

# 画模板图片的矩形包围盒
l1 = []
for con in img_m_g_con:(x,y,w,h) = cv2.boundingRect(con)l1.append(x)# 将其包围盒按照x坐标排序,这样就得到了按序排列的0~9模板数字图片,
#(因为查找得到的模板是无序的,排序后可以确认每个模板对应的数字)
(img_m_g_con,l1) = zip(*sorted(zip(img_m_g_con,l1),key=lambda x :x[1],reverse=False))
# 将模板数字图像分割开
digits = {}
for i,con in enumerate(img_m_g_con):(x,y,w,h) = cv2.boundingRect(con)roi = img_m_g[y:y+h,x:x+w]
#     (57,88)为调整后的模板图像的大小,也可以设置为其他大小digits[i] = cv2.resize(roi,(57,88))
#     imshow(digits[i])
# 至此,从0到9的模板图像已经保存在了digits中,模板图像就处理完了。

2、处理银行卡图片

# 加载
img_card = cv2.imread("credit_card_01.png",1)
img_card_gray = cv2.cvtColor(img_card,cv2.COLOR_BGR2GRAY)# 顶帽操作,原始图像-开运算图像,作用:提取噪音、高亮的区域。
kernel = np.ones((5,5))
tophat = cv2.morphologyEx(img_card_gray,cv2.MORPH_TOPHAT,kernel)
imshow(tophat)

在这里插入图片描述
求图像的梯度(边缘)的目的是方便之后的形态学操作,将目标区域连通在一起。

#求图像梯度
grady =  cv2.Sobel(tophat,ddepth = cv2.CV_32F,dx=0,dy=1,ksize = 3)
# Sobel计算出来的像素值类似为float,需要将其规范到(0~255),并且将其格式转为Uint8
grady = cv2.convertScaleAbs(grady)
# imshow(grady)
gradx = cv2.Sobel(tophat,ddepth = cv2.CV_32F,dx=1,dy=0,ksize=3)
gradx = cv2.convertScaleAbs(gradx)
# imshow(gradx) 
# 将X方向的梯度和Y方向的梯度融合。
# 只用单方向梯度也可以达到目的
grad = cv2.addWeighted(gradx,0.5,grady,0.5,0)
imshow(grad)
#使用Canny边缘检测,也可以得到类似的效果

在这里插入图片描述
形态学操作,将目标区域连通在一起

# 接下来执行闭操作(先腐蚀后膨胀)一是为了去除一些白色小点噪音,二是将单独的数字给连接成一个小区域
kernel = np.ones((3,3))
grad_close = cv2.morphologyEx(grad,cv2.MORPH_CLOSE,kernel,iterations = 1)
imshow(grad_close)
grad_dst = cv2.threshold(grad_close,0,255,cv2.THRESH_OTSU)[1]
# imshow(grad_dst)
# 注意到第三个区域还没有连通,继续进行闭操作
grad_close = cv2.morphologyEx(grad_dst,cv2.MORPH_CLOSE,kernel,iterations=8)
imshow(grad_close)

闭操作执行的次数和银行卡的格式是严格相关的,不同格式的银行卡要设置不用的参数,参数值通过实验经验获得。
其主要目的是将目标区域联通在一起,并且要求连通后的区域不可以包含额外区域,比如参数设置过大会导致左侧目标区域与下方区域连通,设置过小会导致目标区域无法连通。
在这里插入图片描述

# 目标区域已经完全连通,接下来进行轮廓检测,画包围盒,然后再进行筛选
gradcon = cv2.findContours(grad_close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
dst = cv2.drawContours(img_card.copy(),gradcon,-1,(0,0,255),2)
imshow(dst)
# 筛选合适的轮廓,筛选参数值是通过经验获取的,可以将各个轮廓的w,h打印后观察。
losc = []
for con in gradcon:(x,y,w,h) = cv2.boundingRect(con)ar = w/h#print(x,y,w,h)if ar >2.4 and ar <3.5: if w>155 or w<85:continue losc.append((x,y,w,h))
# 对矩形包围框按照坐标进行排序,排序目的和前面对模板数字图片的排序目的相同。
sort_losc = sorted(losc,key = lambda x :x[0],reverse=False)
# 排序后的包围盒顺序
# for i in sort_losc:
#     x,y,w,h = i[0],i[1],i[2],i[3]
#     con = np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])
#     dst = cv2.drawContours(img_card.copy(),con,-1,(0,0,255),2)
#     imshow(dst)
# 得到了每个目标的包围框,然后把包围框包围的区域截取出一下
img_part = []
for i in sort_losc:x,y,w,h = i[0],i[1],i[2],i[3]con = np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])img_part.append(img_card[y:y+h,x:x+w])imshow(img_card[y:y+h,x:x+w])

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
再对每个小区域处理,获取每个卡号数字区域

# 接下来获取每个数字。
digital = []
def f(img):img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)img_2 = cv2.threshold(img_gray,0,255,cv2.THRESH_OTSU)[1]
#    获取轮廓可以进行先Canny检测,再画轮廓,也可以之前求梯度的方法
#    在这里可以直接进行轮廓查找,因为我们需要查找的是每个数字的轮廓,每个数字都是连通的imgcon = cv2.findContours(img_2,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]new_con = []#筛选for con in imgcon:(x,y,w,h) = cv2.boundingRect(con) if h>35 or w<15:continuenew_con.append((x,y,w,h))#排序,目的和前面的类似sort_con = sorted(new_con,key = lambda x:x[0]) for i in sort_con:x,y,w,h = i[0],i[1],i[2],i[3]con = np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])roi = img_2[y-1:y+h+1,x-1:x+w+1]#注意数字图片区域和模板图片区域要大小要保持一致digital.append(cv2.resize(roi,(57,88)))
for i in img_part:f(i)
# for i in digital:
#     imshow(i)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、模板匹配

# 接下来进行模板匹配
ans = []
for img_dig in digital:now = []for (dig,digroi) in digits.items():res = cv2.matchTemplate(img_dig,digroi,cv2.TM_CCOEFF_NORMED)now.append(res.item()) ans.append(now.index(max(now)))now.clear()
print(ans)

在这里插入图片描述

cv2.matchTemplate是用于模板匹配的函数,第一个参数为待匹配图像,第二个参数为模板图像,模板图像和原图像的大小要保持一致,第三个参数为匹配方式。返回值越大,相似度越高。

存在的问题:
1、不同格式的银行卡图片需要对参数进行幅度较大的改动。
2、没有考虑银行卡图片倾斜的情况,如果输入的银行卡图片在输入的图片中只是倾斜的,可以使用透视变换进行校正,具体做法可以参考上一篇blog(答题卡识别)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61398.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVAT——2. CVAT简单使用

文章目录 基本使用管理员界面登录管理用户添加/删除用户及用户权限管理组管理 任务管理 创建任务和上传标签datumaroanaconda安装datumaro安装datumaro基本使用支持的格式查看帮助文件报错导入projects数据增加 数据标注标注面板使用快捷键左侧工具栏和右侧面板说明追踪模式Tra…

OpenCV图像处理——(实战)信用卡识别

总目录 图像处理总目录←点击这里 十四、信用卡数字识别 识别的图片模板图片 14.1、模板图片处理 读入图片->灰度图->二值图->计算轮廓->存储每一个模板 如果是所需模板匹配只有一个&#xff0c;课直接读入灰度图像即可 这里有10个模板(0-9)&#xff0c;所以需…

关于opencv的实战——银行卡号识别

首先我们先来引入我们所需要的库和我们定义的图像显示&#xff08;方便&#xff09;&#xff1a; import cv2 import numpy as np import imutils from imutils import contours#显示图像 def cv_show(img,name"image"):cv2.imshow(name,img)cv2.waitKey(0)cv2.dest…

13- 信用卡账号识别 (OpenCV基础) (项目十三) *

项目要点 _, ref cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV) 二值化处理图片, 黑白化图片ref cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度化处理ref_contours, _ cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 计算轮廓cv2.dr…

OpenCv图像处理实战——银行卡卡号识别

图像处理项目 测试图片自取区 card1 card2 银行卡卡号识别 from imutils import contours import numpy as np import argparse import imutils import cv2 import myutils #argparse这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。#这两个方法在包中没…

【OpenCV】 ⚠️实战⚠️ 银行卡卡号读取 ☢️建议手收藏☢️

【OpenCV】 ⚠️实战⚠️ 银行卡卡号读取 概述预处理代码模板预处理银行卡预处理 计算轮廓代码模板轮廓银行卡轮廓 其他程序主函数代码数字分割最终结果 概述 今天带大家使用我们之前学会的知识来实现银行卡卡号读取. 代码分为四个部分: 主函程序, 预处理, 计算轮廓, 其他程序…

openCV实践项目:银行卡卡号识别

本文用于对之前openCV知识点学习的复习及实践。要求达到以下效果&#xff1a; 一、基本流程思路分析 本项目本质上就是进行模板匹配。 注&#xff1a;为多用到所学知识&#xff0c;为了加深理解多加了些步骤&#xff0c;实际上本项目可以很简单就能完成。 1.1 模板处理 模…

什么是物联网平台

1、什么是物联网平台 阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提供云端API&#xff0c;服务端通过调用云端API将指令下发至设备端&#xff0c;实现远程控制。 物联网平台消息通信流程…

新兴 IoT 物联网场景中 MQTT 与 TCP 通信协议对比

在IoT 物联网开发中&#xff0c;大多数通信模组都支持 TCP、UDP、MQTT、CoAP、HTTP、LwM2M 等网络通信协议&#xff0c;其中既有传输层协议&#xff0c;也有应用层的协议&#xff0c;不同协议适用的场景也不同。 我们在设计IoT硬件产品时&#xff0c;通常只需选择一种协议即可。…

lot物联网场景通用架构分享

1.通用参考架构&#xff1a; 2.lot物联网硬件设备上云技术方案&#xff1a; #lot物联网业务链路包含&#xff1a;数据采集&#xff0c;通信连接&#xff0c;数据存储&#xff0c;数据可视化&#xff0c;洞察&#xff0c;行动决策&#xff1b;其中以设备端各种厂商提供得协议差…

物联网网络通讯知识

RTU是什么 RTU英文全称Remote Terminal Units&#xff0c;中文全称为远程终端单元。远程终端设备(RTU)是安装在远程现场的电子设备&#xff0c;用来监视和测量安装在远程现场的传感器和设备。通俗理解就是能够编程的还可以将数据传输到服务器的工具。RTU内部是包含通讯模块的&…

APP与服务器之间通过 http(POST、GET)进行数据交互 ( 实现一个简单的物联网系统-1 )

文章目录 一、APP POST 数据到服务器二、APP 从服务器 GET 数据三、APP 界面部分四、相关疑问五、学习方法六、专栏地址 一、APP POST 数据到服务器 首先 post 的数据应该包括识别这个花卉的信息和我们想要浇水的量&#xff0c;这里我们识别花卉采用花卉的名字&#xff0c;这样…

什么是物联网(Internet of Things)?

你可能在某些时候会听到物联网这个词&#xff0c;但是你对它可能不知所以然&#xff0c;这篇文章让你弄清楚什么是物联网&#xff0c;以及它代表什么&#xff1f; 物联网&#xff08;Internet of Things&#xff09;是指设备到互联网的连接。汽车&#xff0c;厨房电器&#xff…

物联网网关有哪些能力和哪些应用?

工业物联网的应用受到越来越多企业的关注&#xff0c;很多人都了解网关这个概念。网关就是一个网络连接到另一个网口的桥梁&#xff0c;起到协议解析、数据采集的作用&#xff0c;实现运行状态数据的高效利用。 物联网网关具备的能力 1、广泛连接的能力 目前各个行业、不同设…

一文了解物联网网关

物联网是指通过射频识别(RFID)、红外感应器、GPS、激光扫描器等信息传感设备&#xff0c;按约定的协议&#xff0c;实现任何时间、任何地点、任何物体进行信息交换和通信&#xff0c;以实现智能化识别、定位、监控和管理的一种网络。物联网是具有全面感知、可靠传输、智能处理特…

什么是物联网?有哪些应用?终于有人讲明白了

作者&#xff1a;佩里利&#xff08;Perry Lea&#xff09; 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 我们将从连接设备的角度来研究物联网&#xff0c;这些设备之前未必相互连接或接入互联网。它们可能一直没有太多的计算或通信能力。我们假…

LPWA物联网通信

物联网LPWA是物联网中的无线通信技术之一。 根据物联网无线通信技术的覆盖距离&#xff0c;大致可分为两类&#xff1a;一类是短距离通信技术&#xff0c;包括蓝牙(蓝牙)&#xff1b;NFC,Zigbee、WIFI、NFC&#xff0c;主要用于室内智能家庭、消费电子等场景&#xff1b;另一种…

物联网通讯协议:MQTT,NB-IOT,Zigbee,CoAP,RFID,BLUETOOTH,NFC,4G,HTTP

目录 一、按网络四层协议分类二、按需要网关来分类三、NB-IoT&#xff0c;4G对比四、应用层协议&#xff1a;MQTT和COAP对比物联网组网技术WIFI蓝牙ZigBee2G/4G/5GNB-IoTLoRa网关 物联网中常见的物联通信协议TCPUDPTCP和UDP比较HTTPMQTTCoAPLwM2M 一、按网络四层协议分类 NB-I…

chatgpt赋能python:如何使用Python拷贝微信聊天记录的图片?

如何使用Python拷贝微信聊天记录的图片&#xff1f; 微信聊天记录中的图片是我们很重要的一部分。它们记录了我们和我们的朋友、家人和同事之间的重要时刻和特殊瞬间。然而&#xff0c;有些时候我们需要把这些图片从微信聊天记录中拷贝出来&#xff0c;以便于备份和共享。本文…

《辉煌优配》科技股强势引领A股反弹 沪深两市日成交额再超万亿元

受美联储再度加息扰动&#xff0c;昨日早盘沪深两市指数低开&#xff0c;随后科技股强势拉升&#xff0c;带动商场回暖。到收盘&#xff0c;上证综指报3286.65点&#xff0c;上涨0.64%&#xff1b;深证成指报11605.29点&#xff0c;上涨0.94%&#xff1b;创业板指报2361.41点&a…