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

目录

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

[cv2.matchTemplate 函数说明](#cv2.matchTemplate 函数说明)

二、参数传递:

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

[2. 参数传递的两种方式](#2. 参数传递的两种方式)

[3. 参数传递的格式规范](#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,需与模板尺寸 / 类型一致
python 复制代码
'''-------------------------模板匹配-------------------------'''

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)

运行结果:

二、参数传递:

python 复制代码
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. 参数传递的格式规范
  • 位置参数:按脚本定义的顺序依次传入,参数之间用空格分隔;
  • 可选参数:格式为 -参数名 传入值(或 --参数名 传入值),多个可选参数之间同样用空格分隔,顺序可自由调整。

修改运行配置传参:

运行结果:

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

代码:

python 复制代码
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文件是手写的处理图片中间过程的一个为文件,附上代码:

python 复制代码
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)

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

相关推荐
a1117763 小时前
医院挂号预约系统(开源 Fastapi+vue2)
前端·vue.js·python·html5·fastapi
0思必得03 小时前
[Web自动化] Selenium处理iframe和frame
前端·爬虫·python·selenium·自动化·web自动化
摘星编程5 小时前
OpenHarmony + RN:Calendar日期选择功能
python
Yvonne爱编码5 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
一方_self5 小时前
了解和使用python的click命令行cli工具
开发语言·python
小芳矶5 小时前
Dify本地docker部署踩坑记录
python·docker·容器
2301_822366356 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
小郎君。6 小时前
【无标题】
python
喵手7 小时前
Python爬虫实战:数据治理实战 - 基于规则与模糊匹配的店铺/公司名实体消歧(附CSV导出 + SQLite持久化存储)!
爬虫·python·数据治理·爬虫实战·零基础python爬虫教学·规则与模糊匹配·店铺公司名实体消岐
喵手7 小时前
Python爬虫实战:国际电影节入围名单采集与智能分析系统:从数据抓取到获奖预测(附 CSV 导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集国际电影节入围名单·从数据抓取到获奖预测