如何在LabView中使用MVDAlgotihrmSDK进行视觉开发
LabVIEW是一个开放平台,可以集成很多第三方的库,海康机器视觉平台算法库是一个非常优秀的机器视觉算法库,算法效率高,精度高,稳定可靠,在LabVIEW中使用海康算子开发机器视觉应用,如鱼得水,如虎添翼。本文介绍如何在LabVIEW中集成海康机器视觉算法库,可以帮到一些入门的用户,对于一些精通LabVIEW开发的用户来说也是值得参考的,可以加深对LabVIEW平台和其他平台差异的理解。

如何在LabView中使用MVDAlgorithmSDK

一  预备知识

1.  LabView的发展史和国内生态

LabVIEW自1986年问世以来,经过不断改进和更新,已经从最初简单的数据采集和仪器控制的工具发展成为科技人员用来设计、发布虚拟仪器软件的图形化平台,成为测试测量和控制行业的标准软件平台。现在,LabVIEW已经发展成为一个平台软件,用户可以在LabVIEW上开发数据采集与监控、机器人控制、FPGA芯片开发、运动控制与仿真、机器视觉、机器学习、音视频开发、自动化测试等各个领域的应用程序开发,是一个包罗万象的软件平台,它用图形化的编程语言接口可以为工程师快速实现应用程序的开发。LabVIEW的具有极高的开发效率,举例来说,相同功能的应用程序,如果用C++开发需要半年时间,而使用LabVIEW可能仅仅需要数个星期,正是这种极高的开发效率,受到很多工程师的青睐。

但是,目前国内LabVIEW的应用生态发展远不如美国和欧洲,尽管国内使用LabVIEW的用户非常的巨大,但是绝大多数用户都只是知道怎么使用LabVIEW已有的模块,而不具备开发LabVIEW模块的能力。使用LabVIEW做应用的大都不是专业的软件工程师或程序员,而是某个特定领域的专家(例如大学教授),或者是工厂车间的技术员,电气工程师,PLC控制工程师,机械工程师,仪器仪表研发工程师等,一般都不太熟悉除了LabVIEW以外的编程语言,这和Lab VIEW在国外的应用情况是大不相同的,如果用户熟悉LabVIEW以外的编程语言。例如C++, C#, Java, Python等,就会发现LabVIEW只不过是文本编程语言封装成了图形化语言,核心还是算法,数据结构,软件设计模式。实际上LabVIEW是一门易学难精的语言,对大部分人来说它的学习曲线是这样的:

大多数人都有一个相当漫长的爬坡期,学习了3个月初学者和一个学习了3年的老师傅的差距并不大,差距只在熟练程度而已,真正有所感悟,终于领悟到LabVIEW设计模式的精髓可能是在学习了7,8年之后。(实际上这符合所有领域的学习曲线,按照一个星期5天学习,每天学4小时,一周学习20小时,需要500周左右,大约10年才能成为领域资深专家,这就是所谓的1万小时定律)。

在LabView和文本类编程语言的区别

2.1.LabVIEW程序是数据流驱动的

一句话就能概括LabVIEW概括LabVIEW的编程特点:LabVIEW是以数据流来驱动的。

数据流驱动是什么意思?意思就是说,LabVIEW是按照数据的流动方向来驱动着程序往前执行的。例如:

这个程序的执行顺序就是:先执行加法,再执行减法,接着执行乘法,最后执行除法。

如果你要写成下面这种方式:

那加,减,乘,除的执行顺序是无从知晓的(几乎是同时执行的)。

许多新手并不完全了解“数据流”执行背后的概念,其中一个现象是他们往往在程序框图中过度使用平铺式顺序结构。这些新手经常依赖平铺式顺序结构来实现程序框图的代码串行执行,而不是使用数据流和节点之间的连线。

2.2.文本编程语言是以变量驱动的

在文本编程中,要实现用户逻辑,必须按照数据类型先定义一些变量,然后通过操控变量来实现用户逻辑。举例来说,我们要实现1+2+3+…+100的累加求和程序,很简单,如下:

必须先定义一个sum变量来缓存for循环中的每一次的临时结果。如果按照这个概念去编写LabVIEW程序就会是下面这样的结果:

这样写结果虽然是对的,但是没有理解LabVIEW的语言的特点,再强调一遍,LabVIEW是数据流驱动的,这个Sum局部变量是多余的,没有必要创建一个局部变量,如果你真正了解了LabVIEW的语言特点后,正确的写法应该是下面这样的:

