OPENCV数字识别(非手写数字/采用模板匹配)

这篇文章的重点在于 模板匹配 的使用。模板匹配是计算机视觉中的一项基本技术,它通过比对输入图像与模板图像的相似度,来进行目标识别。对于数字识别,特别是标准数字的识别,模板匹配非常有效。

请看效果:
飞腾派桌面

文章结构

  1. 模板匹配的概念
  2. 如何裁剪图像以提高匹配精度
  3. 代码实现:数字识别
  4. 代码解析
  5. 总结与建议

模板匹配的概念

模板匹配是一种在图像中查找特定模板区域的方法。通过计算输入图像与多个模板的相似度,找到最匹配的区域。在数字识别中,这项技术通过将待识别的数字与一组模板数字进行比对,识别出最接近的数字。

如何裁剪图像以提高匹配精度

在使用模板匹配时,图像的预处理是至关重要的。裁剪掉不需要的部分,尤其是图像中可能干扰匹配的区域,可以大大提高匹配的精度。确保图像中只包含目标数字区域,从而提高识别准确率。


代码实现:数字识别

接下来,我会分享一段我用OpenCV实现的数字识别代码。这段代码利用了模板匹配的方式来识别标准数字。

import cv2
import numpy as np
import os# 数字模板匹配
def img_match(input_img, template_dict):"""返回 (最佳匹配数字, 最大相似度)"""resized_img = cv2.resize(input_img, (32, 48), interpolation=cv2.INTER_LINEAR)max_val = 0.0best_num = -1for i in range(10):template = template_dict[i]result = cv2.matchTemplate(resized_img, template, cv2.TM_CCOEFF_NORMED)_, current_max, _, _ = cv2.minMaxLoc(result)if current_max > max_val:max_val = current_maxbest_num = ireturn best_num, max_val# 加载数字模板
def load_templates(template_dir):template_dict = {}for i in range(10):template_path = os.path.join(template_dir, f"{i}.png")template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)if template is not None:_, binary_template = cv2.threshold(template, 100, 255, cv2.THRESH_BINARY_INV)resized_template = cv2.resize(binary_template, (32, 48), interpolation=cv2.INTER_LINEAR)template_dict[i] = resized_templatereturn template_dict# 主函数
def main():# 加载数字模板template_dir = "G:/pycharm/projects/opencv/num/"  # 修改为你的模板路径template_dict = load_templates(template_dir)# 打开摄像头cap = cv2.VideoCapture(1)if not cap.isOpened():print("无法打开摄像头")returnwhile True:ret, frame = cap.read()if not ret:breakimgContour = frame.copy()imgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 1)_, imgThresh = cv2.threshold(imgBlur, 95, 255, cv2.THRESH_BINARY_INV)edges = cv2.Canny(imgBlur, 30, 150)imgCanny = cv2.bitwise_or(edges, imgThresh)kernel = np.ones((3, 3), np.uint8)imgCanny = cv2.morphologyEx(imgCanny, cv2.MORPH_CLOSE, kernel)contours, hierarchy = cv2.findContours(imgCanny, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)if area < 4500:  # 像素面积小,可认为是数字x, y, w, h = cv2.boundingRect(cnt)roi = imgCanny[y:y + h, x:x + w]if roi.size == 0:continuenum, score = img_match(roi, template_dict)if score > 0.6:cv2.putText(imgContour, f"{num}", (x, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)cv2.imshow("Processed", imgContour)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

代码解析

1. 数字模板匹配

img_match 函数负责执行模板匹配操作。它将输入的图像与预先加载的数字模板进行比对,计算出匹配度,并返回最佳匹配的数字和相似度。

2. 加载模板

load_templates 函数从指定路径加载数字模板,模板图像会经过二值化处理并调整到统一的尺寸,确保模板能够适应各种输入图像。

3. 图像预处理

在主函数中,我们首先通过摄像头读取图像,并进行一些常见的图像预处理操作,包括灰度化、模糊化和边缘检测。然后,我们使用 cv2.findContours 函数提取图像中的数字区域。

