【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
qmacvisual里面的第三方插件主要由两部分组成,一部分是ExtensionLibrary,也就是插件的容器,这个是官方提供的,不需要修改代码;另外一个ExtLibraryCase,这个是用户自己编写的插件。后面一种,作者也提供了对应的模板代码。大家如果需要开发自己的插件,只需要copy一下这个工程,在对应的frmExtLibraryCase.cpp添加对应的代码内容就可以了。
1、创建工程和创建流程
首先,还是创建工程、创建流程,这是基础。
2、插件实现的功能
这个插件实现的功能主要就是在图像里面找圆。它的方法蛮好玩的。前面都是常规操作,即图像灰化-》中值滤波-》canny算子-》dilate膨胀-》轮廓提取。这些都是基本操作,大部分图像也是会这么处理的。最重要的是下面的逻辑,这才是设计的部分。
接下来,针对于每个轮廓,先统计轮廓的面积area,接着获取轮廓的周长len,然后依次计算半径r和场数c。这里默认假设轮廓是圆,
r = (area / len) * 2;
c = (area / (len * len)); // should be 1/(4*pi)
通过对半径r和圆度c进行范围筛选,我们就可以找到合适的轮廓选项了。
3、代码如何编写
对于qmacvisual里面的插件,它的输入是图像,它的输出也是图像。如果这个时候还要输出其他的数据,有一个办法,就是提前设置好全局变量,把数据赋值给这个全局变量就可以。
ExtLibraryCase插件的代码和其他52个插件的代码非常类似,不过大概是作者不想客户自己编写的代码影响整个架构的质量,所以做了这么一个插件容器的设计。一个容器一次只能放一个插件。如果有多个自定义插件需要运行,那么就要在流程中配置多个容器。
回到ExtLibraryCase插件,最重要的文件来自于frmExtLibraryCase.cpp。如果不需要做界面功能的补充,修改这一个cpp源文件就够了。功能的入口来自于Execute函数,
int frmExtLibraryCase::Execute(const QString toolname)
{// other codeint result = RunToolPro();// other code
}
在Execute函数当中会调用RunToolPro这个函数,
int frmExtLibraryCase::RunToolPro()
{// full algorithm procedure
}
如果客户的项目比较着急,完全可以copy这个工程,修改RunToolPro函数代码,编译生成新的插件即可。因为图像的算法比较多,客户的场景有的时候也比较特殊,定制算法是常有的事情,这种情况下,快速去开发定制的算法也不失为一个明智的选择。
4、插件的运行效果
为了让大家知道插件时如何运行的,我们创建了一个简单的流程,即读取图像、运行扩展库、图像显示,
其中扩展库是这么配置的,
最后的运行效果是这样的,图像中所有的圆都被找出来了,也就是图中红色的部分,本身就是一个一个的小圆。