对于文本编程语言来说,通过变量传递数据是必需的,但LabVIEW则提供了一种数据流方法,可将数据从程序的一个部分移动到另一个部分。LabVIEW固有的并行性机制决定着用户不能过度使用变量。如果过度使用变量,则会出现某个读/写操作赢了“竞争”,而其他操作则输了“竞争”,丢失数据的操作会被忽视,因此在LabVIEW中过度使用变量可能会最终导致数据丢失。

2.3. LabVIEW程序是天然并行的

文本类语言编程,程序的执行是靠语句安排的先后顺序,按照顺序执行的,比如,你要显示一幅图像,然后在图像上显示一个矩形框。这个逻辑应该是这样的:

程序执行后,你得到了你想要的效果,如下:

如果你在LabVIEW程序中这样写,如下所示:

你发现,只显示了图像,矩形框不见了?为啥?

因为在执行ImageView设置图像源的同时,也在添加矩形框,添加的矩形框被图像给冲刷掉了,在底层绘制一个矩形框可能连1ms都不需要就已经绘制完成了,而绘制一幅图像可能需要几十毫秒,所以,实际的执行效果是,矩形框绘制完成,然后才是图像绘制完成,最后图像覆盖了矩形框。所以正确的做法应该是让数据流动起来,按照数据流的方向决定模块的执行顺序,如下:

通过ImageView的引用这个数据流的走向来决定模块的执行顺序。这样自然就不会出现和预期不一致的结果。

4.LabVIEW的VI执行完成就会立即释放资源

这一点很多初级LabVIEW用户可能并不能意识到,其实这个在文本编程里面也是一样的,VI其实就是对应文本编程语言中的函数,函数中所有变量和类对象是临时对象,用C++语言来说,就是将亡值。这一点对于习惯文本编程的用户来说,几乎是一入门就知道的基础知识。如下所示:

(以下代码并不具有实际意义,仅为说明问题)


在函数外部a这个变量已经不复存在了,somArray这个数组也不复存在了,HPFeatureMatchTool 的实例tool 也将不复存在(但是这个tool所占据的内存没有被释放,因此存在内存泄漏)。

在LabVIEW中,如果你用下面的方式调用算子,如下图所示:

这看起来似乎是没有问题的,而且运行结果也是对的,但是这这样做效率不高,为啥?因为HPFeratureMatchTool 每次运行都创建了一次,这样做的代价太大了,也就是每一次的运行都重新创建算子实例(背后是每次都要给算子分配内存并初始化一次),这会导致算子的每一次运行都是第一次运行,正确的做法是创建了HPFeatureMatchTool的实例之后,就进入一个While循环,循环里面用事件来执行你的代码。如下所示的那样才是正确的做法:


三  在LabView中使用MVDAlgorithmSDK的方式

3.1.    以调用C/C++函数库的API方式,添加函数调用节点(不推荐)

例如我们要调用MVDAlgorithmSDK提供的API函数,需要添加一个函数调用节点,然后定位MVDAlgorithmSDK 的动态链接库所在位置,选择对应的dll。

MVDAlgorithmSDK动态链接库的默认安装位置如下所示:

C:\Program Files (x86)\MVDAlgorithmSDK\Runtime\x64

如果您安装海康机器人算法平台软件的时候选择了其他目录,则需要搜索一下MVDAlgotithmSDK这个文件夹,就可以找到算子的库引用所在路径了。

举例来说,我们调用MVDAlgorithmSDK提供的圆查找算子,就需要一个个的添加MVD_Algorithm.dll,MVDImageCpp.dll,MVDCommon.dll,

MVDCircleFindCpp.dll等dll的引用,然后选择合适的API,通过函数调用节点来调用,如下所示:

接着在配置函数的输入参数,如下所示:

由于LabVIEW只能获取到dll中的函数名称,而不能确切的指出函数每个参数对应的类型,所以需要用户对海康的算法平台有非常深入的了解,了解每个API的函数参数的类型和作用。这对绝大多数客户来讲几乎是不太可能做得到的。即便有海康的算法平台使用手册在手,你也不可能对每一个函数背后的执行逻辑,要实现一些功能,需要调用哪些API,并且这些API的调用先后顺序是怎样的,要有非常深入的了解。最要命的是,并不是所有函数的输入都是基本数据类型(整数,浮点数,字符串,指针类型),如果函数的输入参数是个海康定义的内部的数据类型(比如ROI,比如输入掩膜图像等等),您又当如何处理?(需要封装成蔟类型),因此,这里十分不推荐这种方式去使用海康算子SDK。

