这段代码用 OpenCV 做了一份“数字模板字典”,然后在银行卡/身份证照片里自动找到身份证号那一行,把每个数字切出来跟模板比对,最终输出并高亮显示出完整的身份证号码,下面是代码解释:

模块 1 工具箱(通用函数)

目的:

  • cv_show:调试时弹窗查看中间图像

  • sort_contours:按指定顺序(左→右、上→下等)排列轮廓,避免 OpenCV 随机顺序

代码

def cv_show(name, image):cv2.imshow(name, image)cv2.waitKey(0)def sort_contours(cnts, method='left-to-right'):reverse = Falsei = 0if method in ('right-to-left', 'bottom-to-top'):reverse = Trueif method in ('top-to-bottom', 'bottom-to-top'):i = 1boundingBoxes = [cv2.boundingRect(c) for c in cnts](cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b: b[1][i],reverse=reverse))return cnts, boundingBoxes

注意

  • 返回值为元组,后续用 [0] 取排序后的轮廓

  • 若数字多行,可将 method 改为 'top-to-bottom'


模块 2 模板制作(生成 0-9 标准模板)

目的

从干净模板图中切出单个数字 → 统一尺寸(57×88)→ 白底黑字,供后续模板匹配

步骤

  1. 读图

    img = cv2.imread("picture/TP.png")
    gray = cv2.imread("picture/TP.png", 0)
  2. 二值化(数字变白)

    ref = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)[1]
  3. 找轮廓并排序

    _, refCnts, _ = cv2.findContours(ref, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    refCnts = sort_contours(refCnts, method='left-to-right')[0]
  4. 生成模板字典

    digits = {}
    for (i, c) in enumerate(refCnts):x, y, w, h = cv2.boundingRect(c)roi = ref[y-2:y+h+2, x-2:x+w+2]roi = cv2.resize(roi, (57, 88))roi = cv2.bitwise_not(roi)  # 白底黑字digits[i] = roi

注意

  • 模板图需无粘连、无干扰

  • 若含小数点/空格,需额外过滤以保证 digits 长度为 10


模块 3 输入图预处理(定位身份证号区域)

目的

在整幅银行卡/身份证中,仅保留“身份证号”水平条带,减少误检

步骤

  1. 读图

    img = cv2.imread('picture/card_id.jpg')
    gray = cv2.imread('picture/card_id.jpg', 0)
  2. 二值化

    ref = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY_INV)[1]
  3. 找轮廓

    _, refCnts, _ = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  4. 几何过滤(针对当前图写死坐标)

注意

  • 330/360/220 为经验值,换图需调整

  • 光照不均时建议自适应阈值或亮度归一化


模块 4 单字符切割 + 模板匹配识别

目的

将单行 ROI 切成单个字符,与模板库 0-9 匹配,得分最高者即为识别结果,并绘制边框与文字