4. 匹配与识别

通过 img_match 函数对每一个数字区域进行模板匹配,若匹配的相似度大于设定的阈值(例如0.6),则将识别的数字显示在图像上。


总结与建议

通过模板匹配,我们能够快速、准确地识别标准数字,适用于数字识别的基础场景。对于更复杂的场景,如手写数字或不同字体的数字,可能需要更先进的算法,如深度学习模型。

希望这篇文章能够帮助你理解OpenCV中模板匹配的使用方法。如果你有任何问题或改进建议,欢迎在评论区留言讨论。

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

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

相关文章

在 Kubernetes 中部署 Trivy 漏洞扫描服务

创建专用 Namespace # trivy-ns.yaml apiVersion: v1 kind: Namespace metadata: name: trivy-system配置持久化存储&#xff08;缓存数据库&#xff09; apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trivy-db-cache namespace: trivy-system spec: acc…

Cursor安装注册+基础配置+入门实操

一、安装注册 官网地址&#xff1a;https://www.cursor.com/ 下载按钮会根据电脑系统来匹配&#xff0c;点击对应「Download」按钮进行下载。完成后&#xff0c;按步骤安装即可。 安装完成后&#xff0c;即可点击图标打开软件。 基础设置完成后&#xff0c;就需要选择注册账号…

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…

MiniMax GenAI 可观测性分析:基于阿里云 SelectDB 构建 PB 级别日志系统

“阿里云SelectDB作为MiniMax日志存储服务的核心支撑&#xff0c;为在线和离线业务提供了高效、稳定的查询与聚合分析能力。其支持实时物化视图、租户资源隔离、冷热分离等企业级特性&#xff0c;不仅有效解决了日志场景下PB级别数据查询的性能瓶颈&#xff0c;还通过智能化的资…

【YOLO V3】目标检测 Darknet 训练自定义模型

【YOLO V3】目标检测 Darknet 训练自定义模型 前言整体思路环境检查与依赖配置克隆 YOLOv3 Darknet 并编译Clone Darknet 项目文件修改 Makefile 文件修改模型保存频率项目编译 准备数据集配置训练文件数据集&#xff1a;datasets &#xff08;自制&#xff09;权重文件 yolov3…

Kafka分区分配策略详解

Kafka分区分配策略详解 Kafka作为当前最流行的分布式消息队列系统&#xff0c;其分区分配策略直接影响着系统的性能、可靠性和可扩展性。合理的分区分配不仅能够提高数据处理的效率&#xff0c;还能确保系统负载的均衡。 Kafka提供了多种内置的分区分配策略&#xff0c;包括R…

C#中 String类API(函数)

