机器视觉行业有各种各样的拖拉拽框架,也叫做低代码平台,例如国内海康的VisionMaster:
一个机器视觉框架需要包含各种算法模块,日志窗口,图像显示窗口等等,【降龙算法】就是做了一个入门级的机器视觉算法框架,虽然降龙GUI的界面很简单,但在设计思想上五脏俱全。
降龙算法项目源码地址:
https://www.roundvision.cc/image_processing/xianglongalgorithm/xianglong_04/
1、设计GUI界面
如上图所示,我们界面包括:软件包含多个区域模块:
每个模块都是使用QT控件搭建起来并使用QSS进行美化的,最终得到上图界面的效果。具体代码实现大家可以直接去看源码。
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