做海报的网站知乎,许昌做网站优化,360个人网站建设,快速优化网站排名的方法机器视觉行业有各种各样的拖拉拽框架#xff0c;也叫做低代码平台#xff0c;例如国内海康的VisionMaster#xff1a; 一个机器视觉框架需要包含各种算法模块#xff0c;日志窗口#xff0c;图像显示窗口等等#xff0c;【降龙算法】就是做了一个入门级的机器视觉算法框…机器视觉行业有各种各样的拖拉拽框架也叫做低代码平台例如国内海康的VisionMaster 一个机器视觉框架需要包含各种算法模块日志窗口图像显示窗口等等【降龙算法】就是做了一个入门级的机器视觉算法框架虽然降龙GUI的界面很简单但在设计思想上五脏俱全。 降龙算法项目源码地址https://www.roundvision.cc/image_processing/xianglongalgorithm/xianglong_04/
1、设计GUI界面
如上图所示我们界面包括 软件包含多个区域模块 菜单栏菜单栏里通过qt的action机制可以将一些操作集成到菜单栏上 执行按钮一个widget窗口里面放了三个按钮分别是单次运行循环运行和停止运行这是机器视觉软件最常见的三个按钮。因为机器视觉软件的任务运行可定会涉及这三个动作。 单次运行会单次运行选中算法并把缩略图窗口当前选中的图片传入算法接口来执行。循环运行会循环遍历缩略图窗口依次将图片传送给算法。停止运行即为立即停止算法执行。 整个单次运行、循环运行和停止运行是靠一个单生产者单消费者队列模型来控制的会在后续教程种做详细讲解。使用多线程来执行我们的算法是软件开发不可避免的主题因为我们不可能在我们的主线程也就是软件主线程里直接调用我们的算法接口这样会导致我们界面的卡顿甚至卡死设计一个好的多线程框架是开发一个好的视觉框架的基础。 算法工具树一个listwidget列表窗口会将所有算法罗列到左侧边栏通过选择不同的算法会切换页面到不同的算法配置页面当软件运行时也会运行选中的算法。我们是通过插件的形式讲算法动态库加载到软件里的当我们成功加载算法插件时就会讲对应的选项显示到我们的算法树。 算法配置页面不同算法会有一个独有的配置页面运行算法时会将配置页面的所有参数传送给算法的输入参数来达到调参以及算法执行的效果 视觉窗口图片显示窗口支持拖动放大缩小双击鼠标居中图像自适应显示等等在视觉窗口会显示当前图像或者算法的输出图像。 缩略图窗口一个图像缩略显示的窗口会将选中的图像全部显示在这里方便查看和选中。 日志窗口打印软件日志的地方qt有对日志的重定向进行很好的支持。 状态栏软件底部的状态栏窗口会记录软件运行的时间、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/