当前位置: 首页 > news >正文

【降龙算法】基于QT插件机制实现一个机器视觉算法小框架

机器视觉行业有各种各样的拖拉拽框架,也叫做低代码平台,例如国内海康的VisionMaster:
在这里插入图片描述
一个机器视觉框架需要包含各种算法模块,日志窗口,图像显示窗口等等,【降龙算法】就是做了一个入门级的机器视觉算法框架,虽然降龙GUI的界面很简单,但在设计思想上五脏俱全。
降龙软件GUI
降龙算法项目源码地址:https://www.roundvision.cc/image_processing/xianglongalgorithm/xianglong_04/

1、设计GUI界面

如上图所示,我们界面包括:
软件包含多个区域模块:

  1. 菜单栏:菜单栏里,通过qt的action机制,可以将一些操作集成到菜单栏上

  2. 执行按钮:一个widget窗口,里面放了三个按钮,分别是单次运行,循环运行和停止运行,这是机器视觉软件最常见的三个按钮。因为机器视觉软件的任务运行可定会涉及这三个动作。

    单次运行会单次运行选中算法,并把缩略图窗口当前选中的图片传入算法接口来执行。循环运行会循环遍历缩略图窗口,依次将图片传送给算法。停止运行即为立即停止算法执行。

    整个单次运行、循环运行和停止运行是靠一个单生产者单消费者队列模型来控制的,会在后续教程种做详细讲解。使用多线程来执行我们的算法是软件开发不可避免的主题,因为我们不可能在我们的主线程,也就是软件主线程里直接调用我们的算法接口,这样会导致我们界面的卡顿甚至卡死,设计一个好的多线程框架是开发一个好的视觉框架的基础。

  3. 算法工具树:一个listwidget列表窗口,会将所有算法罗列到左侧边栏,通过选择不同的算法,会切换页面到不同的算法配置页面,当软件运行时,也会运行选中的算法。我们是通过插件的形式,讲算法动态库加载到软件里的,当我们成功加载算法插件时,就会讲对应的选项显示到我们的算法树。

  4. 算法配置页面:不同算法会有一个独有的配置页面,运行算法时,会将配置页面的所有参数传送给算法的输入参数,来达到调参以及算法执行的效果

  5. 视觉窗口:图片显示窗口,支持拖动,放大缩小,双击鼠标居中,图像自适应显示等等,在视觉窗口会显示当前图像或者算法的输出图像。

  6. 缩略图窗口:一个图像缩略显示的窗口,会将选中的图像全部显示在这里,方便查看和选中。

  7. 日志窗口:打印软件日志的地方,qt有对日志的重定向进行很好的支持。

  8. 状态栏:软件底部的状态栏窗口,会记录软件运行的时间、CPU占用、内存占用情况。

每个模块都是使用QT控件搭建起来并使用QSS进行美化的,最终得到上图界面的效果。具体代码实现大家可以直接去看源码。
降龙算法项目源码地址:https://www.roundvision.cc/image_processing/xianglongalgorithm/xianglong_04/

2、设计算法运行线程

在我们将界面是如何实现兼容任何算法模块之前,我们需要先思考,当我们点击循环运行按钮来运行所有算法时,我们后端的线程应该如何设计?
因为显而易见,我们不可能在主线程内循环运行算法,这样必然会导致主界面的卡死。
因为降龙算法是一个简化版框架,所以我们采用了单生产者但消费者的线程设计模式来执行我们的算法循环运行
生产者会从缩略图这里拿到需要运行的图像,然后把图像放到图像队列里。
消费者会从队列里拿图像,然后执行选择的算法来跑这张图像,并把图像从队列里删掉。
这样写增加了一点点代码的复杂度,并可以提高效率,因为从磁盘读取图像会耗时较大,采用这种架构可以讲算法执行与图像读取的磁盘操作分开。
在这里插入图片描述
图像队列是一个线程安全的图像队列,从界面的缩略图列表中读取到的图像就存储在图像队列中。
在这里插入图片描述

3、设计算法插件及接口

在降龙GUI里,每一个算法工具都是一个QT插件,这样可以很好的将QT的主页面与算法工具进行分离。不论是维护还是开发或者是学习源码,都非常友好。
在这里插入图片描述
插件实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾。那么开发插件其实就是开发一个动态库,该动态库能够很好的加载进主程序、访问主程序资源、和主程序之间进行通信。
Qt Creator插件理解起来其实很简单,定义一个接口类作为基类,其他插件需要继承该类实现对应的虚方法,每个插件作为独立子工程编译后生成对应的动态库。
了解了工作流程之后,我们就可以来设计我们的插件接口了:

