QT:用opencv的KNN识别图片中的LED数字(一)

前言

        一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。

(正在写,未完成,稍候)

效果一预览:

cb6d9c0afc4645ea9f322433c4b0a0f0.png

效果二预览:

dacbd92d102e4278b9777cee374fc5d3.png

效果三预览:

正在写。。。

设计思路

1. 软件UI设计

d209be7b6bb3421599b0fe81d6771231.png

2. 底层思路

    如下图,使用2个gstreamer管道,中间是opencv,最终显示在QT界面上。

    之所以看起来搞这么复杂,是为了以后方便扩展,否则其实不使用gstreamer,光使用opencv即可完成所有功能。以下是一些思路:

 1. opencv主要是图像处理和识别框架,而gstreamer是音视频框架,我们使用OpenCV作为图像处理和识别,使用gstreamer作为输入和输出的接口,使用封装好的类显示在QT上,这样以后可以对接更多格式的媒体数据,以及更简单的处理步骤。

 2. 框架设计了解耦,这样以后,不光可以识别LED,只要把训练资料替换,一样可以识别其他

 3. OpenCV因为功能强大,本次只作为 KNN训练和图像识别使用,以后可以根据需要添加其他

 4. 其中的knn_modle为解耦设计,可以作为其他项目使用,不必使用gstreamer和QT。

8519ce4dd6df42919592e947e2b0a4b2.png

3. opencv识别LED数字的原理

3.1 识别算法选择

        首先,请自行搜索:机器学习 和 深度学习的区别,我也是小白,但是我知道深度学习更加复杂,虽然它的准确度更高一些,但是我时间有限,就先试用机器学习来识别,挑了一个最简单的算法:KNN算法。

        KNN算法识别,需要先训练,然后再识别,在应用中,使用opencv 的 KNearest 即可创建KNN识别模型,只需要训练和识别即可。这个方向,我有demo,还有从别人那里捞过来的图片训练资料,小白也能直接上手使用。

        首先我们先来对一个简单的图片进行识别,以下是识别效果:

87337fb03f6044b4b8089c7639284c68.png

        我之前写过一篇文章,里面有demo 和 代码:

        使用gstreamer和opencv实时识别LED数码管数字的测试demo(QT)-CSDN博客

3.2 识别思路

        以下是我自己总结的思路:

f87abe166ec247afac63145a998964bb.png

       看完上一篇文章,已经可以实现简单图片LED数字的识别,那么可以总结出上述思路。

       于是在原有图片的基础上,修改图片,然后训练和识别,即可完成第一和第7步,而第8步比较简单,目前无需考虑。当然,自己也是需要动手改一下的:在Linux上,我使用的是GIMP画的:

d526799ddff04abb9fb64363804d965f.png

3c97559912ef407f9620d6e0530f1277.png

       然后,既然已经有了训练资料,而且对于比较简单的图片识别效果还行,那么就可以上手实现复杂的图片了。

        但是将复制图片导入,直接使用之前的代码会发现,根本无法识别出来,甚至连框都画不出来,为什么呢,原来,虽然KNN可以根据近似原理识别出结果,但是如果喂给KNN识别的图片本身就不对,那么自然KNN也没有办法识别,所以使用opencv对图片进行处理,也就是第三、四、五、六步,都是非常关键的,这里就需要去简单学习一下opencv了。

        考虑到使用的是QT,而且以后要进行实时识别,所以选择使用C++完成,而不是python完成

4.处理图片---第一次

        首先来看一下,我需要分析的图片:

e4bf66054eae42ad93c594ff463bc6e7.png

4.1 图片初步处理

        如此多的颜色和真实脑壳大,最开始我思考了转灰度图,但是发现根本无法区分颜色,因为红色、黄色、绿灯和散光的颜色是差不多的,于是放弃转灰度图:

e568a991ca254ace9f68abdefcb1bad0.png

        然后我开始使用RGB筛选,但是发现效果依然是不好。

81a71610ecfe4317b8cc88f8d48e7cad.png

        后来我思考到了使用HSV颜色空间的方法,参考文章:

三分钟带你快速学习RGB、HSV和HSL颜色空间 - 知乎 (zhihu.com)

ad54d259b0894c989dbedcf369c76e5c.png

        使用HSV进行区分的效果,可以看到,效果好了很多:

59ce2c5585e64e109b365f2cf745cb57.png

        但是此处,使用轮廓识别和KNN,依然是无法识别。

        而且,这里的HSV的上下限,一共6个数字,一个个实验,非常头疼,于是我自己写了一个demo:

