OpenCV中利用knn进行数字(0-9)识别--RGB-D相机采集

2023-11-01

目录

前言

一、KNN原理

二、数字识别系统效果演示

三、数字识别系统

1.图像采集

 2.阈值分割--(定位数字区域)

 3.轮廓特征分析--(定位数字区域)

 4.数字轮廓提取

 5.扩充边界并归一化其尺寸

6.训练数据集并预测测试样本

总结


前言

本章使用一个基于 MINIST 的小型数据集通过OpenCV中的 KNN 方法进行从0到9数字识别,由于数据集小,不能完全识别正确,经测试其识别正确率能达到 90%以上。这数字识别系统基本完成,但其适应性还有所欠缺,比如任意角度书写数字情况也能够高正确率识别。由于笔者能力局限,再加上参与(海南)疫情抗战 导致时间仓促,特此提供本系统的所有工程代码,详细说明步骤,让大家继续深入开发,共同进步。


一、KNN原理

        KNN(K-NearestNeighbor)的任务就是在训练本集中,依据距离测度找到与测试样本最相似的K个训练样本,对于分类问题,大多采用“多数表决”的方式确定测试样本的最终分类,即在这K个训练样本中,属于那个类别的样本数最多,测试样本就属于那个类。
        我们常说:“物以类聚,人以群分”。相似的东西我们就归为一类,人的一生有三个阶段,幼年、成年、老年。通过年龄大小的进行分类,比如我们现在要判断一个人处于说明阶段,就要通过其年龄大小进行分类。KNN原理可以这样通俗理解。


二、数字识别系统效果演示

        本系统任务是在一个普通的环境下找出数字区域并识别出数字。本系统是在学习桌面上进行演示系统的效果,其效果图如图所示。


三、数字识别系统

1.图像采集

        本系统使用海康的MV-EB435i悉灵相机,其图像采集效果通过GIF图演示。其性能强大,且轻盈便携。

 2.阈值分割--(定位数字区域)

        由于我们在一个普通环境下,并非是复杂环境下进行定位,为此定位方法也简单,笔者采用阈值分割进行图像分析,将前景与背景区分开。在阈值分割方法中,其最常用的方法是大津法分割,其效果是较理想的,当然,其方法也不是万能的,你也知道,没有一种方法是万能的,只有较好的。

        大津法(OTSU)是一种自动选择阈值(无参数且无监督)的的图像分割方法,日本学者 Nobuyuki Otsu 1979年提出。该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。

        算法原理:①.首先假设阈值为 K(0-255),然后根据K值将灰度图分为两部分,前景与背景。

                          ②.计算前景与背景占整幅图的比例。P前景 与 P背景。其之和为1。

                          ③.算出属于前景/背景/全景中均值(灰度值),M前景、M背景与M全景。 

                          ④.根据Otsu的算法原理,求类间方差。

                          ⑤.从0-255遍历K,计算每个K对应的间类方差,最大方差对应的K值即为阈值。

代码如下(示例):

    //大津法二值化
    namedWindow("binary", 0);
    resizeWindow("binary", 640, 360);
    Mat binary;
    threshold(grayImg,binary,0,255,THRESH_OTSU);
    imshow("binary",binary);

        通过使用大津法对采集的灰度图像进行阈值分割,其效果图如下。

 3.轮廓特征分析--(定位数字区域)

        前面将采集的图像进行二值化,我们要通过OpenCV中findContours函数进行轮廓分析,通过轮廓特征(面积,长宽比等特征)提取最大轮廓(我们假定最大轮廓包含数字)并在原图中做出标记与提取。笔者对最大轮廓进行最小外接正/斜矩形。

        其效果如下图所示:

 4.数字轮廓提取

       对最大轮廓的外接斜矩形(原图中的蓝色矩形)进行灰度值翻转操作即可。代码实现思路是遍历最小外接正矩形内区域所有点(原图中的红色区域)判断点是否为外接斜矩形区域,如果属于且该点的灰度值为 0 即为数字轮廓的点。将其灰度值翻转为255即可。

        其效果如图所示:

 5.扩充边界并归一化其尺寸

        由于我们的训练数据集中采用归一化尺寸,对测试样本也要进行归一化。其尺寸统一归一化为20像素*20像素,其归一化后效果如图所示。

6.训练数据集并预测测试样本

        本文使用的小型数据集是从MINST中随机挑选出数字0-9的图片各500张,每张图片按比例缩小为20像素*20像素,然后将这5000张图片拼成一张整图,MINIST数据集如图所示。

        对这些样本作为训练集,创建并初始化KNN模型,训练分割好的训练集,然后将前面我们已经提取处理的数字区域作为测试样本进行测试,获取其预测结果,将其标注在原图中。其效果如图所示。


