(含代码)使用Python实现基于OpenCV的数字识别系统


综述

2012年iOS应用商店中发布了一个名为FuelMate的Gas跟踪应用。小伙伴们可以使用该应用程序跟踪汽油行驶里程,以及有一些有趣的功能,例如Apple Watch应用程序、vin.li集成以及基于趋势mpg的视觉效果。

燃料伴侣

对此我们有一个新想法,该如何添加一个功能帮助我们在泵中扫描燃油,并在应用程序中输入燃油信息?让我们深入研究如何实现这一目标。


代码资料获取

代码链接:https://github.com/kazmiekr/GasPumpOCR

除了本项目,我还整理了30+CV实战项目,以及OpenCV学习资料包,还有计算机视觉入门到实战+800G人工智能资源,全都无偿分享给大家

需要的兄弟可以按照这个图的方式免费获取


技术

对于这个项目的我们首先应该编写一个简单的Python应用程序以拍摄汽油泵的图像,然后尝试从中读取数字。OpenCV是用于计算机视觉应用程序的流行的跨平台库。它包括各种图像处理实用程序以及某些机器学习功能。除此之外我们希望可以先使用Python对其进行原型设计,然后将处理代码转换为C ++以在iOS应用程序上运行。


目标

我们首先要考虑以下两个问题:

1.我们可以从图像中分离出数字吗?

2.我们可以确定图像代表哪个数字吗?


数字分割

如何确定图像中的数字有多种方法,但是我提出了使用简单的图像阈值法来尝试查找数字的方法。

图像阈值化的基本思想是将图像转换为灰度,然后说灰度值小于某个常数的任何像素,则该像素为一个值,否则为另一个。最后,您得到的二进制图像只有两种颜色,在大多数情况下只是黑白图像。

这个概念在OCR应用中非常有效,但是主要问题是决定对该阈值使用什么。我们可以选择一些常量,也可以使用OpenCV选择其他一些选项。我们可以使用自适应阈值而不是使用常数,这将使用图像的较小部分并确定要使用的不同阈值。这在具有不同照明情况的应用中特别有用,特别是在扫描气泵中。

将图像设置为阈值后,可以使用OpenCV的findContours方法查找图像中连接了白色像素部分的区域。绘制轮廓后,便可以裁剪出这些区域并确定它们是否可能是数字以及它是什么数字。

基本图像处理流程

这是我在测试图像处理中使用的原始图像。它有一些眩光点,但是图像相当干净。让我们逐步完成获取此源图像的过程,并尝试将其分解为单个数字。

原始图片


影像准备