class MainInterface
{
public:virtual ~MainInterface(){}//获取插件名称,我们插件管理器会根据名称来决定,该插件在算法树中的名称以及图标virtual QString name() = 0;//插件描述,对插件的信息描述,没有实际用处virtual QString information() = 0;//算法初始化函数,一些算法必须要先初始化一些资源才可以运行,该接口内就需要实现对算法的初始化virtual int Init() = 0;//算法执行函数,算法每次运行都会调用该接口,如果算法由资源需要初始化,但init没有初始化成功,则该函数不会运行virtual int Execute(QImage image) = 0;//算法面板,获取算法的配置面板virtual QWidget* GetProcessPanel(QWidget* parent = nullptr) = 0;
};

THE END

本篇先介绍到这里,如果你感兴趣,可以进一步观看视频教程:
https://www.bilibili.com/video/BV12o4y1x7My
在这里插入图片描述
降龙算法项目源码地址:https://www.roundvision.cc/image_processing/xianglongalgorithm/xianglong_04/

相关文章:

【降龙算法】基于QT插件机制实现一个机器视觉算法小框架

机器视觉行业有各种各样的拖拉拽框架,也叫做低代码平台,例如国内海康的VisionMaster: 一个机器视觉框架需要包含各种算法模块,日志窗口,图像显示窗口等等,【降龙算法】就是做了一个入门级的机器视觉算法框…...

智能路由器 端口映射 (UPnP) Padavan内网端口映射配置方法

新版本Padavan 4.4内核的端口映射配置和老版本的不太一样,因为新版本默认是启用的 UPnP端口映射, 同时默认使用的是 IGD UPnP自动端口映射, UPnP名词解释: UPnP通用即插即用,是一组协议的统称,是一种基于TCP/IP、UDP和HTTP的分布式、开放体系&#xff…...

MR-GCN

∘ Φ \circ_Φ ∘Φ​ denotes a convolution Let b l o c k d i a g blockdiag blockdiag(A) be a n1n3-by-n2n3 block diagonal matrix, f o l d fold fold indicate its inverse operator diagonal degree tensor D \mathcal{D} D 作者未提供代码...

Java http 响应式请求和非响应式请求有什么区别

在Java中,HTTP的响应式请求和非响应式请求有以下区别: HTTP协议本身并不直接支持响应式请求,因为HTTP是基于请求-响应模型的。然而,可以通过使用其他技术和协议来实现响应式请求。 响应方式:响应式请求是指使用响应式编…...

CHS_06.2.1.6_2+线程的实现方式和多线程模型

CHS_06.2.1.6_2线程的实现方式和多线程模型 知识总览线程的实现方式用户级线程(User-Level Thread, ULT)内核级线程 多线程模型一对一模型多对一多对多模型 知识回顾 在上个小节中 我们学习了线程相关的一些基本概念 基础的知识 那这个小节中 我们回来看…...

k8s集群配置NodeLocal DNSCache

一、简介 当集群规模较大时,运行的服务非常多,服务之间的频繁进行大量域名解析,CoreDNS将会承受更大的压力,可能会导致如下影响: 延迟增加:有限的coredns服务在解析大量的域名时,会导致解析结果…...

Superpoint Transformer for 3D Scene Instance Segmentation

Abstract 现有的大多数方法通过扩展用于3D物体检测或3D语义分割的模型来实现3D实例分割。然而,这些非直接的方法存在两个缺点:1) 不精确的边界框或不令人满意的语义预测限制了整体3D实例分割框架的性能。2) 现有方法需要一个耗时的中间聚合步骤。为了解决这些问题,本文提出…...

adb调试软件下载 及 常用调试命令

一、软件下载 Windows版本:下载 Mac版本:下载 Linux版本:下载 二、常见调试命令 进入ADB调试 在文件路径栏输入cmd,回车,即可进入adb调试。注意:以下3条不要登录设备 shell (一)显…...

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要:Acrel-1000变电站综合自动化系统,是我司根据电力系统自动化及无人值守的要求,总结国内外的研究和生产的先进经验,专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能,可实现无人…...

技术的本质,是解决需求

分享下今日朋友圈精华内容。 很多人在初学时,走了很多弯路,一味追求热门、高性能、高复杂的芯片,或者系统,学了一堆东西,最后连个简单的功能,都实现不了。 大概是忘了,学技术的本质,…...

【刷题】leetcode 1 . 两数之和

两数之和 两数之和1 思路一 (简单突破)2 思路二 (进行优化)3 思路三 (哈希表 我还不会) 谢谢阅读Thanks♪(・ω・)ノ下一篇文章见!!! 两数…...

Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)

客户提供的账号过期了,简单搭建 SIP 服务器,以便测试使用。个人认为这个配置起来最为简单,且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器…...

SpringCloud openFeign 之 获取被调用服务名

SpringCloud openFeign 之 获取被调用服务名 一. 概述 低版本 feign 只能获取到被调用方法的信息。 只有高版本 feign 才支持获取到被调用服务的信息。 二. 代码实现 package com.zxguan.springcloud2.template.user;import com.zxguan.springcloud2.template.user.config…...

ChatGPT和文心一言哪个更好用?