总结

        以上就是本系统采用的方案,本系统充其量为小儿科水平,其局限性较大,比如我们要解决在任意角度下也能够高正确识别出数字。因为一个企业级项目考虑条件是非常复杂的,我深知自己的能力不足,欠缺考虑复杂条件,所以让我们共同学习,共同进步。本系统所有代码待笔者整理好再分享给大家,就这样了,抗击疫情去了(海南),2022/8/22  21:10,海南加油,新盈加油。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV中利用knn进行数字(0-9)识别--RGB-D相机采集 的相关文章

  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • Python OpenCV视频格式在浏览器中播放

    我正在尝试从一系列图像创建视频并将其显示在浏览器中 但由于某些奇怪的原因 无论我使用什么编解码器或文件格式 我都会收到以下错误 找不到格式和 MIME 类型受支持的视频 这是我的代码 ready images import cv2 for
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • OpenCV 中更新窗口的 waitKey() 的替代方法

    到目前为止我见过的所有示例和书籍都建议使用 waitKey 1 来强制重新绘制 OpenCV 窗口 这看起来很奇怪而且太老套了 不必要的时候为什么还要等待 1 毫秒呢 还有其他选择吗 我尝试了 cv updateWindow 但它似乎需要
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 如何使用 python cv2 api 将 xy 点格式化为 unactorPoints?

    我在格式化要传递给 unactorPoints 的 x y 点列表时遇到问题 opencv 2 4 1 该错误消息是 C 特定的 并抱怨点数组不是 CV 32FC2 类型 我不应该能够传入 Nx2 numpy 数组吗 import cv2
  • 使用 openCV 锐化视频图像

    我想使用 OpenCV 锐化我的图像 我在网上查看了一个示例 该示例正在对灰度图像执行锐化 我尝试了它 它工作得很好 然而 我现在尝试做同样的事情 但使用 RGB 颜色 所以我分别在三个通道上执行相同的功能 但它没有给我任何结果 图像与原始
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 如何在 CMake Makefile 中包含 OpenCV 库

    我希望你可以帮助我 我有一个简单的 CMakeLists txt 以便在 Leopard 10 5 8 上构建我的项目 我正在使用 CMake 2 8 1 目前这是代码 cmake minimum required VERSION 2 8
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • OpenCV:使用 StereoCamera 系统对颜色标记进行 3D 姿态估计

    我有一个立体摄像系统并使用两者正确校准它 cv calibrateCamera and cv stereoCalibrate My reprojection error似乎没问题 凸轮0 0 401427 凸轮1 0 388200 立体声
  • 如何获得垂直线穿过的完整内轴线?

    我有一个图像 我想获取穿过其中轴的像素 我尝试使用骨架化 and 中轴方法来获取它们 但这两种方法都返回比相应对象短的一维线 这是带有示例图像的代码 gt gt gt import skimage filter gt gt gt impor
  • OpenCV,捕获的视频比原始相机视频运行得更快!

    我正在使用 openCV 从相机捕获视频并将其存储到 avi 文件 问题是当我完成捕获并运行 avi 文件时 视频流看起来速度很快 这是代码 void main CvCapture capture cvCaptureFromCAM 0 in
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans

