news 2026/6/17 7:29:29

模板匹配与银行卡号识别(预告)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模板匹配与银行卡号识别(预告)

目录

一、模板匹配cv2.matchTemplate():

cv2.matchTemplate 函数说明

二、参数传递:

1. add_argument() 方法的参数命名规则

2. 参数传递的两种方式

3. 参数传递的格式规范

三、银行卡号识别案例(预处理):


一、模板匹配cv2.matchTemplate():

cv2.matchTemplate 函数说明

函数原型:cv2.matchTemplate (image, templ, method, result=None, mask=None)

参数说明:image:待搜索的目标图像(8 位灰度图 / 32 位浮点图,尺寸需大于等于模板图像)templ:模板图像(类型、通道数需与 image 一致,尺寸需小于等于目标图像)method:匹配算法类型,决定匹配度的计算方式,常用取值及规则:

  • TM_SQDIFF:平方差匹配法 | 匹配度越高,计算值越小;匹配度越低,计算值越大
  • TM_CCORR:相关匹配法 | 匹配度越高,计算值越大;匹配度越低,计算值越小
  • TM_CCOEFF:相关系数匹配法 | 匹配度越高,计算值越大;匹配度越低,计算值越小
  • TM_SQDIFF_NORMED:归一化平方差匹配法 | 取值范围 [0,1],匹配度越高值越小
  • TM_CCORR_NORMED:归一化相关匹配法 | 取值范围 [0,1],匹配度越高值越大
  • TM_CCOEFF_NORMED:归一化相关系数匹配法 | 取值范围 [-1,1],匹配度越高值越接近 1result:输出匹配结果矩阵(可选),尺寸为 (W-w+1, H-h+1),W/H 为目标图像宽 / 高,w/h 为模板宽 / 高mask:模板掩码(可选),仅支持 TM_SQDIFF/TM_CCOEFF_NORMED,需与模板尺寸 / 类型一致
'''-------------------------模板匹配-------------------------''' import cv2 kele = cv2.imread('kele.png') template = cv2.imread('kele_.png') cv2.imshow( 'kele',kele) cv2.imshow( 'template',template) cv2.waitKey(0) h, w = template.shape[:2] res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED) # 返回匹配结果的矩阵,其中每个元素表示该位置与模板的匹配程度 # cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 最小值、最大值、最小值位置、最大值位置 top_left = max_loc # 匹配区域的左上角坐标 bottom_right = (top_left[0] + w, top_left[1] + h) # 匹配区域的右下角坐标 kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2) # 绘制矩形 cv2.imshow( 'kele_template', kele_template) cv2.waitKey(0)

运行结果:

二、参数传递:

import argparse import antigravity parse=argparse.ArgumentParser(description='银行卡号识别') parse.add_argument("name",help="输入的姓名") parse.add_argument("-a",default=10,type=int) parse.add_argument("--bb",default=12,type=int) arg=parse.parse_args() name=arg.name a=arg.a b=arg.bb print(a+b) print(f"{name}") parse.print_help()
1.add_argument()方法的参数命名规则

add_argument()方法中第一个参数用于定义参数类型,主要分为两类:

  • 可选参数(可替代参数):参数名以-(短格式,如-i)或--(长格式,如--image)开头,支持设置default默认值(未手动传参时使用),传参时无需严格遵循顺序;
  • 位置参数:参数名不带-/--前缀,无默认值特性,必须按照脚本定义的顺序传入参数,是强制必填的参数类型。
2. 参数传递的两种方式
  • 方式 1:在命令行窗口直接执行脚本时传入参数;
  • 方式 2:在 IDE(如 PyCharm)中修改「运行 / 调试配置」,预先配置好参数后运行脚本。
3. 参数传递的格式规范
  • 位置参数:按脚本定义的顺序依次传入,参数之间用空格分隔;
  • 可选参数:格式为-参数名 传入值(或--参数名 传入值),多个可选参数之间同样用空格分隔,顺序可自由调整。

修改运行配置传参:

运行结果:

三、银行卡号识别案例(预处理):

代码:

