本文主要是介绍labview调用opencv 如何封装dll labview图像转到opencv图像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
labview 视觉全网最精简零基础全套视频教程
请扫码助教获取教程
http://t.elecfans.com/c801.html
第一篇博客当中说了Labview 的优势,其中就有一项就是可以和Matlab和Opencv混合编程,今天就说一下用Labview调用Opencv,当然网上也有人分享出来怎么去做这个动态链接库,但是针对于图像处理的还不多,至少我看到的都是调用windows的动态链接库,其实也都很简单就是把一维的处理变成二维的处理,网上也有不少例程,我在这个过程当中也因为粗心大意遇到一些问题,今天就把这块详细的说一说,每一步都有图,都有解释。
今天主要用的函数就是下面这个
调用库函数,双击之后你会发现有个地方是需要输入库的地址的,也就说你要有自己的库让Lv来调用,而这个库,我们用opencv的函数去写,然后用Lv来调用,这就是所谓的混合编程了。下一步就是要写自己的图相处理的库函数。我用的是VS2013,建立一个dll的工程。看图说话。
这个在百度知道里边有详细的方法,所以我就直接上代码了。。 很简单的一个功能,先进行方框滤波,然后边缘检测,我就是随便弄的一个处理过程,说明问题就好,先看一下用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);
}
没错就是以前用的图片就拿出来用了,能说明问题就好,在新建的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文件。
这个就是我们做好的函数库,下面来看一下Lv中的设置。
第一页需要修改这两个地方。不用说了,很简单。
图像行列都是有符号32位,而图像数据是无符号8位的数据,要跟我们库函数中的定义保持一致。确定就可以,确定之后发现多了三个输入量,
输出就直接连data就可以了,因为在库函数当中我们把最终结果,给了data,前面板就可以看到最终图像,跟我们在opencv当中的效果是一样的。
---------------------
作者:聪聪那年_
来源:CSDN
原文:https://blog.csdn.net/woshilicong33/article/details/54178091
版权声明:本文为博主原创文章,转载请附上博文链接!
这篇关于labview调用opencv 如何封装dll labview图像转到opencv图像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!