随机推荐

  • centos6安装python2.7

    下载python安装包 1 wget https www python org ftp python 2 7 12 Python 2 7 12 tgz 2 tar zxvf Pyhon 2 7 12 tgz 3 cd Python 2 7
  • 创建src目录

    在一个功能包里单独创建src目录可以先进入这个功能包 然后使用命令 mkdir src 然后使用命令 ls 发现功能包里有了src 还有一种就是在要创建的目录名前面加上路径名 则会在指定的路径名下创建的src 同时要确保这个路径下没有要创建
  • js 去除字符串首尾指定字符

    abc trim abc 这是去除首尾空格的办法 那么有没办法去除首尾指定的字符 肯定有 方法很多 下面通过正则表达式实现 例如 我想去掉首尾逗号 let str abc cde fff str str replace s s g 结果 a
  • ESP32S3学习——i2c,点亮0.96寸oled

    芯片 esp32s3 开发环境 espidfv4 4 一 官网相关资料 哎嘿嘿 中文的I2C 驱动程序 ESP32 S3 ESP IDF 编程指南 v4 4 2 文档 1 概述 ESP32 S3 有两个 I2C 控制器 也称为端口 负责处理
  • 使用CFimagehost源码搭建免费的PHP图片托管私人图床,无需数据库支持

    文章目录 1 前言 2 CFImagehost网站搭建 2 1 CFImagehost下载和安装 2 2 CFImagehost网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道 3 2 Cpol
  • 【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】驱动移植

    一 环境介绍 RK3588主板搭载Android12操作系统 内核是Linux5 10 使用ST的六轴传感器LSM6DSR芯片 二 芯片介绍 LSM6DSR是一款加速度和角速度 陀螺仪 六轴传感器 还内置了一个温度传感器 该芯片可以选择I2
  • SAP 账号人员信息

    视图USER ADDR 转载于 https www cnblogs com CtrlS p 10482779 html
  • Python中的网络通信

    概述 在我们平时生活工作中 常常会接触到网络通信的内容 不管你是普通的用户 还是通信行业内的开发人员 都无法避免与网络通信打交道 我在初步学习python的过程中 对python的网络通信问题做了总结 所以写下这篇文章作为记录 也希望能给其
  • JVM 内存分析工具 - MAT

    文章目录 1 简介 2 使用 2 1 准备 MAT 2 2 准备堆转储文件 Heap Dump 2 3 分析堆转储文件 2 3 1 Histogram 2 3 2 Leak Suspects 2 3 3 内存快照对比 MAT Memory
  • python span函数_如何使用python selenium单击span元素

    我不知道还有没有其他的元素 您可以使用css选择器选择范围 driver find element by css selector span click 我认为这是你代码中唯一的跨度标记 可能不是 作为一个非常 散弹枪 的解决方案 您可以单
  • 秒杀系统的设计和思考

    秒杀系统的难点 首先我们先看下秒杀场景的难点到底在哪 在秒杀场景中最大的问题在于容易产生大并发请求 产生超卖现象和性能问题 下面我们分别分析下下面这三个问题 1 瞬时大并发 一提到秒杀系统给人最深刻的印象是超大的瞬时并发 这时你可以联想到小
  • 【面试题】面试问红黑树,我脸都绿了。。

    https mp weixin qq com s biz MzI3ODcxMzQzMw mid 2247491467 idx 2 sn 1eb11dbfb7b72fdcf0360e06448c4cfc chksm eb539abddc241
  • 如何解决:Mac 进不去JetBrains官网 Mac 打不开 idea/webstorm/PyCharm官方网站

    问题需求 Mac 进不去 Idea Webstorm PyCharm 官网 即JetBrains官方网站 只要进入 www jetbrains com 就提示 Safari Can t Connect to the Server 即 Saf
  • NEON简单介绍

    ARM Advanced SIMD nick named NEON it provides 1 A set of interesting scalar vectorinstructions and registers the latter
  • Mysql8官方分布式数据库MGR最佳实践

    MGR简介 MGR是mysql Group Replication简称 中文名称是Mysql组复制 MGR是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案 提供了高可用 高扩展 高可靠的MySQL集群服务 目前只支
  • flutter 圆角裁剪

    需求 高宽 为40 圆角度20 1 先实现高宽40方形 创建 Container 设置 width 40 height 40 如果需要颜色 自行在 color设置 2 设置圆角度 使用Physicalmodel方式 需要设置 color b
  • Python日期格式处理

    数据分析工作中 Python和SQL是常用的两大工具 常见的数据类型有数值型 字符串型 日期型等 对日期型格式进行处理也是比较常见的情形 文章SQL中日期格式处理记录了SQL针对日期型字段的处理过程 本文记录Python对日期型数据的处理
  • Linux 下创建新用户并且添加为root组用户

    1 创建用户及设置密码 创建用户名 useradd test 设置密码 passwd test 输入两次密码 test 2 给新用户授root权限 1 chmod v u w etc sudoers 增加 sudoers 文件的写的权限 默
  • 有关StandardScaler的transform和fit_transform方法

    背景 StandardScaler类是一个用来讲数据进行归一化和标准化的类 所谓归一化和标准化 即应用下列公式 使得新的X数据集方差为1 均值为0 问题一 StandardScaler类中transform和fit transform方法有
  • OpenCV中利用knn进行数字(0-9)识别--RGB-D相机采集

    目录 前言 一 KNN原理 二 数字识别系统效果演示 三 数字识别系统 1 图像采集 2 阈值分割 定位数字区域 3 轮廓特征分析 定位数字区域 4 数字轮廓提取 5 扩充边界并归一化其尺寸 6 训练数据集并预测测试样本 总结 前言 本章使