labview 视觉全网最精简零基础全套视频教程


第一篇博客当中说了Labview 的优势,其中就有一项就是可以和Matlab和Opencv混合编程,今天就说一下用Labview调用Opencv,当然网上也有人分享出来怎么去做这个动态链接库,但是针对于图像处理的还不多,至少我看到的都是调用windows的动态链接库,其实也都很简单就是把一维的处理变成二维的处理,网上也有不少例程,我在这个过程当中也因为粗心大意遇到一些问题,今天就把这块详细的说一说,每一步都有图,都有解释。

今天主要用的函数就是下面这个

labview调用opencv 如何封装dll labview图像转到opencv图像_数组

调用库函数,双击之后你会发现有个地方是需要输入库的地址的,也就说你要有自己的库让Lv来调用,而这个库,我们用opencv的函数去写,然后用Lv来调用,这就是所谓的混合编程了。下一步就是要写自己的图相处理的库函数。我用的是VS2013,建立一个dll的工程。看图说话。

labview调用opencv 如何封装dll labview图像转到opencv图像_动态链接库_02

这个在百度知道里边有详细的方法,所以我就直接上代码了。。 很简单的一个功能,先进行方框滤波,然后边缘检测,我就是随便弄的一个处理过程,说明问题就好,先看一下用VS运行之后的效果。

#include <opencv2\opencv.hpp>

using namespace cv;

#define WINDOW_NAME1 "[原始图片]"

#define WINDOW_NAME2 "[效果窗口]"


Mat g_srcImage; Mat g_templateImage; Mat g_resultImage;

int g_nMatchMethod;

int g_nMaxTrackbarnum = 5;


void on_Matching(int, void*);

int main()

{

    Mat image = imread("333.png");

    Mat temp;

    cvtColor(image, image, CV_BGR2GRAY);

    boxFilter(image, image,-1,Size(5,5));

    Canny(image, image, 150, 100, 3);


    imshow("2", image);

    //imwrite("2.jpg", image);

    waitKey(0);




}

labview调用opencv 如何封装dll labview图像转到opencv图像_动态链接库_03

没错就是以前用的图片就拿出来用了,能说明问题就好,在新建的dll库中添加这段代码。你会发现非常的简单了。

#include <opencv2\opencv.hpp>

using namespace cv;




_declspec(dllexport)  void add2(int rows, int cols, unsigned __int8 *data)

{

    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);




}

没错就是这样了。这里边注意几个问题,就是输出dll比我们正常编程序在函数前面会有dllesport,字面意思也就是dll输出了,当然还有输入就是dllimport,具体为什么这样在http://www.cnblogs.com/paopao/archive/2006/05/08/393924.aspx这博客当中有很好的说明了,我就不赘述了,还有一点就是我们要输入一个图像,而Lv中的图像数据是有自己的结构的,而opencv中也有Mat结构,他们俩的联系就是数组了,所以我们的图像输入变量就必须是个数组指针,把这个数组的数据给opencv的Mat结构,这样就把他们两个联系起来,其实很简单,就是数据结构的问题,当然后来数据结构的问题也是困扰我最久的问题,这里边很多细节细节。滤波和边缘检测的这两个函数要求图像必须是灰度图像,所以定义的data是8位无符号的数据类型,等下在Lv中也有相应的设置,还有一个问题就是,很多人可能会说我的这个函数没有输出,确实没有输出,因为我把最终的图像又还给了输入的图像,这样反正就是少了一个参数,如果你要是写比较复杂的函数,其实中间变量temp就可以充分发挥作用了,只要把最终结果给image就可以。这个函数编译一下就OK了,在Debug文件夹下会发现一个dll文件。

labview调用opencv 如何封装dll labview图像转到opencv图像_库函数_04

这个就是我们做好的函数库,下面来看一下Lv中的设置。

labview调用opencv 如何封装dll labview图像转到opencv图像_数据_05

第一页需要修改这两个地方。不用说了,很简单。

labview调用opencv 如何封装dll labview图像转到opencv图像_数据_06

图像行列都是有符号32位,而图像数据是无符号8位的数据,要跟我们库函数中的定义保持一致。确定就可以,确定之后发现多了三个输入量,

labview调用opencv 如何封装dll labview图像转到opencv图像_库函数_07

输出就直接连data就可以了,因为在库函数当中我们把最终结果,给了data,前面板就可以看到最终图像,跟我们在opencv当中的效果是一样的。

--------------------- 

作者:聪聪那年_