4.2 测试demo进行HSV测试:

main.cpp源码:

#include <opencv2/opencv.hpp>cv::Mat mt; // 原图像
cv::Mat image_bin; // 二值化后的图像// 回调函数,用于更新图像
void updateImage(int, void*) {cv::Mat hsvImage;cv::cvtColor(mt, hsvImage, cv::COLOR_BGR2HSV);// 获取滑动条的参数值int hMin = cv::getTrackbarPos("Hue Min", "Trackbars");int sMin = cv::getTrackbarPos("Saturation Min", "Trackbars");int vMin = cv::getTrackbarPos("Value Min", "Trackbars");int hMax = cv::getTrackbarPos("Hue Max", "Trackbars");int sMax = cv::getTrackbarPos("Saturation Max", "Trackbars");int vMax = cv::getTrackbarPos("Value Max", "Trackbars");// 根据滑动条的参数值进行颜色范围选择cv::Scalar lower(hMin, sMin, vMin);cv::Scalar upper(hMax, sMax, vMax);cv::inRange(hsvImage, lower, upper, image_bin);// 显示二值化图像cv::resize(image_bin,image_bin,cv::Size(640,480));cv::imshow("Red Area", image_bin);
}int main() {mt = cv::imread("/home/enpht/Pictures/ocr_jpg/test4.jpg");cv::Mat orin;cv::resize(mt, orin, cv::Size(640, 480));cv::imshow("orin",orin);if (mt.empty()) {std::cerr << "Error loading image!" << std::endl;return 1;}cv::namedWindow("Trackbars"); // 创建窗口用于显示滑动条int hMin = 105;int sMin = 38;int vMin = 176;int hMax = 255;int sMax = 230;int vMax = 255;cv::createTrackbar("Hue Min", "Trackbars", &hMin, 255, updateImage);cv::createTrackbar("Saturation Min", "Trackbars", &sMin, 255, updateImage);cv::createTrackbar("Value Min", "Trackbars", &vMin, 255, updateImage);cv::createTrackbar("Hue Max", "Trackbars", &hMax, 255, updateImage);cv::createTrackbar("Saturation Max", "Trackbars", &sMax, 255, updateImage);cv::createTrackbar("Value Max", "Trackbars", &vMax, 255, updateImage);// 初始时更新一次图像updateImage(0, 0);cv::waitKey(0);return 0;
}

        效果:加入6个滑动槽,进行HSV上下限的改变,并且实时查看效果,这里我换了一副图,忘了换回来了,不过效果类似的:

696847f015f84dac88d26e21f9ed5353.gif

        从这里,我们可以自行实验出HSV的上下限的6个数值。

4.3 搭建QT项目

        如下所示,我搭建了一个测试项目:

e5766ae440854ec7bd35ece0769259fc.png

knnModel.h 

#ifndef KNNMODEL_H
#define KNNMODEL_H// 此处部分代码参考其他文章// knn:
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include 

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

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

相关文章

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么&#xff1f;堆都能用树表示&#xff0c;并且一般树的实现都是利用链表。平时使用的最多的是二叉堆&#xff0c;它可以用完全二叉树表示&#xff0c;二叉堆易于存储&#xff0c;并且便于索引。在堆的实现时注意&#xff1a;因为是数组&#xff0c;所以父子节点的关系就…

Palworld幻兽帕鲁管理员操作手册

Palworld幻兽帕鲁管理员操作手册 大家好我是艾西&#xff0c;在我们搭建完幻兽帕鲁服务器后肯定会涉及到后期的维护比如&#xff1a;角色修改&#xff0c;帕鲁修改&#xff0c;异常删除&#xff0c;公会修改&#xff0c;清理玩家&#xff0c;清理建筑&#xff0c;存档迁移等数…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

脚手架cli快速创建Vue2/Vue3项目

前言&#xff1a; 本文的nodejs版本是14.21.3 第一步 进入cmd窗口 1、全局安装webpack npm install webpack-g&#xff0c; npm install webpack-g 第二步 2、全局安装vue脚手架 npm install -g vue/cli 第三步 3、初始化vue项目 &#xff08;vue脚手架使用webpack模…

ArcGIS学习(十五)用地适宜性评价

ArcGIS学习(十五)用地适宜性评价 本任务给大家带来的内容是用地适宜性评价。 用地适宜性评价是大家在平时工作中最常接触到的分析场景之一。尤其是在国土空间规划的大背景下,用地适宜性评价变得越来越重要。 此外,我们之前的任务主要是使用矢量数据进行分析。本案例是主讲…

