opencv與Labview的結合(Dll呼叫)

2022-09-06 16:45:09 字數 3269 閱讀 1578

為什麼會有把二者結合這個想法,主要是在接觸過這兩種工具後,發現它們對影象處理有自己獨特的優勢,但也有自己的缺點,借助c++,opencv可以實現許多自己想實現的功能,但是在介面設計上得花另一番功夫,labview的長處就在於它的介面設計簡單,控制項拖拽所見即所得,與qt有點類似,當然qt的跨平台性是labview比不了的,可是labview在功能實現上的快速性和簡潔性也是較大的優勢,對labview稍微熟悉一點即可實現許多強大的功能。(當然,用什麼都只是工具,主要是掌握方法與思想)

話不多說,進入正題:軟體版本labview2015 64位英文版(要安裝vision acquisition software元件) 和 visual studio 2015,注意生成的dll要與labview版本一致,都是64位才可以,否則會有其他的呼叫問題。

一、從labview傳遞影象資料到opencv中,經過影象處理後又將處理結果返回到labview顯示。(源**於labview這端)

既然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的採集

labview的設計

呼叫dll引數設定,尤其注意指標data的資料型別為array,dimention為2

2、源影象**於usb攝像頭,這種方式需要安裝ni vision acquisition元件,也就是下圖所示的控制項

前面板如下所示,圖一是攝像頭原圖,圖二是灰度圖,圖三是從opencv經過canny邊緣檢測後返回的結果圖

後面板邏輯如下:這裡包括了兩個沒講的dll,可以先跳過這看完另外兩個dll的解釋

二、從opencv傳遞影象到labview,即源影象**於opencv(本地檔案或者呼叫攝像頭都可以)

其實前面的功能也已經實現了將處理好的影象返回到labview顯示,這裡只是再更直觀的體現一下**於opencv

這裡就涉及到另外兩個dll的使用乙個是getimagesize獲取影象檔案大小的(獲取行列數才可以在labview裡初始化陣列的大小),另乙個是 imgdatatolabview實現影象的處理和傳遞(其實和第乙個dll功能類似,只是影象大小需要通過另乙個dll獲得)

_declspec(dllexport) extern

int getimagesize(int* rows, int*cols)

**其實很簡單,只是需要注意從opencv獲取的行列資訊要以指標的形式傳出,所以看到函式的引數都是指標。

所以在labview呼叫該dll的引數設定上也要注意資料型別,如下圖所示

imgdatatolabview功能**實現:將原圖由rgb轉換為gray型別傳遞到labview

_declspec(dllexport) extern

int imgdatatolabview(int rows,int cols,unsigned __int8 *imgdata)

**也比較簡單:

引數rows和cols就是接收來自getimagesize函式的返回值,而*imgdata指標關聯到,和第乙個dll功能基本一致

同樣注意該指標引數在labview的設定     二維陣列

labview最後的功能實現,第四張就是得到的灰度,前面板如下所示,後面板和第一部分裡的一樣,就不再貼圖了。

LabVIEW上位機與串列埠通訊

大一的時候,學校開了門公共選修課,叫labview程式設計,當時的我當然還不知道labview是啥東東,但還是選了。上課的老師是機械學院的乙個副教授,他給我們展示了好幾個用labview做的專案,譬如油箱監控上位機等,已經不太記得了。後來隨著學習微控制器 arm等的串列埠操作,有時候乙個漂亮的上位機...

LabVIEW與MATLAB聯合程式設計

labview與matlab的聯合程式設計一般可以通過2種方式進行 1.公式節點 formula node 2.matlab指令碼節點 matlab script node 1.公式節點 formula node 位置 函式選板 數學 指令碼與公式 公式節點 在程式框圖上計算數學公式和類似於c語言的...

LabVIEW的應用行業與組成部分

應用行業 labview開發語言相對於c與c 來講的話,是比較年輕的!labview它主要應用於以下幾個行業 工業製造,高校研究。首先,工業製造行業裡的軟體開發所使用的語言一般都是這3種 c labview,vb。由於labview有乙個很大的優點 開發速度快,所以在工業製造行業用的還是挺多的。其次...