opencv-python 银行卡卡号识别

2023-11-04

模板: 

 

 银行卡:

                                      

主要思路:用遮盖法 将无关紧要的上面和下面部分截掉,保留银行卡号差不多的位置,然后用opencv做图像处理,得到四个

连着数字的小框框,然后再在四个小框框里面提取出每一个单个的数字和模板里面的数字进行对比

难点是:如何使用opencv进行图像处理,最后只提取出银行卡卡号部分的图像 ;

              如何保证从左到右输出的阅读顺序

 

import cv2
import numpy as np 
roi2=[]
labels=[]
points=[]

img=cv2.imread('ocr_a_reference.png')
img_gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_bit=cv2.threshold(img_gray,10,255,cv2.THRESH_BINARY_INV)[1]
cnts=cv2.findContours(img_bit,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]

def cv_show(name,img):
	cv2.imshow(name, img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()
	
for i,cnt in enumerate(cnts):
	x,y,w,h = cv2.boundingRect(cnt)
	labels.append([x,y,w,h])

labels.sort(key=lambda x : x[0])
	
for i ,label in enumerate(labels) : 
	x,y,w,h = label	
	#cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0),2)
	original=img_bit[y:y+h,x:x+w]
	#original = cv2.threshold(original, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
	resize=cv2.resize(original, (57, 88))
	roi2.append(resize)
	#cv_show('roi',roi2[i])
	

kernel=np.ones((3,3))	
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 3)) #非常灵活 非常有用

