news 2026/2/7 13:51:02

计算机视觉系列之opencv语法基础案例分析之银行卡号识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机视觉系列之opencv语法基础案例分析之银行卡号识别

简介

计算机视觉系列第一课opencv语法(一)保姆级教学
计算机视觉系列第一课opencv语法(二)保姆级教学
计算机视觉系列第一课opencv语法(三)保姆级教学
[计算机视觉第一课opencv(四)保姆级教学][opencv 3]

关于计算机视觉的基础内容我们之前已经说完了,今天我们就来用一个小案例来回顾并丰富一下我们的知识。

一、整体流程

  1. 预处理模板图像,提取数字模板
  2. 预处理信用卡图像,定位数字区域
  3. 对每个数字区域进行处理,提取单个数字
  4. 使用模板匹配识别每个数字
  5. 输出识别结果

card.png

template.png

这是数字模板,就是把银行卡号与这里面每一个数字对比实现模糊匹配

二、代码分析

1. 导入工具包和参数设置
# 导入工具包importnumpyasnp# 用于数值计算和数组操作importargparse# 用于解析命令行参数importcv2# OpenCV库,用于图像处理importmyutils# 自定义工具函数,包含图像 resize、轮廓排序等功能

argparse用于解析命令行参数,允许用户通过命令行指定输入图像和模板图像:

# 设置命令行参数# 创建 ArgumentParser 对象,用于定义和解析命令行参数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"}

辅助函数cv_show用于显示图像:

defcv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)# 等待按键,0表示无限等待

myutils.py

importcv2defsort_contours(cnts,method='left-to-right'):reverse=Falsei=0ifmethod=='right-to-left'ormethod=='bottom-to-top':reverse=Trueifmethod=='top-to-bottom'ormethod=='bottom-to-top':i=1boundingBoxes=[cv2.boundingRect(c)forcincnts](cnts,boundingBoxes)=zip(*sorted(zip(cnts,boundingBoxes),key=lambdab:b[1][i],reverse=reverse))# zip(*...) 使用星号操作符解包排序后的元组列表,并将其重新组合成两个列表:一个包含所有轮廓,另一个包含所有边界框。returncnts,boundingBoxesdefresize(image,width=None,height=None,inter=cv2.INTER_AREA):dim=None(h,w)=image.shape[:2]ifwidthisNoneandheightisNone:returnimageifwidthisNone: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,即面积插值,适用于缩放图像returnresized

这里定义了两个函数方法:

  1. sort_contours函数:轮廓排序

这个函数的作用是按照指定的方式对图像中的轮廓进行排序,方便后续的图像处理和分析。

参数说明:

  • cnts:需要排序的轮廓列表(通常来自cv2.findContours的返回值)

  • method:排序方法,可选值包括:

    • ‘left-to-right’(默认):从左到右排序
    • ‘right-to-left’:从右到左排序
    • ‘top-to-bottom’:从上到下排序
    • ‘bottom-to-top’:从下到上排序

工作原理:

  1. 首先根据排序方法设置reverse(是否反转排序结果)和i(排序依据的坐标索引):

    • 对于水平方向排序(左右),使用 x 坐标(索引 0)
    • 对于垂直方向排序(上下),使用 y 坐标(索引 1)
    • 反向排序(如 right-to-left)时设置reverse=True
  2. boundingBoxes = [cv2.boundingRect(c) for c in cnts]

    • 为每个轮廓计算边界框(外接矩形)
    • cv2.boundingRect(c)返回一个元组(x, y, w, h),其中 (x,y) 是矩形左上角坐标,w 和 h 是宽和高
  3. 排序部分:

    • zip(cnts, boundingBoxes)将轮廓与其对应的边界框组合成元组
    • sorted(..., key=lambda b: b[1][i], reverse=reverse)根据边界框的指定坐标(x 或 y)进行排序
    • zip(*...)解包排序后的结果,重新组合成轮廓列表和边界框列表
  4. 返回排序后的轮廓和对应的边界框

  5. resize函数:图像缩放