在开始图像处理流程之前,我们决定先调整一些图像属性,然后再继续。这有点试验和错误,但注意到,当我们调整图像的曝光度时,可以获得更好的结果。下面是使用Python调整后的图像,相当于曝光(阿尔法)的图像cv::Mat::convertTo这是刚刚在图像垫乘法操作cv2.multiply(some_img, np.array([some_alpha]),

调整曝光

灰阶

将图像转换为灰度。

转换为灰度

模糊

模糊图像以减少噪点。我们尝试了许多不同的模糊选项,但仅用轻微的模糊就找到了最佳结果。

稍微模糊

阈值图像转换为黑白图像

在下图中,使用cv2.adaptiveThreshold带有cv2.ADAPTIVE_THRES_GAUSSIAN_C选项的方法。此方法采用两个参数,块大小和要调整的常数。确定这两者需要一些试验和错误,更多有关优化部分的内容。

阈值为黑/白

填补空白

由于大多数燃油泵都使用某种7段LCD显示屏,因此数字中存在一些细微的间隙,无法使用轮廓绘制方法,因此我们需要使这些段看起来相连。在这种情况下,我们将转到erode图像来弥补这些差距。由于大家可能希望使用,所以这似乎向后看,dilate但是这些方法通常适用于图像的白色部分。在我们的案例中,我们正在“侵蚀”白色背景以使数字看起来更大。

侵蚀出来的数字

反转图像

在尝试在图像中查找轮廓之前,我们需要反转颜色,因为该findContours方法将找到白色的连接部分,而当前的数字是黑色。

颜色反转

在图像上找到轮廓

下图显示了我们的原始图像,该图像在上图的每个轮廓上都有包围框。大家可以看到它找到了数字,但也找到了一堆不是数字的东西,因此我们需要将它们过滤掉。

红色框显示所有找到的轮廓

轮廓过滤

1.现在我们有了许多轮廓,我们需要找出我们关心的轮廓。浏览了一堆气泵的显示和场景后,使用一套适用于轮廓的快速规则。

2.收集所有我们将分类为潜在小数的正方形轮廓。

3.扔掉任何不是正方形或高矩形的东西。

4.使轮廓与某些长宽比匹配。LCD显示屏中的十个数字中有九个数字的长宽比类似于下面的蓝色框高光之一。该规则的例外是数字“ 1”,其长宽比略有不同。通过使用一些样本轮廓,我将0–9!1方面确定为0.6,将1方面确定为0.3。它将使用这些比率和+/-缓冲区来确定轮廓是否是我们想要的东西,并收集这些轮廓。

5.对潜在数字应用一组附加规则,在这里我们将确定轮廓边界是否偏离所有其他潜在数字的平均高度或垂直位置。由于数字的大小应相同,并且在相同的Y上对齐,因此我们可以丢弃它认为是数字的任何轮廓,但不能像其他轮廓那样将其对齐和调整大小。

蓝色矩形显示我们的数字/十进制,红色被忽略

预测

有两个等高线轮廓,一个带潜在位数,一个带潜在小数位,我们可以使用这些轮廓边界裁剪图像,并将其输入经过训练的系统中以预测其值。有关此过程的更多信息,请参见“数字培训”部分。

查找小数

在图像中查找小数点是要解决的另一个问题。由于它很小,有时会连接到它旁边的手指,因此使用我们在手指上使用的方法来确定它似乎有问题。当我们过滤轮廓时,我们收集了可能是十进制的正方形轮廓。从上一步获得经过验证的数字轮廓之后,我们将找到数字的最左x位置和最右x位置,以确定我们期望的小数位数。然后,我们将遍历那些潜在的小数,确定它是否在该空间以及该空间的下半部分,并将其分类为小数。找到小数点后,我们可以将其插入到我们上面预测的数字字符串中。

只在黄色部分中查找小数

数字训练

在机器学习的世界中,解决OCR问题是一个分类问题。我们建立了一组训练有素的数据,例如图像处理中的数字,将它们分类为某种东西,然后使用该数据来匹配任何新图像。一旦基本的图像隔离功能开始工作,我就创建了一个脚本,该脚本可以遍历图像文件夹,运行数字隔离代码,然后将裁剪的数字保存到新文件夹中供我查看。运行完之后,我会有一个未经训练的数字文件夹,然后可以用来训练系统。

由于OpenCV已经包含了k近邻(k-NN)实现,因此无需引入任何其他库。为了进行训练,我们浏览了数字作物的文件夹,然后将其放入标有0–9的新文件夹中,因此每个文件夹中都有一个数字的不同版本的集合。我们没有大量的这些图像,但是有足够的证据来证明这是可行的。由于这些数字是相当标准的,我认为我不需要大量训练有素的图像就可以相当准确。

k-NN工作原理的基础是,我们将以黑白方式加载每个图像,将该图像存储在每个像素处于打开或关闭状态的数组中,然后将这些打开/关闭像素与特定的数字相关联。然后,当我们要预测一个新图像时,它将找出哪个训练图像与这些像素最匹配,然后向我们返回最接近的值。

整理好数字后,将创建一个新的脚本,该脚本将遍历这些文件夹,获取每个图像并将该图像与数字关联。到目前为止,在大多数代码中,一般的图像处理概念在Python和C ++中都应用相同,但是在这里会有细微的差别。

在大多数此类应用程序的Python示例中,分类被写入两个文件,一个包含分类,另一个包含该分类的图像内容。通常使用NumPy和标准文本文件完成此操作。但是,由于我想在iOS应用程序上重用该系统,因此我需要想出一种可以拥有跨平台分类文件的方式。当时,我什么都找不到,因此最终编写了一个快速实用程序,该实用程序将从Python中获取分类数据并将其序列化为JSON文件,我可以在OpenCV的FileStorage系统的C ++端使用它。这不漂亮,但是我写了一个简单的MatPython中的序列化方法,它将为OpenCV创建合适的结构以在iOS端读取。现在,当我训练数字时,我将获得NumPy文件供我的Python测试使用,然后获取一个JSON文档,我可以将其拖到我的iOS应用程序中。您可以在此处看到该代码。


优化

一旦确定了数字隔离和预测的两个目标,就需要对算法进行优化,以预测泵的新图像上的数字。

在优化的初始阶段,创建了一个简单的Playground应用程序,其中使用了OpenCV提供的一些简单的UI组件。使用这些组件,可以创建一些简单的轨迹栏,以左右滑动并更改不同的值并重新处理图像。围绕该cv2.imshow方法创建了一个小包装程序,该方法可以平铺显示的窗口,因为我讨厌总是重新放置它们,

尝试不同的变量

我们可以加载不同的图像,并在图像处理中尝试变量的不同变化,并确定最佳的组合。


自动化

在每个图像上测试不同的变量是上手的好方法,但是我们想要一种更好的方法来验证是否更改了一个图像的变量是否会对其他任何图像产生影响。为此,我们想出了针对这些图像进行一些自动化测试的系统。

我拍摄了每个测试图像,并将它们放在文件夹中。然后,我用图像中期望的数字来命名每个文件,并用小数点“ A”表示。应用程序可以加载该目录中的每个图像并预测数字,然后将其与文件名中的数字进行比较以确定是否匹配。这使我们可以针对所有不同的图像快速尝试更改。

自动测试输出

更进一步,我创建了此脚本的不同版本,该脚本将尝试对这组图像进行模糊,阈值等变量的几乎每种组合,并找出最优化的变量集将具有最佳的性能。准确性。该脚本在计算机上花费了相当长的时间才能运行,大约需要7个小时,但是最后提出了一组不同的变量,这些变量在我们手动测试时找不到。


结论

这是否是任何人实际上都会使用的功能尚待确定,但这在实现某些机器学习概念和使用OpenCV方面是一个有趣的练习。到目前为止,在我们的测试中,应用程序最大的问题是泵显示屏上的眩光。根据泵上的照明和手机的角度,可能会导致某些扫描失效。

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

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

相关文章

WPF 截图控件(十):马赛克效果

WPF 截图控件(十):马赛克效果标 题:WPF 截图控件(十):马赛克效果作 者:WPFDevelopersOrg - 驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers码云…

深度剖析智能小车PCB板原理图的最小系统构建

智能小车最小系统设计:从原理图到稳定运行的实战指南 你有没有遇到过这样的情况?PCB板焊好了,电源灯亮了,下载器也连上了——但MCU就是不跑代码,或者跑着跑着突然复位?更糟的是,传感器数据飘忽不…

如何在Windows上实现专业级虚拟手柄控制:ViGEmBus终极使用指南

如何在Windows上实现专业级虚拟手柄控制:ViGEmBus终极使用指南 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 你是否曾经梦想过让任何输入设备都变成专业的游戏手柄?现在,这个梦想通过ViGEmBus虚…

Joy-Con Toolkit终极指南:3步快速上手,解锁手柄全部隐藏功能

Joy-Con Toolkit终极指南:3步快速上手,解锁手柄全部隐藏功能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Switch手柄设计的开源控制工具,通…

专业文章仿写Prompt

专业文章仿写Prompt 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 仿写核心要求 原创性保证: 新文章与原文结构相似度必须低于30%完全重构段落组…

小程序开发中的JS和Go的对比及用途

JS 只能写业务逻辑,Go 能写‘整个后端’——高并发、低延迟、重 I/O、轻内存,微信小程序要‘秒开秒回’,Go 就是目前最优解。一、JS 只能写“业务”,不能写“整个后端”维度Node.js(JS)Go高并发单线程事件循…

ViGEmBus虚拟手柄驱动:Windows游戏输入设备兼容性终极解决方案

ViGEmBus虚拟手柄驱动:Windows游戏输入设备兼容性终极解决方案 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 还在为Windows系统游戏手柄兼容性问题而烦恼吗?ViGEmBus虚拟游戏控制器驱动技术正是你需要的完…

互联网大厂Java面试场景实战剧本:Spring Boot、微服务与云原生技术全解

互联网大厂Java面试场景实战剧本:Spring Boot、微服务与云原生技术全解场景设定: 互联网大厂二面大厅,面试官(冷峻深沉)与著名“水货”求职程序员谢飞机同台飙戏!第一轮(基础原理&电商场景&…

ms-swift支持多节点日志聚合分析训练异常问题

ms-swift 多节点日志聚合与训练异常分析实践 在大模型训练日益复杂的今天,一个看似简单的“训练中断”问题,背后可能隐藏着数百个GPU节点中某个rank的显存溢出、某条通信链路的短暂拥塞,或是数据预处理中的边缘异常。当团队投入数十甚至上百张…

python基于django的问卷调查管理系统_xvc14u58

目录基于Django的问卷调查管理系统概述核心功能模块技术实现细节安全与性能优化应用场景与扩展性关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Django的问卷调查管理系统概述 …

通过FastStone Capture注释功能标注模型错误案例

通过FastStone Capture注释功能标注模型错误案例 在大模型研发进入深水区的今天,一个普遍被忽视的事实是:训练出一个能“跑通流程”的模型并不难,真正困难的是让这个模型在真实场景中稳定、可靠、可解释地输出预期结果。随着 Qwen、Llama、In…

python基于django的闲置资产租赁管理系统_102rj4g8

目录闲置资产租赁管理系统概述系统核心功能技术实现特点应用场景与优势关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!闲置资产租赁管理系统概述 该系统基于Python的Django框架开发…

C# 基于OpenCv的视觉工作流-章6-腐蚀

C# 基于OpenCv的视觉工作流-章6-腐蚀 本章目标: 一、卷积计算原理; 二、获取卷积核; 三、腐蚀;一、卷积计算原理; 卷积计算原理,如下图所示: 1、先定义卷积核(3x3、5x5、7x7等&#…

完全掌握游戏翻译神器:XUnity Auto Translator深度使用手册

完全掌握游戏翻译神器:XUnity Auto Translator深度使用手册 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity Auto Translator是一款革命性的Unity游戏自动翻译插件,能够将外…

使用C#调用ms-swift提供的RESTful API接口服务

使用C#调用ms-swift提供的RESTful API接口服务 在企业智能化转型的浪潮中,越来越多的传统业务系统面临一个共同挑战:如何在不重构现有技术栈的前提下,快速集成大模型能力?尤其是在金融、政务、制造等领域,大量核心系统…

关于转行网络安全的一些建议

目录1.网络安全行业概况2.行业两极分化现象转行群体分析3.网络安全学习路径入门学习建议学习资料分享行业误解澄清4.就业情况面对转行的建议结语在当前就业形势下,不少朋友面临转行的困境。网络安全作为一个热门领域,自然也吸引了许多人的目光。本文将就…

python基于django的图书馆座位预约微信小程序系统_7mg5c898

目录系统概述技术架构核心功能创新点应用效果关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 该系统是一个基于Django框架开发的图书馆座位预约微信小程序,旨在…

[数字信号处理-入门] 频域分析

[数字信号处理-入门] 频域分析 个人导航 知乎:https://www.zhihu.com/people/byzh_rc CSDN:https://blog.csdn.net/qq_54636039 注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码 参考文章:各…

使用MyBatisPlus管理ms-swift后台数据库持久层

使用 MyBatisPlus 管理 ms-swift 后台数据库持久层 在 AI 工程化落地日益深入的今天,一个高效的训练与部署框架不仅要能跑通模型,更要能管好数据。魔搭社区推出的 ms-swift 框架,正是为了解决从模型微调、对齐、推理到部署的全链路问题而生。…

C++ istringstream

1. istringstream是什么 2. 它的 “规则” 是什么? 3. 什么能分割,什么不能分割? 4. 基本用法:按空白符分割 5. 实践练习 6. 学习要点总结 一. istringstream是什么istringstream:字符串的流式读取器(简明扼…