开发一个自己的VM模块系列一:模块详解
不少客户的算法在某些应用领域有非常出色的表现,同时也很欣赏VM的软件架构和呈现形式,那如何将自有算法嵌入到VM当中去呢,这篇文章给大家做一个详尽的展示。

一些有开发实力的视觉集成商,设备商,可以借用VM已经做好的流程框架,将自己特有的处理算法,设备配置功能封装成一个VM模块,置于流程中,就可以方便的调用VM中的图像、获取各模块的处理结果、触发自己特有模块运行。

虽然提供了VM模块生成工具,可以方便的生成一个带输入输出,配置界面的空模块,但很多人还是对模块的原理不清楚,导致即使拿到了自动生成的模块工程,还是不知道该如何下手,把空模块加入业务功能改造成自己独特的模块。

第一部分从原理开始讲解一个模块的组成结构,让后续的模块开发更容易完成,出错之后也方便排查。

一、VM模块的基本概念

                                      图 1 模块基本概念


      一个VM的模块由输入,输出、配置、显示以及模块本身构成。(假如模块名称为AAA输入、输出都由最基本的5种数据类型组成:int, float, string, imagePointSet。最常用的是前面4种。由基本类型组成更复杂的组合类型,如:IMAGEROIBOX,分别是图像和ROI框。在AAAModu.xml里。

   配置是调节模块运行参数的面板,如:圆查找模块的半径。配置也由很多基本类型构成,如:IntegerEnumeration等。这些基本类型都对应了一个可见的配置控件。通过XML定义配置界面的内容。在AAAModuAlgorithmTab.xml里。显示是定义模块运行之后,需要在渲染窗口上显示哪些东西,由一些基本的图像、图形组成,如:imagecirclepointrect等等。在AAAModuDisplay.xml里。

    模块本身,就是可被调用执行的逻辑块,以动态库的形式存在于磁盘上。由底层运行部分和界面运行部分组成。底层运行部分名为AAAModu.dll,界面部分为ModuCs.dll,如果界面部分还有较复杂的建模过程,无法仅仅靠配置XML定义,则还会有一个配置控件,名为AAAModuControl.dll

二、模块运行机制

    了解了模块的基本概念之后,还是不知道这几部分是如何配合工作的。接下来以模块运行把整个过程串起来。(以平移旋转功能为例)

   模块运行时,先从输入中拿到各Input的值,再拿到配置的参数,根据编写好的逻辑将输入与参数一起参与运算,将计算的结果赋值到输出上。显示配置的图形与输出关联,显示出具体的图形。



  1. 三、看一个实例圆查找


圆查找功能定义:在图像的某个位置,查找圆形并输出,找圆的参数可调。


输入:从圆查找的功能定义可知,圆查找的输入有图像,查找框。打开IMVSCircleFindModu.xml,找到Input,可见如下定义:


XML中可见,输入图像为IMAGE这个组合类型(Combination,image, width, height, format 4个基本类型组成,类型分别为image, int, int, int


输入ROI有框(InputROI类型为ROIBOX)和圆弧(InputROIAnnulus类型为ROIANNULUS)两种。


输入还有位置修正信息Position Correction Info类型为FIXTURE



配置:圆查找需要设置所查找圆的半径大小范围,设置明暗变化阈值等。查看IMVSCircleFindModuAlgorithmTab.xml,可见: