opencv银行卡号识别的项目实践

 更新时间:2025年04月14日 11:22:51   作者:2201_75491841  
本文主要介绍了opencv银行卡号识别的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,主要用于图像和视频处理、目标检测、特征提取、3D重建以及机器学习任务。它支持多种编程语言(如C++、Python),提供丰富的算法和工具,可用于人脸识别、物体检测、运动跟踪、图像增强等应用,广泛应用于工业检测、自动驾驶、安防监控、医疗影像等领域。其高效性和跨平台特性使其成为计算机视觉开发的核心工具之一。在日常生活中,我们可以通过opencv来识别银行卡卡号,实现银行卡的分类。

以下是我们用来识别检测的银行卡图片

以及用于模板处理的模板图片

以下是代码实现

import numpy as np
import argparse
import cv2
import myutils

#设置参数
ap=argparse.ArgumentParser()
ap.add_argument('-i','--image',required=True,help='path to iuput image')
ap.add_argument('-t','--template',required=True,help='path to template OCR-A image')
#vars(ap.parse_args()):解析命令行参数并将其转换为字典形式
args=vars(ap.parse_args())


FIRST_NUMBER={
    '3':'American',
    '4':'Visa',
    '5':'MasterCard',
    '6':'Discover'
}


def cv_show(name,image):
    cv2.imshow(name,image)
    cv2.waitKey(0)


a=args['template']

'''--------模板图像中数字的定位处理-----------'''
img=cv2.imread(args['template'])
cv_show('img',img)

ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv_show('ref',ref)
#cv2.threshold():对灰度图像进行阈值处理,将其转换为二值图像,cv2.THRESH_BINARY_INV 表示反二进制阈值。
ref=cv2.threshold(ref,10,255,cv2.THRESH_BINARY_INV)[1]
cv_show('ref',ref)
#查找并排序模板图像中的轮廓
_,refCnts,hierarchy=cv2.findContours(ref,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,refCnts,-1,(0,255,0),3)

cv_show('img',img)
#myutils.sort_contours():对轮廓进行从左到右的排序。
refCnts=myutils.sort_contours(refCnts,method='left-to-right')[0]

digits={}
#遍历排序后的轮廓,提取每个数字的 ROI(感兴趣区域),并将其调整为固定大小(57x88),存储在字典 digits 中,键为数字的索引。
#enumerate() 是 Python 中的一个内置函数
# 它的作用是 为可迭代对象添加索引,使得在遍历时可以同时访问索引和元素。
for (i,c) in enumerate(refCnts):
    (x,y,w,h)=cv2.boundingRect(c)

    roi=ref[y:y+h,x:x+w]

    roi=cv2.resize(roi,(57, 88))

    cv_show('ro',roi)

    digits[i]=roi
print(digits)

'''----------信用卡的图像处理---------------------'''
#信用卡信息处理

image=cv2.imread(args['image'])
image=myutils.resize(image,width=300)
cv_show('image',image)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv_show('gray',gray)

#初始化卷积核
rectKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(9,3))
sqKernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

#顶帽操作
tophat=cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,rectKernel)
cv_show('tophat',tophat)