ChatGPT和文心一言都是基于深度学习技术的自然语言处理模型,它们各自具有优势和局限性,需要根据具体需求进行选择。以下是两者的比较: 算力:ChatGPT由OpenAI开发,具有强大的文本生成能力和语言理解能力,其训…...

第07章_面向对象编程(进阶)拓展练习(关键字:this,继承性和方法重写,关键字:super,多态性,Object类)

文章目录 第07章_面向对象编程(进阶)拓展练习01-关键字:this1、Circle类2、MyDate类3、Card类 02-继承性和方法重写4、Person、Student、Teacher类5、DepositCard、CreditCard类6、Employee、Programmer、Designer、Architect类7、判断输出结…...

小米路由器有线中继模式设置固定IP

第一步 小米路由器切换为有线中继模式后,进电脑版web管理界面,点击中继设置,把web页面地址中apsetting修改为setting(如下)后按回车键加载新页面。 修改前: http://192.168.1.168/cgi-bin/luci/;stokxxxx…...

用python实现给出关键字查找并标注pdf文件中关键字

要在Python中标注PDF文件中的关键字,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现…...

postman自动化接口测试

背景描述 有一个项目要使用postman进行接口测试,接口所需参数有: appid: 应用标识;sign:请求签名,需要使用HMACSHA1加密算法计算,签名串是:{appid}${url}${stamp};stamp&#xff1…...

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …...

EDM群发的优势

在当今这个数字化的时代,电子邮件营销(EDM)已经成为企业与客户沟通的重要手段。相较于传统的营销方式,EDM群发具有许多独特的优势,使其在商业竞争中占据了不可替代的地位。 首先,EDM群发具有精准的目标定位…...

机器学习优化离子光学:破解天体物理(p,n)反应测量难题

1. 项目概述:当机器学习遇上离子光学,破解天体物理反应测量难题在核天体物理这个探索宇宙元素起源的领域,我们常常面临一个尴尬的局面:理论模型告诉我们某些核反应过程至关重要,但实验上却束手无策。其中,低…...

抖音下载器:3分钟搞定批量下载,效率提升95%的秘密武器

抖音下载器:3分钟搞定批量下载,效率提升95%的秘密武器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fal…...

如何三分钟搭建免费音乐聚合平台:MusicFree插件终极配置指南

如何三分钟搭建免费音乐聚合平台:MusicFree插件终极配置指南 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins 还在为音乐会员费烦恼吗?想要一个真正免费、无广告的音乐播放体…...

结构可识别性映射:破解模型不可识别下的时间序列分类难题

1. 项目概述:当模型“看不清”时,如何让分类器“看得清”?在生物医学、工业过程监控等领域,我们常常面对这样的场景:你有一堆传感器记录下的时间序列数据,比如病人的心率变化、反应器内的温度波动&#xff…...

高能物理数据分析实战:从W玻色子截面测量到机器学习应用

1. 项目概述:从海量对撞数据到物理发现如果你对宇宙的构成充满好奇,想知道我们是如何发现希格斯玻色子,或者顶夸克的质量是如何被精确测量的,那么高能物理数据分析就是你正在寻找的钥匙。这听起来可能离日常生活很远,但…...

告别重装!用Systemback在Ubuntu 20.04上打造你的专属系统‘时光机’

用Systemback为Ubuntu打造专属系统时光机每次系统崩溃都要重装?开发环境配置浪费半天时间?实验室电脑和个人笔记本环境不一致?这些问题对于频繁折腾系统的开发者来说简直是噩梦。Systemback就像给Ubuntu系统装上了"时光机"&#xf…...

ESP32嵌入式AI语音助手安全加固实战指南

1. 这不是“调个API就完事”的玩具项目,而是一次对嵌入式AI终端真实攻防边界的摸底你手头刚拿到一份标榜“ESP32本地LLM语音唤醒”的开源AI语音助手源码,烧录进开发板后,它能听懂“打开灯”“今天天气怎么样”,甚至能用合成语音回…...

Windows设备管理器报‘代码43’导致HDMI无输出?保姆级排查与修复指南(附原理)

Windows设备管理器报‘代码43’导致HDMI无输出?保姆级排查与修复指南(附原理)当你正准备进行一场重要的演示,或是沉浸在游戏世界中时,突然发现外接显示器黑屏无信号,设备管理器显示"Windows已停止该设…...

别光背公式了!用Python的NumPy和SciPy手把手带你玩转SVD(附实战代码与可视化)

别光背公式了!用Python的NumPy和SciPy手把手带你玩转SVD(附实战代码与可视化)在数据科学和机器学习领域,奇异值分解(SVD)就像一把瑞士军刀——它可能不是你每天都会用到的工具,但当遇到棘手问题…...

3分钟学会:全网资源一键下载神器res-downloader完全指南

3分钟学会:全网资源一键下载神器res-downloader完全指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为无…...