多线程(volatile)

volatile的功能 保证内存可见性禁止指令重排序 内存可见性 简单的理解 两(多)个线程同时针对一个变量进行操作, 一个线程读, 一个线程修改, 此时读到的值不一定是修改过后的值 即读线程没有感知到变量的变化 (其实是 编译器/JVM 对于代码在多线程情况下的优化进行了误判) 从 J…

Vue3 + antv/x6 实现流程图

新建流程图 // AddDag.vue <template><div class"content-main"><div class"tool-container"><div click"undo" class"command" title"后退"><Icon icon"ant-design:undo-outlined" /…

初识Python语言-课堂练习【pyhton123题库】

初识Python语言-课堂练习【pyhton123题库】 一、单项选择题 1、Guido van Rossum正式对外发布Python版本的年份是&#xff1a; A 2008B 1998C 1991D 2002 【答案】C 【解析】暂无解析2、下面不是Python语言特点的是&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪…

无需编程技能:Python爬虫与数据可视化毕业论文代写服务

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺的认可。我的专业知识涵盖了从前端界面设…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行&#xff0c;然后切换到Release模式下&#xff0c;也正常运行&#xff0c;把第三方平台的dll拷贝到exe所在…

honle电源维修UV电源控制器维修EVG EPS60

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

React组件(函数式组件,类式组件)

函数式组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>React Demo</title> <!-- 引…

基于FPGA加速的bird-oid object算法实现

导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——基于FPGA加速的bird-oid object算法实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 模型说明 Bird-oid object …

镭雕机:如何利用激光技术实现高质量的产品标记

镭雕机是一种利用激光技术实现高质量产品标记的设备。它通过激光束在各种不同的物质表面进行精确的打标&#xff0c;可以产生永久性的标记效果&#xff0c;这些标记不仅精美&#xff0c;而且具有高度的精度和清晰度。以下是镭雕机如何利用激光技术实现高质量产品标记的详细过程…

寄存器(内存访问)

文章目录 寄存器&#xff08;内存访问&#xff09;1 内存中字的存储2 DS和[address]3 字的传送4 mov、add、sub指令5 数据段6 栈7 CPU提供的栈机制8 栈顶超界的问题9 push、pop指令10 栈段 寄存器&#xff08;内存访问&#xff09; 1 内存中字的存储 CPU中&#xff0c;用16位寄…

Spring Cloud Gateway如何实现熔断

Spring Cloud Gateway熔断集成 熔断应用&#xff1a; 金融市场中的熔断机制&#xff1a;在金融交易系统中&#xff0c;熔断机制&#xff08;Circuit Breaker&#xff09;是一种市场保护措施&#xff0c;旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数&#xff08…

基于Ambari搭建大数据分析平台

一、部署工具简介 1. Hadoop生态系统 Hadoop big data ecosystem in Apache stack 2. Hadoop的发行版本 Hadoop的发行版除了Apache的开源版本之外&#xff0c;国外比较流行的还有&#xff1a;Cloudera发行版(CDH)、Hortonworks发行版&#xff08;HDP&#xff09;、MapR等&am…

【网络安全】-数字证书

数字证书 数字证书是互联网通讯中用于标志通讯各方身份信息的一串数字或数据&#xff0c;它为网络应用提供了一种验证通信实体身份的方式。具体来说&#xff0c;数字证书是由权威的证书授权&#xff08;CA&#xff09;中心签发的&#xff0c;包含公开密钥拥有者信息以及公开密…

linux中将终端Terminal添加到任务栏

问题描述 如题&#xff0c;默认的任务栏中没有终端这一组件&#xff0c;因此&#xff0c;想要打开终端&#xff0c;需要先切换到桌面&#xff0c;影响了使用体验。 解决方法 1.在applications里找到Terminal Emulator。 2.将Terminal Emulator拖动到任务栏&#xff0c;即可…

【完美实现】VITE + VUE3 + SVG图片解析+element-plus开发环境初始化(基于macos)

一、最终效果 废话少说&#xff0c;直接上效果 这是我的初始化程序提供的页面&#xff0c;在这个页面上实现了一下几个功能&#xff1a; 1、vite初始化之后的路由安装和初始化&#xff1b; 2、标准SVG的解析&#xff0c;并可调整大小、颜色&#xff1b; 3、element-plus的安…