从零开始:如何使用VM3.4接口进行二次开发(C/C++)
VM算法平台SDK提供基础接口、展现接口、平台数据接口、平台控制接口,使用该SDK可对接VM算法平台,灵活地开发和扩展机器视觉应用。SDK提供C/C++和C# 两套接口,同时分别提供两套接口的Demo,可参考Demo查看接口的使用方法。本文主要以C#为例,介绍如何从一个新工程开始,通过调用VM算法平台3.4SDK的外部接口,实现一个简单的圆定位和读码的程序。

一、环境配置

1. 首先新建一个MFC工程,添加相应的头文件和库包含目录,如图1-1所示。





图1-1 添加相应的头文件


2. 将二次开发相关 DLL 文件添加到 Demo 软件的工作目录下,相关DLL可在VM算法平台安装路径的VisionMaster3.4.0\Development\Libraries中找到,需注意对应的平台位数。如图1-2。



图1-2 相关DLL路径


3. 添加附加库目录路径,并在链接器中的附加依赖项添加依赖的库文件 iMVS-6000PlatformSDK.lib,如图1-3所示。





图1-3 链接器配置


4. 包含二次开发 C 接口头文件 #include "iMVS-6000PlatformSDKC.h"。
此时,VM算法平台二次开发的环境已配好。


二、接口的调用

1. 接口调用流程

VM算法平台接口主要分为基础接口、展现接口、平台数据接口、平台控制接口,一个完整的二次开发接口调用如图2-1所示。


图2-1 接口调用流程


2. 创建句柄

按照上面流程,首先创建句柄,创建句柄接口可放在初始化函数中,如图2-2所示。


图2-2 创建句柄


注意:当VM算法平台启动后,界面软件异常退出时VM算法平台并没有退出,依然在后台,此时创建句柄会导致失败,需要手动关闭VM算法平台进程后再创建句柄。或者可在创建句柄接口前判断进程程序强杀VM算法平台防止此类情况。


3. 注册回调函数

VM算法平台二次开发是通过回调的方式将算法平台底层运行时的数据反馈给用户,目前包括①按数据类型,②以模块结构体方式,③只回调用户在界面上配置的所需的导出结果,三种回调方式,这里以较为常用的以模块结构体方式为例进行开发。


图2-3 注册回调函数


4. 添加回调实现函数和数据接收函数

添加回调实现函数和数据接收函数,如图2-4,图2-5。


图2-4 回调实现函数


图2-5 回调结果数据


具体的模块数据我们可以通过添加接收函数来筛选获取,这里我们暂时先不添加。
在回调结果数据函数中,我们可以通过筛选pstInputPlatformInfo->nInfoType来获取到以下内容,具体可参考VM算法平台安装目录下demo,本文不再举例。

至此,注册回调函数已经完成。


5. 搭建如图2-6的界面

VM算法平台的图像显示及结果渲染有两种方式:①通过回调获取图像数据,结果数据后,使用我们已封好的MvRender.h 中的函数渲染到Picture control控件中;②通过提供的嵌入前端界面接口将VM算法平台方案中的前端运行界面嵌入到Picture control控件中,这样图像源及渲染结果数据只需在VM中配置好,无需再从回调中获取。本文以嵌入前端界面为例来开发。


图2-6 界面搭建


6.控件功能实现部分添加
启动按钮:在本文示例中,我们将启动按钮的实现部分分为3部:①启动VM算法平台,②加载Sol方案,③嵌入前端界面。
如图2-7,首先,通过调用IMVS_PF_StartVisionMaster接口来启动VM算法平台,然后通过调用IMVS_PF_LoadSolution加载方案,最后通过IMVS_PF_AttachFrontedWnd嵌入前端界面。其中m_hwndDisplay为Picture Control窗体句柄,可在初始化时通过m_hwndDisplay = GetDlgItem(IDC_STATIC)->GetSafeHwnd(); 来获取到。


图2-7 启动按钮功能实现


执行一次按钮:目前执行一次有IMVS_PF_ExecuteOnce和IMVS_PF_ExecuteOnce_V30接口,区别为IMVS_PF_ExecuteOnce接口会触发所有流程,而IMVS_PF_ExecuteOnce_V30可以触发指定流程(流程1为10000,流程2为10001,以次后推)。


图2-8 运行一次按钮实现代码


关闭VM按钮:通过调用IMVS_PF_CloseVisionMaster_CS接口实现VM算法平台的关闭。


图2-9 关闭VM按钮实现代码


至此,整体软件流程已完成。


三、方案搭建
1. 首先,我们使用VM算法平台搭建好找圆和读码的视觉方案,如图3-1。



图3-1 VM算法平台方案


然后在运行界面这里进行数据配置,绑定好需要渲染的模块结果并保存,这里我们可以将画面数设为2,然后分别在左窗口显示查找圆的结果,在右窗口显示读码结果,如图3-2。



图3-2 前端界面绑定数据


2. 然后我们在之前的回调接收数据函数中添加相关代码,从圆查找模块中获取所有运行结果,提取出x,y,半径的运行结果,如图3-3。本文是通过判断pstPFModuResInfoList->strModuleName的方式筛选需要获取结果的模块,需要其他模块结果同理,只需将MODU_NAME_CIRCLEFINDMODU替换为想要的模块就可以。



图3-3 从圆查找模块和读码模块中获取所有运行结果


四、最终软件效果

如图4-1所示,,执行一次后,分别获取到圆信息和二维码信息,并将结果渲染到窗口界面。



图4-1 软件效果


版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

从零开始:如何使用VM3.4接口进行二次开发(C#)

下一篇

从零开始:如何通过VM3.4二次开发进行手眼标定

评论请先登录 登录
全部评论 2

本文主要以C++/MFC为例

2022-02-27 10:10:12
回复

学习了😛

2022-02-20 16:50:33
回复
  • 1
7
创作
22
粉丝
26
获赞
相关阅读
  • 浅谈visionMaster应用感受及优缺点。
    2022-06-13
  • 海康机器人“悉灵杯”课题研究活动-入围公布
    2022-05-31
  • 浅谈visionMaster 通讯的应用(非常好用)
    2022-06-16
  • IDP5104 PDA产品开箱体验和使用分享
    2022-05-30
  • 一篇文章教会你如何计算镜头延长环
    2022-06-08

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器