• 沒有找到結果。

第五章 實驗介紹與結果

5.3 DLL 實驗介紹

前 面 已 經 介 紹 完 DirectShow Filter 的 開 發 , 接 下 來 本 節 將 介 紹 以 DLL(Dynamic Link Library)的方式來封裝我們的人臉偵測系統,首先介紹一下 我們的開發環境,這是由精聯科技所提供的一個裝置如圖 5-18 所示,此裝置的 作業系統是 Windows CE,因此我們的目標就是在 Win CE 的作業系統底下開發一 個人臉偵測的 DLL,讓這個裝置的應用程式人員能夠透過 DLL 方式來呼叫我們偵 測函式達到人臉偵測的功能。

圖 5-18 實驗裝置

在開發這個 DLL 時,我們所使用的編譯器是 Embedded Visual C++,而要封 裝 DLL 其實是非常簡單的,只需要在我們一般開發的程式作一些修改即可 第一步:實現入口函式

實現 DLLMain 這個函式來提供 DLL 一個入口點,程式碼實現如圖 5-19 所示,

圖 5-19 DLLMain 程式碼

71

第二步:添加導出指令

將 我 們 要 提 供 給 外 部 使 用 者 使 用 的 函 式 前 面 加 上 導 出 指 令 __declspec(dllexport)就可以完成 DLL 的封裝,而一般我們會在導出指令前面 在多加一個指令 extern "C",其目的是我們不知道函式調用者使用的編譯器是 什麼,而使用這個指令可以幫助我們解決使用不同 C 編譯器會產生的不同問題。

其程式碼的實現如 5-20 所示。

圖 5-20 導出函式程式碼

完成以上修改後就算完成 DLL 的封裝,且編譯器會產生.dll 檔以及.lib 檔,

這些檔案就是要提供給別人使用的函式庫檔案,而應用程式開發者拿到這兩個檔 案以及我們的.h 檔之後,他有兩種連結方式可以去選擇,分別為顯性連結以及 隱性連結

z 顯性連結: 在應用程式某個地方需要用到我們 DLL 的函式時,必須透過 LoadLibrary 這 個 指 令 先 把 我 們 的 DLL 掛 載 進 來 , 接 著 再 透 過 GetProcAddress 指令來取得我們所導出的函式位址,即可使用我們的函 式。但每次要用到函式時都要重新 LoadLibrary 再重新 GetProcAddress 有 些麻煩,不過好處是比較彈性化,用到時再載入不用時可以把它釋放掉。

z 隱性連結: 在應用程式開發一開始就要設定好連結的檔案及路徑透過編譯 器的 Setting->Link 功能來設定,即可使用我們的函式。這種方式使用方便 載入方法由編譯器幫我們負責處理,但壞處是比較不彈性,因為它一開始就 連結起來不管你是否要用,當 DLL 很多時,應用程式開啟速度將變慢。

而我們封裝好人臉偵測功能後,我們選擇使用隱性連結的方式直接連結到精聯科 技開發好的應用程式 CameraDemo 中,其設定如圖 5-21 所示

72

隱性連結

圖 5-21 隱性連結設定

設定好之後在程式中 include 我們的.h 檔後即可直接使用我們的人臉偵測函 式,而我們加入到應用程式的程式碼實現如圖 5-22 所示

圖 5-22 呼叫 DLL 人臉偵測函式程式碼

當系統 Capture 到一張 BMP 圖像之後就進入到我們所加入的這段程式碼當 中,首先我們先去詢問是否要對這張圖像作人臉偵測,如果選否那就繼續做視訊 Preview 的動作,如果選是就會先透過 BMP2RAW 的函式將 BMP 圖像的影像部分資 料取出並去掉 Header 的部份,再來就可以把影像資料丟到我們 DLL 所導出的 FaceDetect 函式做偵測的動作,這裡我們可以看到我們是使用隱性連結的方 式,所以並不需要 LoadLibrary 的指令就可以直接用,非常方便。接著把做完偵

73

測的資料當作參數丟給 Show 函式,Show 函式就會幫我們把偵測結果顯示在螢幕 上即完成了整個 DLL 實驗的部份,其實驗結果如圖 5-23 所示

圖 5-23 DLL 實驗結果