本文详细讲述如何将OpenCV包含的函数创建成LabVIEW可调用的且具有NI Vision图像数据接口的动态链接库程序。

LabVIEW调用OpenCV函数的方法网络上可以找到很多,通常是编写动态链接库(.dll)供LabVIEW进行调用,这种方式在LabVIEW真正使用时给编程人员带来很多麻烦,比如,NI Vision的图像数据需要转换为指针或数组后才能传递给编译好的dll进行数据交互,而且编写的dll如果不够规范或没有异常数据处理功能,那么两者间的图像数据传递很难完成,频繁的报错会让系统崩溃,繁琐的转换会拖慢程序的运行速度。本文虽然也采用创建动态链接库的方法,但不同的是,该方法所生成的dll具有IMAQ Image类的句柄,便于图像数据的传递,增强调用库函数的稳定性,提高程序代码的简洁程度。

labview调用opencv的算子 labview与opencv_labview调用opencv的算子

操作步骤

注:本文以VS2017 + OpenCV4.3.0 + LabVIEW2018(64bit)为例,详细讲述安装过程,如在安装过程中有错误请上网查阅相关资料进行修改调试。需要注意的是,OpenCV后期版本已经不支持32位库,所以需要使用64位LabVIEW进行调用。若一定使用32位LabVIEW,可参照此篇教学,配置前期支持32位版本的OpenCV环境。

1、安装VS2017(推荐使用社区版)

VS下载地址:https://my.visualstudio.com/Downloads?q=Visual Studio 2017

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_02

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_03

安装后重启计算机

2、安装并配置OpenCV4.3.0环境

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_04

OpenCV下载地址:https://opencv.org/releases/

(下载解压后将文件夹放在一个固定位置,本文放在D盘)

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_05

添加OpenCV环境变量

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_06

新建项目

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_07

新建属性表

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_08

配置属性表(一)

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_09

配置属性表(二)

3、VS2017中配置NIVision OpenCV Utilities工具包环境

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_10

添加附加包含目录:$(NIVISION_OPENCV_PATH)\nivisionextlib\include

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_11

添加附加库目录:$(NIVISION_OPENCV_PATH)\nivisionextlib\$(Platform)\vc90\lib

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_12

添加附加依赖项:nivisext.lib

4、安装NIVision OpenCV Utilities工具包

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_13

以管理员身份打开VI Package Manager,选择64位LabVIEW,搜索opencv,安装NIVision OpenCV Utilities,安装完成后重启计算机。

若不想在线安装,也可以下载该工具包,手动安装,但是依然要先以管理员身份打开VI Package Manager。

链接:https://pan.baidu.com/s/12e_y-w-ntzlgHuwyIlu_og

提取码:7kbo

5、制作OpenCV函数动态链接库(.dll)

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_14

打开之前建立的C++项目,新建程序文件

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_15

写入代码

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_16

生成动态库(.dll)

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_17

在C++项目路径中找到生成的.dll文件

泊松融合(C++代码)实例:

链接:https://pan.baidu.com/s/1Qnn4XOP0rhd6z6LyWNYBKA

提取码:chwj

6、LabVIEW调用函数动态链接库(.dll)

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_18

LabVIEW 64位中建立动态链接库函数

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_19

配置动态链接库函数

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_20

测试效果

泊松融合(LabVIEW代码)实例:

链接:https://pan.baidu.com/s/1xYF1MMS-s12N1RZenZtW1w

提取码:5yxw

NIVision OpenCV Utilities工具包是NI官方制作的,除了NI论坛里有几个人探讨该工具包,很少有人去真正的研究它、使用它。在这里也不妨看出官方的良苦用心,安装该工具包后,可以在安装路径下找到程序例程C++源码,我们可以参照这些代码去编写自己的动态链接库程序。

labview调用opencv的算子 labview与opencv_labview调用opencv的算子_21

labview调用opencv的算子 labview与opencv_opencv 测试安装完成_22

NIVision OpenCV Utilities工具包中自带的OpenCV函数C++代码例程

安装后若找不到官方例程可直接下载:

链接:https://pan.baidu.com/s/1nJZuzBdbavqzVlqtUwbhtw

提取码:g4w6

官方例程唯一的缺点是没有去教大家如何配置环境、如何生成动态链接库,C++代码中各类图像数据格式的定义和匹配也没有过多的介绍,这需要同时掌握OpenCV和NI Vision的工程师才能看懂和使用。

后续我会为大家详细解析例程中的C++源码,介绍一些OpenCV的编写技巧。使大家可以编写自己需要的OpenCV函数动态链接库程序,敬请期待!