import numpy as np import argparse import cv2 import myutils ap=argparse.ArgumentParser() ap.add_argument("-i","--image",required=True,help="path to input image") ap.add_argument("-t","--template",required=True,help="path to template OCR-A image") args=vars(ap.parse_args()) FIRST_NUMBER={"3":"American Express", "4":"Visa", "5":"MasterCard", "6":"Discover Card"} def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) img=cv2.imread(args["template"]) cv_show("img",img) ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv_show("ref",ref) 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,(255,0,0),3) cv_show("refCnts",img) refCnts=myutils.sort_contours(refCnts,method="left-to-right")[1] digits={} for i,c in enumerate(refCnts): x,y,w,h=c roi=ref[y:y+h,x:x+w] roi=cv2.resize(roi,(57,88)) cv_show("roi",roi) digits[i]=roi print(digits)

解析:这段代码是信用卡数字识别的模板预处理阶段,核心目标是:读取指定的 OCR-A 字体数字模板图像,通过灰度化、二值化、轮廓检测等操作,提取每个数字的独立区域并标准化尺寸,最终构建一个 “数字索引(0-9)→ 对应数字模板图像” 的字典,为后续匹配信用卡图像中的数字做准备。

运行结果:

导入的myutils文件是手写的处理图片中间过程的一个为文件,附上代码:

import cv2 def sort_contours(cnts,method='left-to-right'): reverse=False i=0 if method=='right-to-left' or method=='bottom-to-top': reverse=True if method=='top-to-bottom' or method=='bottom-to-top': i=1 boundingBoxes=[cv2.boundingRect(c) for c in cnts] (cnts,boundingBoxes)=zip(*sorted(zip(cnts,boundingBoxes), key=lambda b:b[1][i],reverse=reverse)) #zip(*...) 使用星号操作符解包排序后的元组列表,并将其重新组合成两个列表:一个包含所有轮廓,另一个包含所有边界框。 return cnts,boundingBoxes 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 image if 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) #默认为cv2.INTER_AREA,即面积插值,适用于缩放图像。 return resized # for i,j in enumerate([5,6,7]): # print(i,j) # # a=[i for i in range(5)] # print(a) # a=''.join(['4','0','0','0']) # print(a)

下一篇博客我们继续完成完整的银行卡号识别的项目。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 0:32:02

开源大模型声纹识别新选择:CAM++技术趋势一文详解

开源大模型声纹识别新选择:CAM技术趋势一文详解 1. 引言:声纹识别的技术演进与CAM的定位 近年来,随着深度学习在语音处理领域的持续突破,说话人识别(Speaker Verification, SV)技术已从传统的GMM-UBM和i-…

作者头像 李华
网站建设 2026/6/12 19:40:01

PlantUML Server终极指南:5分钟快速搭建在线图表服务

PlantUML Server终极指南:5分钟快速搭建在线图表服务 【免费下载链接】plantuml-server PlantUML Online Server 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-server PlantUML Server是一个功能强大的开源Web应用程序,能够通过简单的文…

作者头像 李华
网站建设 2026/6/15 18:49:08

麦橘超然无法连接CUDA?驱动兼容性问题解决指南

麦橘超然无法连接CUDA?驱动兼容性问题解决指南 1. 引言:麦橘超然 - Flux 离线图像生成控制台 “麦橘超然”(MajicFLUX)是一款基于 DiffSynth-Studio 构建的 Flux.1 图像生成 Web 服务,专为中低显存设备优化。通过集成…

作者头像 李华
网站建设 2026/6/13 20:43:06

突破性Windows安卓应用安装革命:APK Installer完全指南

突破性Windows安卓应用安装革命:APK Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows系统无法直接安装安卓应用而苦恼吗&am…

作者头像 李华
网站建设 2026/6/14 1:26:58

从零开始学语音识别:用GLM-ASR-Nano-2512快速入门

从零开始学语音识别:用GLM-ASR-Nano-2512快速入门 1. 引言:为什么选择 GLM-ASR-Nano-2512? 随着语音交互技术的普及,自动语音识别(ASR)已成为智能助手、会议记录、字幕生成等场景的核心能力。然而&#x…

作者头像 李华
网站建设 2026/6/15 15:13:03

5分钟快速上手:用PlantUML Server打造专业在线图表生成平台

5分钟快速上手:用PlantUML Server打造专业在线图表生成平台 【免费下载链接】plantuml-server PlantUML Online Server 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-server 还在为绘制复杂的UML图表而烦恼吗?PlantUML Server让在线图表…

作者头像 李华