手把手教你使用OpenCV和KNN算法进行手写数字识别

手把手教你使用OpenCV和KNN算法进行手写数字识别

在这篇博客中,我将向大家介绍如何使用OpenCV和KNN算法编写一个手写数字识别程序。我们将一步一步地解释每个步骤,确保大家能理解代码的每个细节。我们将通过一个具体的实例来演示,如何从图像预处理到模型训练,再到最终的数字识别。

什么是OpenCV?

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,包含了数百个计算机视觉算法。它被广泛应用于各种图像和视频处理任务,如面部识别、运动跟踪、物体检测等。

什么是KNN算法?

KNN(K-Nearest Neighbors)是一种简单且常用的机器学习算法,用于分类和回归任务。它通过计算输入样本与训练集样本的距离来进行分类。对于分类任务,它选择距离最近的K个样本,取其中类别出现最多的类别作为预测结果。

准备工作

在开始编写代码之前,请确保你已经安装了必要的库。你可以使用以下命令来安装OpenCV和Scikit-Learn:

pip install opencv-python scikit-learn

步骤1:导入必要的库

首先,我们需要导入一些必要的Python库:

import cv2
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
from sklearn.metrics import accuracy_score
  • cv2:这是OpenCV库的主模块。
  • numpy:一个用于处理数组的库。
  • KNeighborsClassifier:Scikit-Learn库中的KNN分类器。
  • train_test_split:用于将数据集分割为训练集和测试集。
  • load_digits:一个包含手写数字数据集的函数。
  • accuracy_score:用于计算模型准确率的函数。

步骤2:加载并准备数据

我们使用Scikit-Learn提供的digits数据集,它包含了0到9的手写数字图像。

digits = load_digits()
X = digits.images
y = digits.target# 将每个图像从8x8像素展平成64维向量
n_samples = len(X)
X = X.reshape((n_samples, -1))# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, stratify=y, random_state=42)

这里,我们首先加载digits数据集,并将每个图像从8x8像素展平成一个64维的向量。接着,我们将数据集分割为训练集和测试集。

步骤3:训练KNN模型

接下来,我们训练一个KNN分类器:

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

在这里,我们创建了一个KNN分类器实例,并设置邻居数量为5。然后,我们使用训练集对模型进行训练。

步骤4:测试模型并计算准确率

接下来,我们使用测试集来评估模型的表现:

y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")

我们通过预测测试集中的样本来计算模型的准确率,并打印出来。这样我们就可以知道模型的性能。

步骤5:使用训练好的模型进行数字识别

为了识别新的手写数字图像,我们需要一个函数来处理图像并进行预测:

def recognize_digit(image, knn_model):# 将图像转换为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 将图像缩放到8x8resized = cv2.resize(gray, (8, 8), interpolation=cv2.INTER_AREA)# 反转颜色inverted = cv2.bitwise_not(resized)# 将图像展平成64维向量flattened = inverted.flatten().reshape(1, -1)# 进行预测digit = knn_model.predict(flattened)return digit[0]

这个函数首先将输入图像转换为灰度图,然后将图像缩放到8x8像素,并反转颜色(因为digits数据集中的数字是白色背景黑色数字,而大多数手写数字图像是黑色背景白色数字)。接着,我们将图像展平成一个64维的向量,并使用训练好的KNN模型进行预测。

步骤6:应用程序

最后,我们创建一个简单的应用程序,通过摄像头捕获图像并实时识别数字:

cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 假设图像中数字位于中心区域roi = frame[100:300, 100:300]digit = recognize_digit(roi, knn)# 在图像上显示识别结果cv2.putText(frame, f"Digit: {digit}", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)cv2.imshow('Digit Recognizer', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

在这个应用程序中,我们使用OpenCV的VideoCapture类来捕获摄像头图像。我们假设数字位于图像的中心区域(100到300像素之间)。我们调用recognize_digit函数来识别这个区域中的数字,并在图像上显示识别结果。

代码解析

通过上面的代码,我们可以看到如何一步一步地实现手写数字识别。从数据准备到模型训练,再到图像处理和实时识别,每个步骤都是至关重要的。

  1. 数据准备:我们使用了Scikit-Learn提供的digits数据集,它包含了大量的手写数字图像,这为我们提供了一个良好的训练基础。
  2. 模型训练:我们使用KNN算法来训练一个分类器,KNN算法简单易用,适合初学者。
  3. 图像处理:我们使用OpenCV进行图像预处理,包括灰度转换、缩放和反转颜色等操作。这些步骤可以显著提高模型的识别准确率。
  4. 实时识别:我们通过摄像头捕获图像,并实时识别数字。这使得我们的应用程序更加实用和有趣。