字符串属性 string str "打工人";Console.WriteLine(str);char s str[0];Console.WriteLine(s); 字符串内置API(函数) 1. Concat 拼接字符串 string s1 "打";string s2 "工";string s3 "人";string sthstring.Concat(s1, s2, s…

JavaScript性能优化实战手册:从V8引擎到React的毫秒级性能革命

目录 一、性能优化的本质挑战1.1 浏览器渲染管线的性能瓶颈2.1 内存管理优化2.2 执行效率优化2.3 网络传输优化 三、React框架深度调优3.1 渲染性能优化3.2 性能监控体系 四、企业级优化案例4.1 电商平台首页优化4.2 数据可视化大屏优化 五、新一代性能优化技术5.1 WASM性能突破…

【PostgreSQL】pg各版本选用取舍逻辑与docker安装postgres:15

企业常用 PostgreSQL 版本推荐 1. PostgreSQL 14&#xff08;最常见&#xff0c;稳定&#xff09; 目前许多企业仍在使用 PostgreSQL 14&#xff0c;因为它在性能、并发处理、JSON 支持等方面做了较多优化&#xff0c;同时又非常稳定。官方支持时间&#xff1a;2026 年 11 月…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能📚页面效果📚指令输入�…

《Python实战进阶》第31集:特征工程:特征选择与降维技术

第31集&#xff1a;特征工程&#xff1a;特征选择与降维技术 摘要 特征工程是机器学习和数据科学中不可或缺的一环&#xff0c;其核心目标是通过选择重要特征和降低维度来提升模型性能并减少计算复杂度。本集聚焦于特征选择与降维技术&#xff0c;涵盖过滤法、包裹法、嵌入法等…

避雷 :C语言中 scanf() 函数的错误❌使用!!!

1. 返回值说明 scanf函数会返回成功匹配并赋值的输入项个数&#xff0c;而不是返回输入的数据。 可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符&#xff0c;就表明输入存在问题。 #include <stdio.h>int main() {int num;if (scanf("%d", …

Excel第41套全国人口普查

2. 导入网页中的表格&#xff1a;数据-现有链接-考生文件夹&#xff1a;网页-找到表格-点击→变为√-导入删除外部链接关系&#xff1a;数据-点击链接-选中连接-删除-确定&#xff08;套用表格格式-也会是删除外部链接&#xff09;数值缩小10000倍&#xff08;除以10000即可&am…

WPS宏开发手册——使用、工程、模块介绍

目录 系列文章前言1、开始1.1、宏编辑器使用步骤1.2、工程1.3、工程 系列文章 使用、工程、模块介绍 JSA语法 第三篇练习练习题&#xff0c;持续更新中… 前言 如果你是开发人员&#xff0c;那么wps宏开发对你来说手拿把切。反之还挺吃力&#xff0c;需要嘻嘻&#xf…

EtherCAT转CANopen配置CANopen侧的PDO映射

EtherCAT转CANopen配置CANopen侧的PDO映射 在工业自动化领域&#xff0c;EtherCAT和CANopen是两种广泛应用的通信协议。它们各自具有独特的优势&#xff0c;但在某些应用场景下&#xff0c;需要将这两种协议进行转换以实现设备间的高效数据交换。本文将详细介绍如何在使用Ethe…

【QT】Qt creator快捷键

Qt creator可以通过以下步骤快捷键査看调用关系&#xff1a; 1.打开代码文件。 2.将光标放在你想要查看调用关系的函数名上。 3.按下键盘快捷键 CtrlshiftU。 4.弹出菜单中选择“调用路径”或“被调用路径” 5.在弹出的窗口中可以查看函数的调用关系 折叠或展开代码快捷键&…

【RHCE】LVS-NAT模式负载均衡实验

目录 题目 IP规划 配置IP RS1 RS2 RS3 LVS client 配置RS 配置LVS 安装lvs软件 启动ipvsadm服务 lvs规则匹配 ipvsadm部分选项 客户端测试 总结 题目 使用LVS的 NAT 模式实现 3 台RS的轮询访问&#xff0c;IP地址和主机自己规划。 IP规划 主机IP地址RS1-nat模…

排序算法(插入,希尔,选择,冒泡,堆,快排,归并)

1.插入排序 插入排序的主要思想是额外申请一个空间cur&#xff0c;让cur一开始等于数组的第1号位置,设置i1&#xff0c;让i-1的元素与其比较&#xff0c;如果arr[i-1]>arr[i]&#xff0c;就让arr[i1] arr[i]&#xff0c;当进行到最后一次对比结束&#xff0c;i-1,再让arr[…

Java——Random库

一、作用 Random库——生成随机数 二、实现步骤 1.导包&#xff1a;import java.util.Random; #快捷键&#xff1a;“Random”回车键 2.取得随机数&#xff1a;Random 变量1 new Random(); 3.调用随机数&#xff1a;类型 变量2 变量1.nextInt(n); &#xff08;代表变量…

解线性方程组的直接方法:高斯消元法与其程序实现

解线性方程组的直接方法&#xff1a;高斯消元法与其程序实现 1.顺序高斯消元法 设线性方程组 A x b \boldsymbol{Ax}\boldsymbol{b} Axb 如果 a k k ( k ) ≠ 0 a_{kk}^{\left( k \right)}\ne 0 akk(k)​​0 可以通过高斯消元法转化为等价的三角形线性方程组&#xff1a; …