一些有开发实力的视觉集成商,设备商,可以借用VM已经做好的流程框架,将自己特有的处理算法,设备配置功能封装成一个VM模块,置于流程中,就可以方便的调用VM中的图像、获取各模块的处理结果、触发自己特有模块运行。
虽然提供了VM模块生成工具,可以方便的生成一个带输入输出,配置界面的空模块,但很多人还是对模块的原理不清楚,导致即使拿到了自动生成的模块工程,还是不知道该如何下手,把空模块加入业务功能改造成自己独特的模块。
第一部分从原理开始讲解一个模块的组成结构,让后续的模块开发更容易完成,出错之后也方便排查。
一、VM模块的基本概念
图 1 模块基本概念
一个VM的模块由输入,输出、配置、显示以及模块本身构成。(假如模块名称为AAA)
输入、输出都由最基本的5种数据类型组成:int, float, string, image,PointSet。最常用的是前面4种。由基本类型组成更复杂的组合类型,如:IMAGE,ROIBOX,分别是图像和ROI框。在AAAModu.xml里。
配置是调节模块运行参数的面板,如:圆查找模块的半径。配置也由很多基本类型构成,如:Integer,Enumeration等。这些基本类型都对应了一个可见的配置控件。通过XML定义配置界面的内容。在AAAModuAlgorithmTab.xml里。
显示是定义模块运行之后,需要在渲染窗口上显示哪些东西,由一些基本的图像、图形组成,如:image,circle,point,rect等等。在AAAModuDisplay.xml里。
模块本身,就是可被调用执行的逻辑块,以动态库的形式存在于磁盘上。由底层运行部分和界面运行部分组成。底层运行部分名为AAAModu.dll,界面部分为ModuCs.dll,如果界面部分还有较复杂的建模过程,无法仅仅靠配置XML定义,则还会有一个配置控件,名为AAAModuControl.dll。
图 2 模块概念与实际文件对应
二、模块运行机制
了解了模块的基本概念之后,还是不知道这几部分是如何配合工作的。接下来以模块运行把整个过程串起来。(以平移旋转功能为例)
图 3 运行机制
模块运行时,先从输入中拿到各Input的值,再拿到配置的参数,根据编写好的逻辑将输入与参数一起参与运算,将计算的结果赋值到输出上。显示配置的图形与输出关联,显示出具体的图形。
图 4 圆查找输入定义
三、看一个实例圆查找
圆查找功能定义:在图像的某个位置,查找圆形并输出,找圆的参数可调。
输入:从圆查找的功能定义可知,圆查找的输入有图像,查找框。打开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,可见:
分别对应圆查找的基本参数,运行参数,结果显示
圆查找的参与与XML里的定义一一对应。比如EdgeThresh对应边缘阈值,默认值为0xf,即界面上显示的15。如果自定义模块开发过程中需要某个配置控件,又不知道具体的控件类型及用法。可以去看看其它已有模块,是不是有一样的。可以把该模块的配置XML打开,找到需要的控件,看懂它的使用逻辑,复制过来,并修改参数的名称。
配置里还有一个重要的工作,是将需要输入数据与配置控件关联起来,让人可以在界面上配置输入数据从哪来。圆查找的输入数据是图像和ROI,几乎所有的模块都需要这两个数据,所以把这两个数据的配置控件做成了基本界面库。在配置XML中如下:
图像对应的ImageSourceGroup, ROI有很多配置方式,对应的Tab_ROI
Area里的所有控件。显示如下:
运算:在圆查找模块中,需要获取图像,找到ROI区域,并尝试找出半径,边缘阈值符合参数的圆。具体的获取输入数据,参数数据在第二部分文档中讲解。并将搜索到的圆赋值到输出数据中。
输出:从圆查找定义可知,至少会输出一个圆形。查看IMVSCircleFindModu.xml的Output,如下:
有ModuStatus模块运行状态,类型为int.
有OutputCircle输出圆形,类型为CIRCLE的复合类型,由Radius半径,类型为float。CenterX圆心点X,CenterY圆心点Y,类型也都为float组成。
还有一些其它输出。
显示:圆查找至少要显示搜索到的圆形,还需要显示底图。查看IMVSCircleFindModuDisplay.xml可见:
在Display里定义了要显示的图像,名称为InputImage,类型为image。图像数据,长,宽,格式分别对应(Mapping)到输入输出中的InImage, InImageHeight,
InImageWidth, InImagePixelFormat.
定义了要显示的圆形,名称为Circle
Result, 类型为circle。图形的中心点X,Y,内径,外径分别对应(Mapping)到输入输出中的CenterX,CenterY, Radius,
Radius