进一步改进

虽然我们已经实现了一个基本的手写数字识别系统,但还有许多改进的空间。例如:

  • 使用更复杂的模型:我们可以尝试使用更复杂的模型,如卷积神经网络(CNN),来提高识别准确率。
  • 数据增强:通过数据增强技术,我们可以生成更多的训练样本,进一步提高模型的泛化能力。
  • 改进图像处理:可以尝试其他的图像处理技术,如去噪、边缘检测等,以提高预处理效果。
  • 优化实时识别:通过优化图像捕获和处理流程,可以提高实时识别的效率和准确性。

总结

在这篇博客中,我们详细介绍了如何使用OpenCV和KNN算法实现手写数字识别。通过学习这些步骤,你可以掌握基本的图像处理和机器学习技术,并能够实现一个简单但有效的数字识别系统。

希望这篇博客对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。祝你编码愉快!

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

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

相关文章

【Python】 Stacking: 强大的集成学习方法

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在机器学习中,单…

vscode 终端无法正常执行脚本命令如何解决

我们经常需要在vscode的中安装第三方依赖包,npm是前端目前最大的Node.js模块化管理系统,它能帮助开发者管理和发布Node.js模块。但很多时候我们在vscode的终端中执行npm install命令时经常会报以下错误: 但是在Windows的cmd命令提示符中执行n…

JavaScript妙笔生花:打造沉浸式中国象棋游戏体验

前言 随着信息技术的飞速发展,Web开发领域也出现了翻天覆地的变化。JavaScript作为前端开发中不可或缺的编程语言,其重要性不言而喻。而当我们谈论到利用JavaScript打造一款沉浸式的中国象棋游戏体验时,我们不仅仅是在开发一个游戏&#xff0…

在 Linux/Debian/Ubuntu 上安装 LAMP: Linux、Apache、MySQL 和 PHP

在 Linux/Debian/Ubuntu 上安装 LAMP LAMP 代表 Linux、Apache、MySQL 和 PHP,是一种流行的开源 Web 开发平台,可以提供强大的服务器环境来运行动态网站和 Web 应用程序。本文将详细介绍如何在 Ubuntu 系统上安装和配置 LAMP。 步骤 1: 更新系统 在开…

微信分销商城小程序源码系统在线搭建 前后端分离 带完整的安装代码包以及搭建教程

系统概述 本微信分销商城小程序源码系统采用先进的前后端分离架构设计,前端使用Vue.js框架开发,后端则基于Spring Boot构建,确保了系统的高可维护性、扩展性和性能。系统集商品展示、在线交易、会员管理、分销推广、订单处理、数据统计等功能…

AIoT设备新一代高性能处理器瑞芯微RK3576,东胜物联RK3588等核心板定制开发

随着物联网、人工智能和嵌入式技术的不断发展,智能设备应用对芯片处理器的性能需求越来越高,以满足复杂的数据处理需求、实时性要求、复杂的算法运算和多任务处理能力。高性能的芯片可以为智能设备提供更强大的计算能力和更快速的响应速度,从…

Camtasia Studio 2024软件下载附加详细安装教程

amtasia Studio 2024是一款功能强大的屏幕录制和视频编辑软件,由TechSmith公司开发。这款软件不仅能够帮助用户轻松地记录电脑屏幕上的任何操作,还可以将录制的视频进行专业的编辑和制作,最终输出高质量的视频教程、演示文稿、培训课程等。 …

【Android】RecyclerView纵向倾斜滑动,触发ViewPage2横向滑动而导致的滑动冲突问题

问题描述 场景ViewPage2FragmentRecyclerView(我的项目里RecycleView外层还套了一层SmartRefreshLayout) 因ViewPage2滑动太灵敏,RecyclerView纵向倾斜滑动,触发ViewPage2横向滑动而导致的滑动冲突问题 解决方案: …

Google Earth Engine(GEE)——导出影像video到自己的Google硬盘当中

函数: Export.video.toDrive(collection, description, folder, fileNamePrefix, framesPerSecond, dimensions, region, scale, crs, crsTransform, maxPixels, maxFrames) Creates a batch task to export an ImageCollection as a video to Drive. The collection must on…

极简opencv操作xml文件

