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

首先我们先来引入我们所需要的库和我们定义的图像显示(方便):

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.destroyWindow(name)

 其次我们来引入银行卡数字的模板并进行预处理操作:

 

template=cv2.imread('TT.jpg')
# cv_show(template)
#化为灰度图
ref_template=cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
# cv_show(ref_template)
#化为二值图
ref_template=cv2.threshold(ref_template,10,255,cv2.THRESH_BINARY_INV)[1]
# cv_show(ref_template)#轮廓检测
##findContours 只接受二值图   RETR_EXTERNAL 只检测外轮廓   CHAIN_APPROX_SIMPLE 只保留终点坐标
BIT,refCnts,hierarchy=cv2.findContours(ref_template.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(template,refCnts,-1,(0,0,255),3)
# cv_show(template)
# print(np.array(refCnts).shape)
#轮廓排序
refCnts=contours.sort_contours(refCnts,method="left-to-right")[0]
# print(refCnts)digits={}
for (i,c) in enumerate(refCnts):#计算外接矩形(x,y,w,h)=cv2.boundingRect(c)roi=ref_template[y:y+h,x:x+w]#resize成合适大小roi=cv2.resize(roi,(57,88))# cv_show(roi)#每个数字对应一个模板digits[i]=roi

 接下来把我们需要识别的银行卡引入并进行处理:

#初始化卷积核
rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#读取输入图像
image=cv2.imread('T1.jpg')# cv_show(image)
image=imutils.resize(image,width=300)
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# cv_show(image_gray)#tophat顶帽操作,突出明亮区域
image_tophat=cv2.morphologyEx(image_gray,cv2.MORPH_TOPHAT,rectKernel)
# cv_show(image_tophat)#计算梯度  使得轮廓更加清晰
gradX=cv2.Sobel(image_tophat,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)#ksize=-1表示用3*3的和核
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(gradX)#闭操作(先膨胀后腐蚀)把数字连在一起
gradX=cv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel)
# cv_show(gradX)#二值化
image_thresh=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
# cv_show(image_thresh)#二值化后再次闭操作
image_thresh=cv2.morphologyEx(image_thresh,cv2.MORPH_CLOSE,sqKernel)
# cv_show(image_thresh)#计算轮廓
BITT,threshCnts,hierarchy=cv2.findContours(image_thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(image.copy(),threshCnts,-1,(0,0,255),1)
# cv_show(image)

 最后就是我们来匹配银行卡模板和数字模板的:

locs=[]
for (i,c) in enumerate(threshCnts):(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):# gx,gy,gw,gh 代表 4000 这一片区域groupOutput=[]#提取每一组数字(一组包括4个数字)group=image_gray[gy-5:gy+gh+5,gx-5:gx+gw+5]# cv_show(group)group=cv2.threshold(group,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]# cv_show(group)B,digitsCnts,A=cv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)digitsCnts=imutils.contours.sort_contours(digitsCnts,method="left-to-right")[0]# print(digitsCnts)for c in digitsCnts:  #遍历每一个数字   如4000  依次遍历4、0、0、0(x,y,w,h)=cv2.boundingRect(c)# print((x,y,w,h))roi=group[y:y+h,x:x+w]#把匹配图像设置成模板图像一致大小roi=cv2.resize(roi,(57,88))# cv_show(roi)#计算匹配得分scores=[]for (digit,digitROI) in digits.items():#模板匹配result=cv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)(_,score,_,_)=cv2.minMaxLoc(result)scores.append(score)groupOutput.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(groupOutput),(gx,gy-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)output.extend(groupOutput)cv_show(image)
print("".join(output))

 

 最后所显示的结果。

完整代码奉上:

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.destroyWindow(name)template=cv2.imread('TT.jpg')
# cv_show(template)
#化为灰度图
ref_template=cv2.cvtColor(template,cv2.COLOR_BGR2GRAY)
# cv_show(ref_template)
#化为二值图
ref_template=cv2.threshold(ref_template,10,255,cv2.THRESH_BINARY_INV)[1]
# cv_show(ref_template)#轮廓检测
##findContours 只接受二值图   RETR_EXTERNAL 只检测外轮廓   CHAIN_APPROX_SIMPLE 只保留终点坐标
BIT,refCnts,hierarchy=cv2.findContours(ref_template.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(template,refCnts,-1,(0,0,255),3)
# cv_show(template)
# print(np.array(refCnts).shape)
#轮廓排序
refCnts=contours.sort_contours(refCnts,method="left-to-right")[0]
# print(refCnts)digits={}
for (i,c) in enumerate(refCnts):#计算外接矩形(x,y,w,h)=cv2.boundingRect(c)roi=ref_template[y:y+h,x:x+w]#resize成合适大小roi=cv2.resize(roi,(57,88))# cv_show(roi)#每个数字对应一个模板digits[i]=roi#初始化卷积核
rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))#读取输入图像
image=cv2.imread('T1.jpg')# cv_show(image)
image=imutils.resize(image,width=300)
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# cv_show(image_gray)#tophat顶帽操作,突出明亮区域
image_tophat=cv2.morphologyEx(image_gray,cv2.MORPH_TOPHAT,rectKernel)
# cv_show(image_tophat)#计算梯度  使得轮廓更加清晰
gradX=cv2.Sobel(image_tophat,ddepth=cv2.CV_32F,dx=1,dy=0,ksize=-1)#ksize=-1表示用3*3的和核
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(gradX)#闭操作(先膨胀后腐蚀)把数字连在一起
gradX=cv2.morphologyEx(gradX,cv2.MORPH_CLOSE,rectKernel)
# cv_show(gradX)#二值化
image_thresh=cv2.threshold(gradX,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
# cv_show(image_thresh)#二值化后再次闭操作
image_thresh=cv2.morphologyEx(image_thresh,cv2.MORPH_CLOSE,sqKernel)
# cv_show(image_thresh)#计算轮廓
BITT,threshCnts,hierarchy=cv2.findContours(image_thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(image.copy(),threshCnts,-1,(0,0,255),1)
# cv_show(image)locs=[]
for (i,c) in enumerate(threshCnts):(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):# gx,gy,gw,gh 代表 4000 这一片区域groupOutput=[]#提取每一组数字(一组包括4个数字)group=image_gray[gy-5:gy+gh+5,gx-5:gx+gw+5]# cv_show(group)group=cv2.threshold(group,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]# cv_show(group)B,digitsCnts,A=cv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)digitsCnts=imutils.contours.sort_contours(digitsCnts,method="left-to-right")[0]# print(digitsCnts)for c in digitsCnts:  #遍历每一个数字   如4000  依次遍历4、0、0、0(x,y,w,h)=cv2.boundingRect(c)# print((x,y,w,h))roi=group[y:y+h,x:x+w]#把匹配图像设置成模板图像一致大小roi=cv2.resize(roi,(57,88))# cv_show(roi)#计算匹配得分scores=[]for (digit,digitROI) in digits.items():#模板匹配result=cv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)(_,score,_,_)=cv2.minMaxLoc(result)scores.append(score)groupOutput.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(groupOutput),(gx,gy-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)output.extend(groupOutput)cv_show(image)
print("".join(output))

 不同版本的findContours函数可能会有不同的使用方法,有些高版本的只需要两个返回值。

以上所用的都是以前opencv所学的知识,也可能会有一点没有学到的,

 

 

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

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

相关文章

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…

深度分析台积电的投资价值:伟大的公司,伟大的投资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 公司介绍 台积电&#xff08;TSM&#xff09;是一家在1987年成立于台湾的半导体公司&#xff0c;并在全球范围内率先实施了“商业晶圆厂”代工模式。该公司为部分或全部外包生产的半导体生产商提供晶圆代工服务。台积电的产…

汇正财经靠谱吗?沪深创再现调整

盘面回顾&#xff1a; 周三A股开盘时间段&#xff0c;人民币再现快速贬值&#xff0c;再加上5月PMI数据不及预期&#xff0c;空头情绪放大&#xff0c;沪深创再陷调整&#xff0c;截止收盘沪指跌0.61%&#xff0c;深成指跌0.7%&#xff0c;创业板指跌1.14%。全天唯独科创50能逆…

超级模型GPT-4发布!

本文来源 量子位 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; 有多强&#xff1f; 根据OpenAI官方的介绍&#xff0c;GPT-4是一个超大的多模态…