#-----找到数字边框---------
# 1、通过闭操作(先膨胀,再腐蚀)将数字连在一起
closeX=cv2.morphologyEx(tophat,cv2.MORPH_CLOSE,rectKernel)
cv_show('closeX',closeX)
#THRESH_OTSU会自动寻找到合适的阈值,适合双峰,需要把阈值参数设置为0
thresh=cv2.threshold(closeX,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
cv_show('thresh',thresh)
# 再来一个闭操作
# thresh1=cv2.morphologyEx(thresh,cv2.MORPH_CLOSE,sqKernel)
# cv_show('thresh1',thresh1)

#计算轮廓
_,threshCnts,h=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts=threshCnts
cur_img=image.copy()
cv2.drawContours(cur_img,cnts,-1,(0,255,0),3)
cv_show('cur_img',cur_img)

#遍历轮廓,找到数字部分像素区域
locs=[]
for (i,c) in enumerate(cnts):
    (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):
    groupOutput=[]
    group=gray[gY-5:gY+gH+5,gX-5:gX+gW+5]

    cv_show('group',group)

    group=cv2.threshold(group,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

    cv_show('group',group)

    group_,digitCnts,hierarchy=cv2.findContours(group.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    digitCnts=myutils.sort_contours(digitCnts,method='left-to-right')[0]

    for c in digitCnts:

        (x,y,w,h)=cv2.boundingRect(c)

        roi=group[y:y+h,x:x+w]

        roi=cv2.resize(roi,(57,88))
        cv_show('roi',roi)

        #使用模块匹配,计算匹配得分

        scores=[]
        ##在模板中计算每一个得分
        #digits 是一个字典
        #digits.items() 方法会返回一个包含字典中所有键值对的可迭代对象,其中每个元素是一个元组,元组的第一个元素是键,第二个元素是对应的值。
        for (digit,digitROI) in digits.items():
            ## 模板匹配
            #cv2.matchTemplate此函数用于在一幅图像里查找与给定模板最匹配的区域
            # roi:代表输入图像,也就是要在其中查找模板的图像。
            # digitROI:代表模板图像,也就是你想要在输入图像中查找的部分。
            # cv2.TM_CCOEFF:表示匹配方法,这里采用的是相关性系数匹配法。
            #函数会返回一个二维的 NumPy 数组
            result=cv2.matchTemplate(roi,digitROI,cv2.TM_CCOEFF)
            #cv2.minMaxLoc 函数用于在一个单通道的矩阵(通常是图像或模板匹配结果)中查找最小值、最大值以及它们对应的位置。
            #该函数返回一个包含四个值的元组,依次为:
            # 矩阵中的最小值。
            # 矩阵中的最大值。
            # 最小值所在的位置(以元组 (x, y) 形式表示)。
            # 最大值所在的位置(以元组 (x, y) 形式表示)
            (_,score,_,_)=cv2.minMaxLoc(result)

            scores.append(score)
        #np.argmax 用于返回数组中最大值所在的索引。
        #例如,如果 scores = [1, 5, 3],那么 np.argmax(scores) 会返回 1,
        #str 是 Python 内置函数,用于将一个对象转换为字符串类型。
        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()是OpenCV库中的一个函数,用于在图像上添加文本。
    cv2.putText(image,''.join(groupOutput),(gX,gY-15),cv2.FONT_HERSHEY_SIMPLEX,0.65,(0,0,255),2)

    output.extend(groupOutput)

print('Credit Card Type:{}'.format(FIRST_NUMBER[output[0]]))
print('Credit Card#:{}'.format(''.join(output)))

cv2.imshow('image',image)
cv2.waitKey(0)

打印输出结果如下图所示

到此这篇关于opencv银行卡号识别的项目实践的文章就介绍到这了,更多相关opencv银行卡号识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实现的二维码生成小软件

    Python实现的二维码生成小软件

    这篇文章主要介绍了Python实现的二维码生成小软件,使用wxPython、python-qrcode、pyqrcode、pyqrnative等技术和开源类库实现,需要的朋友可以参考下
    2014-07-07
  • python 字典中取值的两种方法小结

    python 字典中取值的两种方法小结

    今天小编就为大家分享一篇python 字典中取值的两种方法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Python调用Windows命令打印文件

    Python调用Windows命令打印文件

    Windows命令行打印文件使用print 命令,具体用法可使用help print查看,下面是使用Python调用print指令执行打印文件功能的代码,需要的朋友可以参考下
    2020-02-02
  • 利用Python如何制作好玩的GIF动图详解

    利用Python如何制作好玩的GIF动图详解

    这篇文章主要给大家介绍了关于利用Python如何制作好玩的GIF动图的相关资料,实现的方法主要利用ImageMagick,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • Python如何实现自动发送邮件

    Python如何实现自动发送邮件

    对于一些每天需要发的报表或者是需要一次发送多份的报表,我们可以考虑借助Python来自动发送邮件。本文主要介绍了如何利用Python实现自动发送邮件,感兴趣的小伙伴可以了解一下
    2021-11-11
  • 详解Python IO口多路复用

    详解Python IO口多路复用

    这篇文章主要介绍了Python IO口多路复用的的相关资料,文中讲解的非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以参考下
    2020-06-06
  • 解决Python2.7读写文件中的中文乱码问题

    解决Python2.7读写文件中的中文乱码问题

    下面小编就为大家分享一篇解决Python2.7读写文件中的中文乱码问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python小白不正确的使用类变量实例

    Python小白不正确的使用类变量实例

    在本篇内容里,小编给各位整理了关于Python小白不正确的使用类变量实例内容,有兴趣的朋友们可以学习下。
    2020-05-05
  • 基于Python实现图片浏览器的应用程序

    基于Python实现图片浏览器的应用程序

    图像浏览器应用程序是一种非常常见和实用的工具,这篇文章就来为大家介绍一下如何使用Python编程语言和wxPython库创建一个简单的图像浏览器应用程序,感兴趣的可以了解下
    2023-10-10
  • Python实现希尔伯特变换(Hilbert transform)的示例代码

    Python实现希尔伯特变换(Hilbert transform)的示例代码

    希尔伯特变换(Hilbert transform)是一个对函数产生定义域相同的函数的线性算子,而且希尔伯特变换在信号处理中很重要,所以本文和大家分享了Python实现希尔伯特变换的代码,需要的可以参考一下
    2023-04-04

最新评论