card1 = cv2.imread('./images/credit_card_05.png')
card=card1.copy()
card [0:card.shape[0]//2] = 0
card [2*card.shape[0]//3:] =0
cv_show('img',card) 
card_gray = cv2.cvtColor(card,cv2.COLOR_BGR2GRAY)
#tophat = cv2.morphologyEx(card_gray, cv2.MORPH_TOPHAT, rectKernel) #加了之后效果反而变差了
#cv_show('tophat',tophat) 
gradX = cv2.Sobel(card_gray, ddepth=cv2.CV_64F, dx=1, dy=0, #ksize=-1相当于用3*3的
	ksize=-1)
cv_show('gradX',gradX) 
gradX=np.absolute(gradX)
(minVal, maxVal) = (np.min(gradX), np.max(gradX))
gradX = (255 * ((gradX - minVal) / (maxVal - minVal)))
sobelx=np.uint8(gradX)

close=cv2.morphologyEx(sobelx,cv2.MORPH_CLOSE,rectKernel)
thresh = cv2.threshold(close, 0, 255,
	cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] 

close=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,rectKernel)
cv_show('close',close)
cnts=cv2.findContours(close.copy(),cv2.RETR_EXTERNAL,\
	cv2.CHAIN_APPROX_SIMPLE)[0]
	
cv2.drawContours(card, cnts, -1, (0,0,255),3)
#cv_show('cnts',card)

if len(cnts)>0:
	
	for cnt in cnts:
		if cv2.contourArea(cnt) >1000:
			
			L=cv2.arcLength(cnt,True )		
			approx=cv2.approxPolyDP(cnt,0.02*L, True)
			x,y,w,h=cv2.boundingRect(approx)
			points.append([x,y,w,h])
			#print(x)
			#cv2.rectangle(card1,(x,y),(x+w,y+h),(0,0,255),1)

points.sort(key=lambda x: x[0])
print(points)
pic=card1.copy()
groupOutput = []
for point in points :
	numbox=[]
	getnumber=[]
	x,y,w,h = point	
	cv2.rectangle(card1,(x-10,y-5),(x+w+3,y+h+2),(0,0,255),1)

	box=card_gray[y-5:y+h+5,x-5:x+w+5]
	#cv_show('1', box)
	box_thresh=cv2.threshold(box, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] 
	#cv_show('box_thresh',box_thresh)
	cnts=cv2.findContours(box_thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]
	
	for i,cnt in enumerate(cnts):
		x1,y1,w1,h1=cv2.boundingRect(cnt)
		#cv2.rectangle(box,(x1,y1),(x1+w1,y1+h1),(0,0,255),2)
		numbox.append([x1,y1,w1,h1])
	#cv_show('get', box)	
	numbox.sort(key=lambda x:x[0])
		#print('cnt',x1,y1,w1,h1)
	for num in numbox:
		x2,y2,w2,h2=num
		roi1=box_thresh[y2-1:y2+h2+1,x2-1:x2+w2+1]
		roi1=cv2.resize(roi1,(57,88))
		#cv_show('roi1',roi1)
		scores=[]
		for r in roi2 :
			#cv_show('r',r)
			result = cv2.matchTemplate(roi1,r,cv2.TM_CCOEFF)
			#print('r',result)
			#print(np.argmax(result))
			(_, score, _, _) = cv2.minMaxLoc(result)
			scores.append(score)
		
		groupOutput.append(str(np.argmax(scores)))
		getnumber.append(str(np.argmax(scores)))
		
	cv2.putText(card1, "".join(getnumber), (x-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8 , (0, 0, 255), 2)	\
		
print('groupOutput',groupOutput)		

		

cv2.imshow('out',card1)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下: 

                                        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv-python 银行卡卡号识别 的相关文章

随机推荐

  • 将编程上升为中小学主要学科课程,真的靠谱吗?

    近日 有人建议将 编程 上升为中小学主要学科课程 并列入 中高考升学考试体系 此话题瞬间引发广大家长及IT互联网圈内人士热议 褒贬不一 对此 我觉得网上的一种观点非常对 孩子们现阶段需要的是思想和素质教育 而不是单纯地通过某一类技工学科的学
  • 2023最新信息安全毕业设计题目选题大全

    0 简介 毕业季马上就要开始了 不少同学询问学长网安专业选题以及开题相关的问题 今天跟大家分享信息安全毕设选题 最新的信息安全 网络安全 专业毕设选题 难度适中 适合作为毕业设计 大家参考 学长整理的题目标准 相对容易 工作量达标 题目新颖
  • STM32CubeMX之RTC的使用

    本篇文章介绍STM32实时时钟 RTC 的使用方法 前期准备 STM32硬件电路板及仿真器 以STM32F407ZGT6单片机为例 Keil v5以上版本 MDK ARM 串口助手 实时时钟 RTC 是STM32单片机的标配 每个系列的都有
  • yolov5运行报错之RuntimeError: The size of tensor a (80) must match the size of tensor b (56) at.....

    错误 RuntimeError The size of tensor a 80 must match the size of tensor b 56 at non singleton dimension 3 如图 解决方法 https gi
  • idea登录github时出现Invalid authentication data. connect time out问题解决方法

    辛辛苦苦注册好GitHub 安装了git客户端 弄好ssh后 用IDEA登录GitHub账号 又出现问题了 好吧 一番搜查之下终于找到了解决办法 问题图如下 解决办法 file gt setting gt system settings去掉
  • Style 中的 ‘>>>‘ 与 ‘ /deep/(sass/less)‘介绍

    Vue style 深度作用选择器 这两个深度选择器的主要作用就行修改UI库中的默认样式 gt gt gt page gt gt gt van skeleton margin top 10px gt gt gt van skeleton t
  • 合理利用泛型擦除

    曾几何时 一直痛恨java的泛型擦除 为了适配老版的jdk java引入泛型的同时 引入了泛型擦除机制 导致想要获取类中的泛型 需要都个圈子 具体可以看我这篇博客 获取泛型的类 前不久使用Mybatis plus分页 但发现PO对象不满足接
  • Transformer《Attention Is All You Need》精读

    文章目录 1 研究背景 2 研究动机 3 模型结构 3 1编码器 3 2 解码器 3 3 Attention 3 4 Multi Head Attention 3 5 模型中Attention的应用 3 6 Position wise Fe
  • 计算机指令——从纸带说起

    前言 其实很多时候我都会感叹计算机的伟大 通过一个个电路就完成了如今各种系统 通过各种各样的语言就能够指挥设备完成不同的动作 当写下第一个hellow world的时候我就在想他什么怎么出现 今天搞明白其中的原理 我在这和大家分享 打孔卡
  • 使用ROS连接两台电脑时,只能看到对方设备的IP,但是订阅不到ros消息

    ROS连接两台设备 利用Ros通信 两台电脑需要处于同一局域网下 1 查看主机 从机 ip hostname ifconfig 查看ip 如果电脑连接的时有线网 则显示结果中 etho 部分的 inet addr 后面就是该电脑的 IP 地
  • java kotlinlang_Kotlin与Java互操作

    1 Kotlin 调用Javaimport java util fun demo source List val list ArrayList for item in source list add item for i in 0 sour
  • redis基本命令

    转 https www cnblogs com woshimrf p 5198361 html 目录 全局操作 1 redis是key value存储的 放在内存中 并在磁盘持久化的数据结构存储系统 2 redis提供原子自增操作incr
  • 学习算法之路(转载)

    第一阶段 练经典常用算法 下面的每个算法给我打上十到二十遍 同时自己精简代码 因为太常用 所以要练到写时不用想 10 15分钟内打完 甚至关掉显示器都可以把程序打 出来 1 最短路 Floyd Dijstra BellmanFord 2 最
  • Recent Advances in Deep Learning for Object Detection

    Recent Advances in Deep Learning for Object Detection Abstract 1 Introduction 2 Problem Settings 3 Detection Components
  • python修饰器原理_Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator 当你看到这个英文名的时候 你可能会把其跟Design Pattern里的Decorator搞混了 其实这是完全不同的两个东西 虽然好像 他们要干的事都很相似 都是想要对一个已有的模块做一些
  • 【RDMA】降低CPU除了RDMA (vbers)还是VMA ?

    前言 看介绍 像是mellonx针对其kernel bypass网卡 RDMA网卡 提供的一个lib库 该lib库对外提供socket api 使得用户的程序不需要修改就可以直接使用kernel bypass网卡 如RDMA网卡 我们都知道
  • FPGA内部结构及时序分析

    FPGA时序分析 FPGA内部基本结构 查找表概述 数据传输路径 时序分析模型 知识补充 注 本文内容来源于B站UP主小梅哥爱漂流的视屏内容 本人整理出来前三节课的视频笔记 对视频内容感兴趣的同学可以去看看小梅哥的视频 视频链接为https
  • String数组的创建

    string数组的定义有三种写法 String arr new String 10 创建一个长度为10的String 类型数组 String arr new String 10 String arr 张三 李四 前面两种写法是一样的 可以互
  • Window下编译FFmpeg(生成ffplay)

    第一步 百度或者官网下载mingw https ddd2 pc6 com xy1 mingw5 1 6 rar 解压后安装到c MinGW下 就是默认安装路径 注意安装时选择全部安装 避免有些东西没安装上 如下图 第二步 官网下载msys
  • opencv-python 银行卡卡号识别

    模板 银行卡 主要思路 用遮盖法 将无关紧要的上面和下面部分截掉 保留银行卡号差不多的位置 然后用opencv做图像处理 得到四个 连着数字的小框框 然后再在四个小框框里面提取出每一个单个的数字和模板里面的数字进行对比 难点是 如何使用op