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

news/2025/3/28 3:38:03/

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

请看效果:
飞腾派桌面

文章结构

  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.ppmy.cn/news/1583046.html

相关文章

在shell脚本内部获取该脚本所在目录的绝对路径

目录 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 变量 方法三&#xff1a;仅使用纯 Bash 实现 需求描述 工作中经常有这样情况&#xff0c;需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…

Excel online开始支持Copilot高级数据分析:Python提供强大的数据见解

前文讲过Excel中的copilot可以直接调用Python进行高级数据分析&#xff1a; Copilot&#xff1a;Excel中的Python高级分析来了 Python in Excel高级分析&#xff1a;一键RFM分析 超越DeepSeek&#xff1a;Copilot in Excel高级数据分析原生支持Python无需安装软件 零代码、…

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…

基于Spring Boot的供应商管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…

VS010生成可由MATLAB2016调用的DLL文件方法

亲测实用&#xff0c;不用配置杂七杂八的依赖项 1&#xff1a;新建Win32的DLL输出项目 2&#xff1a;修改为release模式 3&#xff1a;添加calc.cpp文件&#xff0c;即要导出的函数myadd&#xff1a; #include "calc.h" __declspec(dllexport) int myadd(int a,in…

python3面试题20个(python web篇)

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 1.python asyncio的原理?2.对Flask蓝图(Blueprint)的理解?3.Flask 和 Django 路由映射的区别?4.什么是wsgi,uwsgi,uWSGI?5.Django、Flask、Tornado的对比?6.CORS 和 CSRF的区别?7.Session,Cookie,JWT的理解8.简…