【降龙算法】基于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.mzph.cn/news/618055.shtml

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

相关文章

(核心变量)全国上市公司对外开放程度+dofile+参考文献(2000-2022年)

上市公司的对外开放程度数据反映了这些公司在国际市场上的活跃度和全球化程度。这包括了它们的国际贸易参与度、跨国投资和合作、国际市场的营销和品牌推广策略,以及在不同国家和地区的业务布局。此外,这段时间内不同行业和公司的对外开放程度可能有明显…

代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解,一定要先看视频,事半功倍。写博客,将自己的感悟沉淀下来,不然会忘大家提问的时候,记得要把问题描述清楚,自己在哪一步遇到了问题&#xff0c…

记录一个Insert姿势引起的MySQL从库上查不到数据的问题

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 问题描述: 某测试环境的MySQL用了两台节点,主从同步结构。忽然有研发同学反映说MySQL的主从不同步了。他…

大数据技术原理与应用期末复习(林子雨)

大数据技术原理与应用期末复习(林子雨) Hadoop的特性HBase编程实践NoSQL的四大类型键值数据库优点:缺点: 列族数据库优点:缺点: 文档数据库优点:缺点: 图数据库优点:缺点…

超声波眼镜清洗机清洗眼镜会有伤害吗?适合洗眼镜超声波清洗机

眼镜作为日常生活中不可或缺的辅助视力工具,经常需要清洁保养以确保视力清晰和舒适佩戴。随着科技的发展,超声波眼镜清洗机成为越来越受欢迎的清洁方式。然而,很多人可能会担心使用超声波清洗机是否会对眼镜造成损害。但是可以很可以的告诉大…

设计模式——原型模式(Prototype Pattern)

概述 原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象…

C1-3.4 多个样本的向量化

C1-3.4 多个样本的向量化 1、为什么要用样本的向量化呢? 总结一句话:计算方便 下图是神经网络计算的步骤,右侧 是有一个输入变量a[0](什么是X呢,因为输入层有三个神经元,说明有三个输入变量,…

15 个适用于 Windows 的 PDF 解锁工具大全

PDF(便携式文件格式)是一种文件格式,用于呈现和交换任何独立于任何软件、硬件或操作系统的可靠访问的文档。Adobe 发明了它,但现在它是由国际标准化组织 (ISO) 维护的开放标准。因此,您现在必须了解这些 PDF 解锁工具。…

【随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络(Backpropagation Neural Network,反向传播神经网络)是一种监…

Linux第21步_取消鼠标中键的复制粘贴功能

在ubuntu18.04操作系统中,选中文本后,若按下鼠标中键,就可以执行复制粘贴,相当于 CtrlshiftC 后又按了 CtrlshiftV。在Linux系统中,基本上都是这么配置的。在windows系统中,我们习惯用Ctrl-C复制&#xff0…

普通人想通过抖音赚钱要先知道这4点

1.变现方式 想做抖音首先要想好变现路径以及通过什么方式变现。做抖音就是在经营某一类人群,因为人群绑定了精准标签,系统推送的精准又绑定了变现。所以要明确你经营的目标人群是谁,你在做谁的生意,你要赚谁的钱。他们的年龄、收…

OpenCV-Python的版本介绍及区别

OpenCV-Python版本介绍 OpenCV-Python有多个版本,每个版本都有其特定的功能和改进。以下是一些常见OpenCV-Python版本及其介绍和区别: OpenCV-Python 2.x版本 这是OpenCV-Python的旧版本,支持Python 2.x。它包含了许多传统的计算机视觉功能&…

可盐可甜的红色马甲背心

膨体棉腈面料不易皱,搭配阿兰花菱形镂空设计 真的绝绝子,红色吸睛又美观 随便搭配一件衬衫去穿,自带文艺气息 氛围感直接拉满 出街拍照很出片,时髦又气质 女孩子的甜美,温柔等都可以突显 有喜欢的可以尝试一下哟…

超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放

引言:基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下: 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令,作出运动控制 4、设置…

Docker与微服务实战(高级篇)- 【上】

Docker与微服务实战(高级篇)- 【上】 一、Docker复杂安装详说1.1 Mysql主从复制--原理-【尚硅谷Mysql高级篇】1.2 Mysql主从复制--【一主一从】搭建步骤1.2.1新建--【主服务器】--容器实例--33071.2.2.进入/app/mysql-master/conf目录下新建my.cnf1.2.3.…

【算法】简单的二分查找算法

一个简单的二分查找算法&#xff1a; import java.util.Arrays; public class BinarySearch {public static int rank(int key,int[] a){int lo0;int hia.length-1;while (lo<hi){int midlo(hi-lo)/2;if (key<a[mid])himid-1;else if (key>a[mid])lomid1;else return …

嵌入式linux 编译qt5(以v851s为例)

本文参考Blev大神的博客&#xff1a;Yuzuki Lizard V851S开发板 --移植 QT5.12.9教程&#xff08;群友Blev提供&#xff09; - Allwinner / 柚木PI-V851S - 嵌入式开发问答社区 (100ask.net) 一. 环境准备 1.下载qt5源码&#xff1a;Open Source Development | Open Source …

【Maven】001-Maven 概述

【Maven】001-Maven 概述 文章目录 【Maven】001-Maven 概述一、Maven 概述1、为什么学习 MavenMaven 作为依赖管理工具Maven 作为构建工具其它 2、Maven 介绍3、Maven 软件工作模型图 一、Maven 概述 1、为什么学习 Maven Maven 作为依赖管理工具 依赖管理&#xff1a; Mave…

IDEA集成Gitee(码云)

文章目录 创建新仓库&#xff0c;存放项目拉取Gitee上的项目 1、安装插件 Idea默认不带码云插件&#xff0c;我们第一步要安装Gitee插件。 如图所示&#xff0c;在Idea插件商店搜索Gitee&#xff0c;然后点击右侧的Install按钮。 2、Settings>Version Conttol>Gitee 这里…

数据分析基础

数据运营的概念及意义 数据分析的三个维度 数据总览的作用及提升方法 数据总览的作用及提升方法 数据总览的作用及提升方法小结 影响作品数据的关键因素 影响作品数据的关键因素小结 用户数据的意义与作用 用户数据分析的方法与操作 用户数据分析的方法与操作小结 数据运营小结…