应用示例:设置模块参数

本章节以简易场景为例,介绍如何通过全局脚本模块实现模块参数的自动设置。

本节内容包含:

方案需求

假设某视觉业务场景需实现如下需求:

表 1 方案需求

需求

描述

需求1

方案中包含2个流程:流程1和流程2,其中流程1中包含快速匹配模块。

需求2

2个流程批量同时执行时,自动将流程1中快速匹配模块的最大匹配个数设置为10

需求3

2个流程批量同时执行时,获取流程1中快速匹配模块结果中的匹配个数匹配点

方案思路

基于上述业务需求,方案搭建的思路框架如下:

图 1 方案搭建思路

方案搭建

基于上述思路,需搭建流程并自行开发全局脚本。

搭建流程

本节仅对本应用示例的流程的核心操作做简要呈现,具体流程中调用的模块不作赘述。

  1. 搭建流程1,在流程1中调用快速匹配模块。
  2. 单击流程编辑区域顶部的新建流程(此处即“流程2”),并搭建流程2。

自定义全局脚本

本节仅对全局脚本中的核心接口调用作简要介绍。其中SDK相关的类、方法和属性的详情,请参见VM的SDK开发指南(.NET)。

  1. 单击快捷工具条的,打开全局脚本窗口,开始准备进行C#编程。
  2. 调用全局脚本的Init方法,对全局脚本进行初始化。
  3. 调用全局脚本的Process方法,并在该方法中实现如下代码逻辑。
    1. 通过.NET SDK的IMVSFastFeatureMatchModuTool类,在代码中定义流程1中的快速匹配模块(即“快速匹配1”),如下图所示。
      图 2 在代码中定义快速匹配模块
    2. 通过.NET SDK的FastFeatureMatchParam类下的MaxMatchNum属性,将快速匹配模块的最大匹配个数的值设置为10
    3. 通过.NET SDK的FastFeatureMatchResult类,在代码中定义快速匹配模块的模块结果。
    4. 通过.NET SDKFastFeatureMatchResult类下的MatchNumMatchPoint属性,分别获取快速匹配模块的匹配个数匹配点

上述步骤的完整示例代码如下:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Collections;
using VM.GlobalScript.Methods;
using iMVS_6000PlatformSDKCS;
using VM.Core;
using VM.PlatformSDKCS;
using ImageSourceModuleCs;
using IMVSFastFeatureMatchModuCs;
using System.Collections.Generic;


/*****************************************
 * Example explanation:Example of multi process control operation
 * Logic Control:Single run, each flow execute once
 * Continuous run:continuous run, each flow execute continuous
 * 示例说明: 获取流程对象,模块对象,设置参数,运行,获取结果
 * ***************************************/
public class UserGlobalScript : UserGlobalMethods, IScriptMethods
{
    /// <summary>
    /// Init
    /// </summary>
    /// <returns>Success:return 0</returns>
    public int Init()
    {
        //SDK init
        return InitSDK();
    }

    /// <summary>
    /// execute function
    /// Single run:the function execute once
    /// Continuous run:Repeat the function at regular intervals
    /// 运行函数
    /// 单次执行:该函数执行一次
    /// 连续执行:以一定时间间隔重复执行该函数
    /// </summary>
    /// <returns>Success:return 0</returns>
    public int Process()
    {
        //m_operateHandle SDK handle
        if (m_operateHandle == IntPtr.Zero)
        { return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }

        //All processes are executed by default
        //If execute in your own define logic,please remove the function :DefaultExecuteProcess, Create your own logic function.
        //默认执行全部流程,
        //如果自定义流程执行逻辑,请移除DefaultExecuteProcess方法,编写自定义流程执行逻辑代码
        int nRet = 0;

        IMVSFastFeatureMatchModuTool fastFeatureTool = (IMVSFastFeatureMatchModuTool)VmSolution.Instance["流程1.快速匹配1"];
        VmProcedure pro1 = (VmProcedure)VmSolution.Instance["流程1"];
        if (fastFeatureTool != null)
        {
            FastFeatureMatchParam matchParam = fastFeatureTool.ModuParams;
            if (matchParam != null)
            {
                //设置快速匹配模块运行参数
                matchParam.MaxMatchNum = 10;
            }
        }
        if (pro1 != null)
        {
            pro1.Run();
            //获取快速匹配模块的运行结果
            FastFeatureMatchResult matchResult = fastFeatureTool.ModuResult;
            if (matchResult != null)
            {
                //获取匹配个数
                int matchnum = matchResult.MatchNum;
                //获取匹配点
                List<PointF> matchpoint = matchResult.MatchPoint;
                int a = 0;
            }
        }
        return nRet;
    }
}

方案效果测试

完成该方案的搭建后,可在VM软件上测试方案效果。

测试需求2实现效果

如以下视频所示,流程1的快速匹配模块的最大匹配个数在流程1执行前的初始值为5。流程1和流程2批量执行后,该参数的值自动设置为10。

测试需求3实现效果

可在全局脚本中调用MessageBox.Show方法打印全局脚本获取的模块结果,验证全局脚本是否已成功获取。如果弹窗中显示了模块结果的值,则说明全局脚本获取模块结果成功。

如下视频仅以打印匹配个数为例进行说明。