【降龙算法】基于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/

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

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

相关文章

C++多线程学习[三]:成员函数作为线程入口

一、成员函数作为线程入口 #include<iostream> #include<thread> #include<string>using namespace std;class Mythread { public:string str;void Test(){cout << str << endl;} }; int main() {Mythread test;test.str "Test";thr…

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中&#xff0c; 顺序关系主要分为以下三类&#xff1a;时间顺序&#xff1a; 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴&#xff0c; 时间顺序是通过时刻的顺序体现的。 因果顺序&#xff1a; 如果事件e1是事件e2发生的原因&#xf…

专业120+总分420+中山大学884信号与系统考研经验信息与通信工程电子信息

今年考研专业课120&#xff0c;总分420&#xff0c;顺利上岸。本人本科211末流&#xff0c;本科期间比较散漫&#xff0c;没有拿到本校保研资格&#xff0c;作为北方孩子&#xff0c;一直想到东南沿海地区&#xff0c;考研再三选择中山大学信通&#xff0c;该收心时候还是得逼一…

unity urp 视差卡牌

总体效果大概四层&#xff0c;从后往前排序为&#xff1a;卡背、背景、画像、边框 首先卡背比较简单&#xff0c;只要判断如果网格的背面就直接采样卡背图片展示即可 资源准备&#xff1a; 然后是背景&#xff0c;网上找到一张这样的图。 但他还不符合要求&#xff0c;我们的…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 子类 ---》派生类 基类 ---》超类&#xff08;父类&#xff09; // 继承之间的叫法 // A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 // 子类 ---》派生类 // 基类 …

2024年美国大学生数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 暂时无法在飞书文档外展示此内容 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&a…

不要再搞混标准化与归一化啦,数据标准化与数据归一化的区别!!

数据标准化与归一化 1. 数据的标准化&#xff08;Standardization&#xff09;&#xff1a;2. 数据的归一化&#xff08;Normalization&#xff09;&#xff1a;总结&#xff08;数据标准化和数据归一化的不同之处和相同之处&#xff09; 1. 数据的标准化&#xff08;Standardi…

【LabVIEW FPGA 编程入门】使用FPGA IO进行编程

1.在项目中新建一个VI&#xff0c;命名为FPGA IO Test。 2. 可以直接将项目中的FPGA IO拖入程序框图中。 FPGA IO的类型&#xff1a; 数字线&#xff1a; 数字端口&#xff1a; 模拟IO&#xff1a; 其他&#xff1a; 3.如果新增加了FPGA资源&#xff0c;不是创建项目时扫描到的…

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历&#xff0c;中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

【SAP】如何删除控制范围

经历就是财富&#xff0c;可你终将遗忘。期望文字打败时间。 本周心惊胆战地在配置系统删除了一个控制范围&#xff0c;还是有些收获&#xff0c;特此记录一下。 背景&#xff1a;在删除控制范围之前&#xff0c;我主要做了如下配置。 定义控制范围&#xff08;自动生成了成本…

Unable to find node on an unmounted component in React

小众错误一枚&#xff0c;网上都说需要react版本没有升级原因&#xff0c;因为是内部错误&#xff0c;控制台又无法定位到代码哪一行报错&#xff0c;网上又没有类似的解决方法&#xff0c;特此记录思路&#xff0c;供大家参考。 通过网上说的版本原因&#xff0c;合理推测是因…