2.    以.net互操作添加引用(推荐)

MVDAlgorithmSDK 其实更加适合使用C#的方式去调用,而不是使用C/C++的方式去调用(当然也支持C++方式),这是因为海康算子SDK一开始就是冲着对标行业一流的算子SDK去的,举例来说,美国的某知名机器视觉厂商某耐视,其VisionPro 的SDK就是使用C#或VB.net 方式调用的,而不是C++的方式去调用(至少在10.0以前的版本是没有C++接口的)。

我们还是以调用圆查找算子举例,来说明如何调用算子SDK。首先,在后面板选择.net互操作,如下所示:

然后选择MVDAlgorithmSDK 的.net dll函数库所在路径,如下所示:

默认情况下,海康算子SDK的.net 动态函数库的路径如下:

具体算法库路径如下所示:

C:\Program Files (x86)\MVDAlgorithmSDK\ReferencedAssemblies\Algorithms

公用库:

C:\Program Files (x86)\MVDAlgorithmSDK\ReferencedAssemblies\Common

所以调用圆查找算法可以用LabVIEW在程序面板这样写:

        这种方式使用起来,相比第一种方式是极大的简化了SDK的使用。

四  MVDAlgorithmSDK如何使用

海康的软件研发工程师早就为用户做了很多的额外初始化工作,根本就不需要用户了解底层的细枝末节(例如算子是怎么分配内存的?图像数据是怎么给到算子的?初始化时的一些默认参数究竟设置成多少才不至于运行结果不达预期?),要问调用海康算法平台SDK总共分几步?我来告诉你,总共只需要3步:

以调用特征匹配算子举例:创建算法实例,就是添加一个算法工具的构造节点,如下所示:

接着第二步,设置必要输入,对绝大多数算子工具来说,必要输入就是输入图像,其他都是可选输入(ROI也算是可选输入,不设置ROI默认就全图处理),但对于特征匹配来说,必要输入除了输入图像,还有特征匹配模型文件,这个文件是通过特征匹配模型训练工程生成的一个本地文件。所以如下图所示:

第三步就是运行程序并获取结果,比如我们要获取匹配点坐标,则如下所示:

经过上面几个步骤,就已经实现了在LabVIEW中调用MVDAlgorithmSDK的特征匹配算子了。

案例演示

我们还需要对C#的算子再做一层浅封装(当然不做也是完全可以的),这样做的目的是为了更方便在LabVIEW中集成,还是以LabVIEW中集成特征匹配算子为例,我们用C#对特征匹配算子做成一个函数,也就是把上面说的经典3步走(创建实例,设置参数,运行和获取结果)合并为一步。这样在LabVIEW里面集成就变得更加简洁了。

封装的思路是:把特征匹配算子的所有输入参数和输出结果变成特征匹配这个算子的属性,特征匹配算子Run( )方法里面把设置输入和获取结果这些操作合并。这样用户就只需要创建实例并运行就可以了。也就是这样:


HPFeatureMatchTool tool = new HPFeatureMatchTool(inputParam);

tool.run();

这样在LabVIEW中使用就变得非常简洁了,如下所示:

更进一步,我们将创建实例并运行封装成子VI,以此来减少连线和代码复用,把特征匹配封装成模块,而这正是LabVIEW所推崇的编程范式。因此我们定义好VI的输入输出,并给这个VI一个个性化的图标,如下所示,这是程序面板:

下面是前端面板:

我们再设计一下图标,如下所示:

我们再来看,调用特征匹配就变得非常简洁了,如下图所示:

这个长得像芯片一样,又像个八爪鱼的家伙就可以帮你实现特征匹配算法了。是不是很有意思啊。

当然仅仅又算法的运行和结果的获取是不够的,我给他再封装一个显示控件,让特征匹配的结果可以呈现出来。于是就有了下面的程序框图,如下所示:

程序的前面板,放置几个执行按钮和显示控件,如下所示:

我们接着看执行的效果图:

看到了这里,很多LabVIEW的用户可能会很关心这个显示控件是怎么做到的,其实也不难,难的是你不懂LabVIEW以外的编程语言,如果你不懂LabVIEW以外的编程语言,用纯LabVIEW语言写一个类似的图形图像渲染控件也是完全可以做得到的,那就要看你有几成LabVIEW的功力了。