这个函数用于按比例调整图像的尺寸,可以指定宽度或高度,保持原图的宽高比。

参数说明:

  • image:输入图像
  • width:目标宽度(可选)
  • height:目标高度(可选)
  • inter:插值方法,默认为cv2.INTER_AREA(面积插值)

工作原理:

  1. 首先获取原图的高度和宽度:(h, w) = image.shape[:2]

  2. 处理特殊情况:

    • 如果宽度和高度都未指定,直接返回原图
    • 如果只指定高度,则计算高度的缩放比例r = height / float(h),再计算对应的宽度
    • 如果只指定宽度,则计算宽度的缩放比例r = width / float(w),再计算对应的高度
  3. 执行缩放:

    • cv2.resize(image, dim, interpolation=inter)使用计算出的目标尺寸dim进行缩放
    • 默认使用cv2.INTER_AREA插值方法,这种方法在缩小图像时效果较好,能保持图像质量
  4. 返回缩放后的图像

使用场景

  • sort_contours常用于需要按顺序处理轮廓的场景,如识别数字、字符时按阅读顺序排列
  • resize是预处理的常用步骤,用于统一图像尺寸,方便后续处理或显示
2. 模板图像处理(创建数字模板库)

这部分的目的是从模板图像中提取 0-9 的数字特征,建立模板库:

# 读取模板图像img=cv2.imread(args["template"])cv_show('img',img)# 转换为灰度图ref=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv_show('ref',ref)# 转换为二值图像(黑底白字)ref
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 8:16:02

linux常用命令——压缩命令

linux常用命令——压缩 1. tar 文件打包/解压 tar 本身是 打包工具(将多个文件 / 目录合并为一个 .tar 归档文件),不直接压缩。但它可以结合 gzip、bzip2、xz 等压缩算法,实现 “打包 压缩” 一体操作,生成 .tar.gz…

作者头像 李华
网站建设 2026/2/7 10:12:23

Flowise客户案例:在线教育平台智能辅导系统上线

Flowise客户案例:在线教育平台智能辅导系统上线 1. 为什么这家教育公司选择了Flowise 在线教育平台最常被用户问到的问题,不是“这门课怎么报名”,而是“老师什么时候回复我的问题”“这个知识点我反复看了三遍还是没懂”“能不能给我出几道…

作者头像 李华
网站建设 2026/2/5 15:25:50

30秒以上长语音测试,CAM++特征提取稳定性

30秒以上长语音测试,CAM特征提取稳定性 1. 为什么长语音测试对说话人识别系统至关重要 你有没有遇到过这样的情况:一段30秒的会议录音,想确认是不是某位同事的声音,但系统却提示"音频过长,建议截取3-10秒片段&q…

作者头像 李华
网站建设 2026/2/6 15:19:44

translategemma-27b-it快速部署:Ubuntu/Windows/Mac三平台Ollama兼容方案

translategemma-27b-it快速部署:Ubuntu/Windows/Mac三平台Ollama兼容方案 你是不是也遇到过这些情况: 看到一份中文技术文档配图,想快速理解但手动查词太慢;收到一张外文商品说明书截图,需要立刻知道关键参数&#x…

作者头像 李华
网站建设 2026/2/6 6:43:39

企业级文理医院预约挂号系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着医疗行业的快速发展,信息化管理已成为提升医院服务效率和质量的重要手段。传统的医院挂号方式存在排队时间长、信息不透明、资源分配不均等问题,亟需通过数字化手段优化流程。企业级文理医院预约挂号系统旨在解决这些问题,为患者提供…

作者头像 李华
网站建设 2026/2/5 16:05:13

DASD-4B-Thinking科研辅助:用Long-CoT能力加速文献综述逻辑链构建教程

DASD-4B-Thinking科研辅助:用Long-CoT能力加速文献综述逻辑链构建教程 1. 引言:科研工作者的新助手 科研文献综述是每个研究者必经的挑战。面对海量论文,如何快速梳理逻辑链条、建立知识体系?传统方法需要耗费大量时间阅读和整理…

作者头像 李华