大家好,我是周旋。
这个项目前前后后筹备了有半年时间了,现在终于可以和大家见面了。虽然还没有完全开发完毕,但大家已经可以学起来了。本篇是对降龙项目所做的一个详细的介绍。
一:降龙算法系列项目介绍
降龙算法系列分两个组成部分:
1. 降龙算法展示软件:降龙GUI
2. 降龙算法十八掌:十八种经典机器视觉算法
出此系列教程的目的是面向处于学习阶段的学生,尤其是想做机器视觉传统算法工程师或者机器视觉软件开发工程师的同学。
如果你想做机器视觉软件开发工程师,那你把降龙GUI部分搞懂,就能学会C /QT/CMake/动态库开发/opencv这些技能,再辅以一些算法基础和计科专业课基础,那可以很顺利的拿到软开岗。
因为降龙GUI不仅包含了简单的控件使用、页面搭建,还包含了如何实现缩略图窗口、视觉窗口等复杂模块,以及如何架构一个中小型的软件,如何设计线程模型来执行我们的算法,如何使用QT的插件来使我们的软件具备极强的扩展性等等高级内容。
如果你想做机器视觉传统算法工程师,那降龙算法十八掌绝对是一本秘籍,掌握十八种在机器视觉行业最为经典的算法实现,注意,不是调库的实现,而是纯自己C 手写实现。掌握降龙十八掌,拿下传统算法岗绝对没有问题。
不过十八种算法我还没有开发完,当前我们推出的是降龙算法系列的子项目:降龙算法之模板匹配项目,该项目包含了完整的降龙GUI以及两个算法,分别是边缘提取和模板匹配。
二、降龙系列架构
给大家简单的介绍一下整个项目的架构,方便大家更为直观的了解我们涉及到了哪些技术。
1、CMake工程管理
我们整个项目是使用CMake做工程管理的,降龙系列项目本身并不是一个很小的项目,而是一个中小型的项目,因此其cmake也有不少的内容,通过学习降龙系列的cmake,大家可以学习到如何使用cmake来管理自己的项目。
2、降龙GUI软件
降龙GUI是降龙算法的演示软件,软件的作用是集成算法,并为大家演示算法的效果,软件运行效果图如下所示:
软件包含多个区域模块:
1. 菜单栏:菜单栏里,通过qt的action机制,可以将一些操作集成到菜单栏上
2. 执行按钮:一个widget窗口,里面放了三个按钮,分别是单次运行,循环运行和停止运行,这是机器视觉软件最常见的三个按钮。因为机器视觉软件的任务运行可定会涉及这三个动作。
单次运行会单次运行选中算法,并把缩略图窗口当前选中的图片传入算法接口来执行。循环运行会循环遍历缩略图窗口,依次将图片传送给算法。停止运行即为立即停止算法执行。
整个单次运行、循环运行和停止运行是靠一个单生产者单消费者队列模型来控制的,会在后续教程种做详细讲解。使用多线程来执行我们的算法是软件开发不可避免的主题,因为我们不可能在我们的主线程,也就是软件主线程里直接调用我们的算法接口,这样会导致我们界面的卡顿甚至卡死,设计一个好的多线程框架是开发一个好的视觉框架的基础。
3. 算法工具树:一个listwidget列表窗口,会将所有算法罗列到左侧边栏,通过选择不同的算法,会切换页面到不同的算法配置页面,当软件运行时,也会运行选中的算法。我们是通过插件的形式,讲算法动态库加载到软件里的,当我们成功加载算法插件时,就会讲对应的选项显示到我们的算法树。
4. 算法配置页面:不同算法会有一个独有的配置页面,运行算法时,会将配置页面的所有参数传送给算法的输入参数,来达到调参以及算法执行的效果
5. 视觉窗口:图片显示窗口,支持拖动,放大缩小,双击鼠标居中,图像自适应显示等等,在视觉窗口会显示当前图像或者算法的输出图像。
6. 缩略图窗口:一个图像缩略显示的窗口,会将选中的图像全部显示在这里,方便查看和选中。
7. 日志窗口:打印软件日志的地方,qt有对日志的重定向进行很好的支持。
8. 状态栏:软件底部的状态栏窗口,会记录软件运行的时间、CPU占用、内存占用情况。
软件整体架构其实非常清晰明了,算法部分通过统一的接口,借助qt的从插件机制实现了算法的扩展性。简单来说就行,即便你不了解整个降龙GUI软件界面是怎么写的,你也可以开发你自己的插件,然后将你自己的算法嵌入到降龙GUI里去。如何实现我们会在后续教程中做详细讲解,或者你可以现在去百度一下QT的插件机制。
3、降龙算法十八掌
降龙算法系列教程会对降龙GUI集成十八种机器视觉领域的经典算法,包括但不限于边缘提取、直线检测、圆检测、mark点提取、毛刺检测、卡尺测量、斑点分析、光度立体、模板匹配、灰度匹配等等。当然,当前的子项目《降龙算法之模板匹配》仅包含边缘提取和直线检测两个。
降龙算法十八掌均以C 动态库的形式开发,可以完全与降龙GUI隔离,因此如果你不熟悉QT也没有关系,算法部分是完全独立的纯C 开发,你可以直接使用VS来修改、调试、运行算法,即便你电脑上连QT的环境都没有。
那算法是如何嵌入到降龙GUI里的呢,我们的降龙GUI采用插件的机制,每一个算法都是一个插件,这个插件是基于QT和C 开发的,然后我们再通过这个插件去调用算法的动态库,从而实现算法嵌入到降龙GUI并完成算法的调用。但从代码实现上看,算法部分是与软件完全隔离的。
这样设计不管对与开发者还是学习者,都有着数不尽的好处。
三、项目教学安排
为了更好的学习源码,我为降龙算法系列开发了一套教程,这套教程的前几讲视频已经上传到BiliBili了,大家直接去B站搜【周旋机器视觉】查看即可。教程还在录制中,课表如下:
- 1.1降龙算法系列架构介绍(√)
- 1.2如何运行降龙算法项目源码(√)
- 1.3课程整体教程目录(√)
- 2.1使用qt搭建一个上位机软件的主页面(√)
- 2.2如何实现一个缩略图模块窗口(√)
- 2.3如何实现一个任务序列来执行我们的算法(单生产者单消费者模型)(待录)
- 2.4如何实现一个视觉窗口来显示图像(待录)
- 2.5如何实现一个日志模块窗口(待录)
- 2.6如何使用插件来完成我们算法的接入和扩展(待录)
- 3.1模板匹配算法之边缘提取原理(√)
- 3.2模板匹配算法如何学习模板(待录)
- 3.3模板匹配算法如何进行匹配算法(待录)
- 3.4模板匹配算法整体代码讲解(待录)
- 4.1如何使用cmake管理一个超小型项目(待录)
- 4.2降龙算法项目是如何使用cmake来管理项目的(待录)
制作降龙算法系列教程的过程中,参考了一些网上的内容,参考的一些主要内容罗列在这里,大家可以自己花费时间学习
模板匹配算法:
代码语言:javascript复制[https://www.codeproject.com/Articles/99457/Edge-Based-Template-Matching](https://www.roundvision.cc/?golink=aHR0cHM6Ly93d3cuY29kZXByb2plY3QuY29tL0FydGljbGVzLzk5NDU3L0VkZ2UtQmFzZWQtVGVtcGxhdGUtTWF0Y2hpbmc=)
视觉窗口:
代码语言:javascript复制[https://github.com/jurplel/qView](https://www.roundvision.cc/?golink=aHR0cHM6Ly9naXRodWIuY29tL2p1cnBsZWwvcVZpZXc=)
qt日志重定向:
代码语言:javascript复制[https://blog.csdn.net/weixin_37204973/article/details/82530713](https://www.roundvision.cc/?golink=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNzIwNDk3My9hcnRpY2xlL2RldGFpbHMvODI1MzA3MTM=)