步骤

  • 遍历每个候选矩形

    output = []
    for (i, (gX, gY, gW, gH)) in enumerate(locs):group = gray[gY-2:gY+gH+2, gX-2:gX+gW+2]group = cv2.threshold(group, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]roi = cv2.resize(group, (57, 88))
  • 模板匹配打分

    scores = []
    for (digit, digitROI) in digits.items():result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)(_, score, _, _) = cv2.minMaxLoc(result)scores.append(score)
    jieguo = str(np.argmax(scores))
    output.append(jieguo)
  • 绘制结果

    cv2.rectangle(imgg, (gX-5, gY-5), (gX+gW+5, gY+gH+5), (0, 0, 255), 1)
    cv2.putText(imgg, jieguo, (gX, gY-15), cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 0, 255), 2)
  • 打印整串号码

    print("Card ID #: {}".format("".join(output)))
    cv2.imshow("Image", imgg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    注意

    • 若印刷为黑底白字,需再次 bitwise_not

    • 仅支持数字 0-9;含字母/X 需扩展模板或改用 CNN

    • 连体数字需先投影分割再识别

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/pingmian/96567.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96567.shtml
    英文地址,请注明出处:http://en.pswp.cn/pingmian/96567.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    冯诺依曼体系:现代计算机的基石与未来展望

    冯诺依曼体系:现代计算机的基石与未来展望 引人入胜的开篇 当你用手机刷视频、用电脑办公时,是否想过这些设备背后共享的底层逻辑?从指尖轻滑切换APP,到电脑秒开文档,这种「无缝衔接」的体验,其实藏着一个改…

    前端基础 —— C / JavaScript基础语法

    以下是对《3.JavaScript(基础语法).pdf》的内容大纲总结:---📘 一、JavaScript 简介 - 定义:脚本语言,最初用于表单验证,现为通用编程语言。 - 应用:网页开发、游戏、服务器(Node.js&#xff09…

    springboot 二手物品交易系统设计与实现

    springboot 二手物品交易系统设计与实现 目录 【SpringBoot二手交易系统全解析】从0到1搭建你的专属平台! 🔍 需求确认:沟通对接 🗣 📊 系统功能结构:附思维导图 ☆开发技术: &#x1f6e…

    【Android】可折叠式标题栏

    在 Android 应用开发中,精美的用户界面可以显著提升应用品质和用户体验。Material Design 组件中的 CollapsingToolbarLayout 能够为应用添加动态、流畅的折叠效果,让标题栏不再是静态的元素。本文将深入探讨如何使用 CollapsingToolbarLayout 创建令人惊…

    Debian13下使用 Vim + Vimspector + ST-LINK v2.1 调试 STM32F103 指南

    1. 硬件准备与连接 1.1 所需硬件 STM32F103C8T6 最小系统板ST-LINK v2.1 调试器连接线(杜邦线) 1.2 硬件连接 ST-LINK v2.1 ↔ STM32F103C8T6 连接方式:ST-LINK v2.1 引脚STM32F103C8T6 引脚功能说明SWDIOPA13数据线SWCLKPA14时钟线GNDGND共地…

    第21课:成本优化与资源管理

    第21课:成本优化与资源管理 课程目标 掌握计算资源优化 学习成本控制策略 了解资源调度算法 实践实现成本优化系统 课程内容 21.1 成本分析框架 成本分析系统 class CostAnalysisFramework {constructor(config) {this.config

    SAP HANA Scale-out 04:CalculationView优化

    CV执行过程计算视图激活时,生成Stored ModelSELECT查询时:首先将Stored Model实例化为runtime Model 计算引擎执行优化,将runtime Model转换为Optimized Runtime ModelOptimized Runtime Model通过SQL Optimizer进行优化计算引擎优化特性说明…

    鸿蒙审核问题——Scroll中嵌套了List/Grid时滑动问题

    文章目录背景原因解决办法1、借鉴Flutter中的解决方式,如下图2、鸿蒙Next中对应的解决方式,如下图3、官方文档回访背景 来源一次审核被拒的情况。也是出于粗心导致的。之前在flutter项目中也是遇到过这种问题的。其实就是滚动视图内嵌滚动视图造成的&am…

    测试电商购物车功能,设计测试case

    在电商场景中,购物车是连接商品浏览与下单支付的关键环节,需要从功能、性能、兼容性、安全性等多维度进行测试。以下是购物车功能的测试用例设计: 一、功能测试 1. 商品添加到购物车 - 未登录状态下,添加商品到购物车(…

    Linux --- 常见的基本指令

    一. 前言本篇博客使用的 Linux 操作系统是 centos ,用来学习Linux 的 Linux 系统的内核版本和系统架构信息版本如下所示:上图的主要结构为:主版本号-次版本号 修正次数,3.10.0 是操作系统的主版本号;当我们在维护一段L…

    微信小程序 -开发邮箱注册验证功能

    一、前端验证:正则表达式与插件结合正则表达式设计 使用通用邮箱格式校验正则,并允许中文域名(如.中国): const emailReg /^[a-zA-Z0-9._%-][a-zA-Z0-9-](?:\.[a-zA-Z0-9-])*\.[a-zA-Z]{2,}(?:\.[a-zA-Z]{2})?$/i;…

    docker 部署 code-server

    docker 部署 code-servercode-serverError response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headersdocker 配置正确步骤 阿里云源permission de…

    网络编程专题:从源码解析网络编程常用方法(基于6.16.3内核)

    前言 本文是因为作者在研究下面这个代码时发现的问题: int main() {// 1. 创建 IPv4 专用地址结构体 sockaddr_instruct sockaddr_in ipv4_addr;memset(&ipv4_addr, 0, sizeof(ipv4_addr)); // 初始化清零// 2. 填充 IPv4 专属信息ipv4_addr.sin_family AF_IN…

    2025年数字公共治理专业重点学什么内容?(详细指南)

    数字公共治理作为一个新兴的跨学科领域,近年来受到越来越多高校和学生的关注。这个专业融合了多个学科的知识体系,旨在培养掌握现代治理理念和技术应用能力的复合型人才。对于在校大学生而言,了解这一专业的学习内容和发展方向,有…

    一招解决 win 下 终端打印中文乱码问题

    适合所有终端 cmd powershell git bash, 原理:修改电脑的区域设置,勾选使用 UTF-8 1.电脑搜索 区域, 打开区域设置2. 打开相关设置3. 点击更改 日期、时间或数字格式4. 选则管理-点击更改系统区域设置,在弹出框中勾选 …

    Elasticsearch面试精讲 Day 13:索引生命周期管理ILM

    【Elasticsearch面试精讲 Day 13】索引生命周期管理ILM 在“Elasticsearch面试精讲”系列的第13天,我们将深入探讨 索引生命周期管理(Index Lifecycle Management, ILM) 这一核心运维机制。作为大规模日志、监控和时序数据场景下的必备功能&…

    Python快速入门专业版(二十八):函数参数进阶:默认参数与可变参数(*args/**kwargs)

    目录引一、默认参数:给函数参数设置“默认值”1. 基本语法与使用示例示例1:带默认参数的乘法函数2. 默认参数的核心规则:必须放在非默认参数之后示例2:默认参数位置错误(报错)3. 默认参数的“可变对象陷阱”…

    FreeRTOS 知识点

    一、配置过程二、基本知识点2.1 抢占优先级和响应优先级在 FreeRTOS 中,任务的调度方式主要有 ​​抢占式(Preemptive)​​ 和 ​​协作式(Cooperative)​​ 两种模式,它们的核心区别在于 ​​任务如何释放…

    SQL注入漏洞手动测试详细过程

    这是一次详细的、基于真实手动测试思维的SQL注入漏洞测试过程记录。我们将以一个假设的Web应用程序为例,进行逐步探测和利用。测试目标假设我们正在测试一个名为 example.com 的电商网站,其有一个查看商品详情的页面,URL 为: http…

    机器人控制器开发(通讯——ros话题转为websocket)

    1 为什么要实现ROS话题转WebSocket 主要有如下5个优点:跨平台通信需求 WebSocket作为一种标准的Web通信协议,允许任何支持WebSocket的客户端(网页、移动应用、其他系统)与ROS机器人进行实时通信,打破了ROS传统通信方式…