关于图形图像渲染,再多说一句,LabVIEW里面如果安装了NI自家的NIVision套件,里面有一个ImageDisplay控件非常的强大,能够渲染基本的图形,如矩形,多边形,不规则的任意形状,直线,曲线,文字等,也能放大,缩小显示图形,这个控件在开发视觉应用时是比不要可少的一个控件。如下图所示:


  但我要给想使用我们海康算子又想用NIVision的用户泼一盆冷水,这个ImageDispaly只适合NIVision用,不适合第三方用,究其原因是,这个ImageDisplay渲染图像需要将图像转换为IMAQ格式图像,IMAQ图像是二维的,很多图像格式都是图像字节指针,如果要转成IMAQ图像格式,需要将一维数组转成二维数组,如果是彩色图像更加麻烦,还需要将RGB数据拼接成32位数据,补充一个透明通道数据。这是极其损失性能的,直观一点说,500万的彩色图像转换在常规配置的CPU上需要几百毫秒,这简直是无法接受的。因此,我专门开发了一个显示显示控件,用来显示海康算子的图像格式,并能和用户通过鼠标交互,可以添加,删除图形,可以放大缩小显示图像,可以鼠标指示当前坐标当前坐标位置灰度通道的数值,基本上实现了NIVision ImageDispaly 的百分之九十的功能,如果是海康算子的用户可以联系海康当地的技术支持或销售向我们索取。

五 总结

5.1  LabVIEW 是以数据流为驱动的图形化编程语言,开发效率高,海康机器视觉算子使用门槛低,易用,开发效率也很高,如果有一些用户特别青睐LabVIEW的用户界面,想要集成海康算子做一些视觉应用,希望本文能够帮得到您。

5.2  使用.net 的互操作方式在LabVIEW中集成MVDAlogrithmSDK,而不是使用C/C++动态链接库中的API。

5.3  MVDAlgorithmSDK非常易用,可以在LabVIEW中把算子的创建实例,设置参数,运行等操作做成一个子VI,这样可以做成可以复用的模块。

5.4 不要因为需要用到NIVISION的ImageDisplay就想着将海康图像格式转IMAQ图像格式,这样会损失算子性能,得不偿失。

5.5 LabVIEW的VI是一个函数过程,调用海康算子不要直接用平铺结构,需要引入一个While循环,因为海康算子在底层是一个类对象,是引用类型而不是值类型,VI调用结束意味着对象被销毁,每次调用都重新创建对象代价高。

5.6 掌握LabVIEW以外的第二门编程语言,有助于提高对LabVIEW的运行机制的理解。LabVIEW在国内的生态大多数停留在应用层面,缺少能够开发LabVIEW控件的工程师。

5.7 MVDAlogrithmSDK 易于使用,在LabVIEW中集成没有什么问题,如果用户在使用过程中遇到一些困难,可以来V社区反馈,我们会解决您的问题。

本文中涉及的案例工程,演示代码,动态链接库等源文件,如果您感兴趣或者想自己动手实践一遍,可以联系海康当地技术支持和销售咨询如何获取。

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

LabVIEW开发者请看过来,教你怎么在LabVIEW中 使用VM 4.2 应用

下一篇

“启智杯”设计大赛-一种模板匹配建模与识别控件

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

大神,能否把实例文件发一下么

2023-09-28 12:46:38 天津
回复

MVDAlgorithmSDK怎么收费的,我看SDK的部分算法库加密不能用

2023-07-11 18:34:55 未知地区
回复

文章写得相当有水平

2023-07-06 23:53:16 未知地区
回复
  • 1
Lv.0
0
关注
33
粉丝
4
创作
62
获赞
所属专题
  • 如何在LabView中使用MVDAlgotihrmSDK进行视觉开发
  • LabVIEW开发者请看过来,教你怎么在LabVIEW中 使用VM 4.2 应用
  • 悉灵杯”课题研究-LabVIEW集成及示例代码开发
  • 工业相机labview例程显示方案
  • LabVIEW基于算法平台C#版本SDK进行二次开发
相关阅读
  • 探寻机器视觉新星|第二届“启智杯”机器视觉设计大赛获奖名单公布
    2024-04-08 浏览 0
  • VM4.4更新亮点
    2024-04-12 浏览 0
  • 第二届启智杯—光伏电池片质检视觉方案设计
    2024-04-15 浏览 0
  • 每日分享|3D视觉成像之双目立体视觉原理
    2024-03-21 浏览 0
  • 海康AMR应用场景中蜂鸣器的使用
    2024-04-03 浏览 0

请升级浏览器版本

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

推荐使用以下浏览器