为什么会有把二者结合这个想法,主要是在接触过这两种工具后,发现它们对图像处理有自己独特的优势,但也有自己的缺点,借助C++,opencv可以实现许多自己想实现的功能,但是在界面设计上得花另一番功夫,Labview的长处就在于它的界面设计简单,控件拖拽所见即所得,与QT有点类似,当然QT的跨平台性是labview比不了的,可是labview在功能实现上的快速性和简洁性也是较大的优势,对labview稍微熟悉一点即可实现许多强大的功能。(当然,用什么都只是工具,主要是掌握方法与思想)
话不多说,进入正题:软件版本Labview2015 64位英文版(要安装VISION Acquisition Software组件) 和 Visual Studio 2015,注意生成的DLL要与Labview版本一致,都是64位才可以,否则会有其他的调用问题。
我这里有两种图像数据来源,一种是直接调用本地图片,另一种是通过labview调用摄像头传输视频,可以做到实时的图像传输和图像处理。二者的区别只在Labview的设计上有稍许差别,Dll的内容是一致的。
既然DLL的内容一致,那就先介绍DLL的设计,前面几篇中有讲到VS如何创建DLL,可以翻看前面的内容,这里是调用软件发生改变,不再是由VS自己调用,而是通过Labview来调用,步骤差别不大。
dll.h头文件的定义如下:
#pragma once
#include
#ifdef DLL_IMPLEMENT
#define DLL_API _declspec(dllimport)
#else
#define DLL_API _declspec(dllexport)
#endif
extern “C” DLL_API void add2(int rows, int cols, unsigned __int8 data);
extern “C” DLL_API int ImgdatatoLabview(unsigned __int8 imgdata);
extern “C” DLL_API int getimagesize(int rows, int cols);
void add2(int rows, int cols, unsigned __int8 *data)是接收从labview传来的数据进行图像处理,注意参数类型,unsigned __int8 *data是指针类型,由于opencv中的图片数据类型是Mat型,而Labview里面没有Mat类型,所以要通过指针/数组来实现数据的传递。
下面是对图像处理函数主体,完成的是一个调用opencv里的Canny边缘提取函数。可以看到将image_src与关联到指针的首地址,经过图像处理后,最后的结果又返回到了image_src上,所以即便该函数没有返回值,也是能实现图像经过处理后传回到Labview。
_declspec(dllexport) extern void add2(int rows, int cols, unsigned __int8 *data)//接收labview传过来的图像数据进行处理,图片来源于labview的采集
{
Mat image_src(rows, cols, CV_8U, &data[0]);
/* Insert code here */
Mat temp;
boxFilter(image_src, temp, -1, Size(5, 5));
Canny(temp, image_src, 150, 100, 3);
}
Labview的设计
1、源图像来源于本地图片文件,Labview前面板可看到一下效果,在运行前先选择文件目录即可。
后面板逻辑:调用动态链接库控件的位置在Connectivity->Libraries & Executables->Call Library Function Node
调用DLL参数设置,尤其注意指针data的数据类型为Array,Dimention为2
![](https://upload
-images.jianshu.io/upload_images/22861276-ea1dfe3fa5045bed?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2、源图像来源于usb摄像头,这种方式需要安装NI VISION Acquisition组件,也就是下图所示的控件
前面板如下所示,图一是摄像头原图,图二是灰度图,图三是从opencv经过Canny边缘检测后返回的结果图
后面板逻辑如下:这里包括了两个没讲的DLL,可以先跳过这看完另外两个DLL的解释
其实前面的功能也已经实现了将处理好的图像返回到labview显示,这里只是再更直观的体现一下图片来源于opencv
这里就涉及到另外两个DLL的使用一个是getimagesize获取图像文件大小的(获取行列数才可以在labview里初始化数组的大小),另一个是 ImgdatatoLabview实现图像的处理和传递(其实和第一个DLL功能类似,只是图像大小需要通过另一个DLL获得)