目标 修改xml文件&#xff0c;先产生一个临时文件&#xff0c;拷贝&#xff0c;修改&#xff0c;改名&#xff0c;使用opencv 非常简单地就可以搞定配置xml文件 code #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/core/utils/files…

2 程序的灵魂—算法-2.4 怎样表示一个算法-2.4.2 用流程图表示算法-【例 2.9】

将例 2.4 求 1-1/21/3-1/41/99-1/100 的算用流程图表示。 一个流程图包括&#xff1a; 1. 表示相应操作的框&#xff1b; 2. 带箭头的流程线&#xff1b; 3. 框内外必要的文字说明。

Transformer模型探索:Hugging Face库实战篇二——模型与分词器解析

注&#xff1a;本系列教程仅供学习使用, 由原作者授权, 均转载自小昇的 博客 。 文章目录 前言模型 加载模型 保存模型 分词器 分词策略 加载与保存分词器编码与解码文本 处理多段文本 Padding 操作 Attention masks直接使用分词器编码句子对 前言 在上一篇文章 《开箱即…

网络工程师的工具箱:这些软件你用过吗?(非常详细)零基础入门到精通,收藏这一篇就够了

今天&#xff0c;我想和大家聊一聊那些能够大大提升工作效率、简化复杂任务的必备软件工具。无论你是刚入行的新手&#xff0c;还是经验丰富的老手&#xff0c;这些工具都是你的工作利器&#xff0c;能够帮助你轻松应对各种网络挑战。 让我们一起来看看这些软件&#xff0c;看…

SSL证书加私钥会影响网速吗?

当谈及SSL证书和私钥对网速的影响时&#xff0c;我们首先需要了解SSL协议的作用和工作原理。SSL证书和私钥是SSL协议的核心组成部分&#xff0c;用于加密数据传输和确保网络安全。在讨论这个问题之前&#xff0c;我们先来简要了解一下SSL协议以及SSL证书和私钥的作用。 SSL协议…

上海市计算机学会竞赛平台2024年1月月赛丙组星号三角阵(三)

题目描述 给定一个整数 &#x1d45b;n&#xff0c;输出一个 &#x1d45b;n 行 &#x1d45b;n 列的星号三角阵&#xff0c;直角位于图形的右上角。 例如当 &#x1d45b;4n4 时&#xff0c;输出 **********输入格式 单个整数表示 &#x1d45b;n。 输出格式 共 &#x…

python-不定方程求解

[题目描述] 给定正整数 a&#xff0c;b&#xff0c;c。求不定方程axbyc 关于未知数 x 和 y 的所有非负整数解组数。输入&#xff1a; 一行&#xff0c;包含三个正整数 a&#xff0c;b&#xff0c;c&#xff0c;两个整数之间用单个空格隔开。每个数均不大于 1000。输出&#xff…

IDEA创建web项目

IDEA创建web项目 第一步&#xff1a;创建一个空项目 第二步&#xff1a;在刚刚创建的项目下创建一个子模块 第三步&#xff1a;在子模块中引入web 创建结果如下&#xff1a; 这里我们需要把这个目录移到main目录下&#xff0c;并改名为webapp&#xff0c;结果如下 将pom文件…

一文读懂HC-05蓝牙模块

在当今通信模式多种多样的情况下&#xff0c;无线传输越来越受到广大开发者的欢迎。其中蓝牙技术更是在现代社会中扮演着至关重要的角色&#xff0c;而其中蓝牙透传模块是目前最简单也是最普遍的一种蓝牙通信模块。HC-05蓝牙模块作为其中一种最常见的蓝牙模块&#xff0c;在各个…

25. 一个双高斯照相物镜的设计

导论&#xff1a; 双高斯照相物镜的设计思想&#xff0c;当β-1时&#xff0c;由于其对称&#xff0c;彗差、畸变和倍率色差自动校正为0&#xff0c;利用中间两块厚透镜可以校正场曲&#xff0c;选取合适的光阑位置可以校正像散&#xff0c;在厚透镜中加胶合面使每个半部校正位…

High Performance Design for HDFS with Byte-Addressability of NVM and RDMA——论文泛读

ICS 2016 Paper 分布式元数据论文阅读笔记整理 问题 非易失性存储器&#xff08;NVM&#xff09;提供字节寻址能力&#xff0c;具有类似DRAM的性能和持久性&#xff0c;提供了为数据密集型应用构建高通量存储系统的机会。HDFS&#xff08;Hadoop分布式文件系统&#xff09;是…