VS2012中使用OpenCV-3.0.0的動態連結庫和靜態連結庫
一、 新建工程
1、選單選擇“檔案——新建——專案”
2、左側選擇“已安裝——模板——Visual C++——Win32”,右側選擇“Win32專案”
3、確定後,依次點選“下一步”,
4、點選“完成”,自動生成專案
5、選擇選單“生成——生成解決方案”,下方輸出區會顯示成功:
6、選擇選單“除錯——開始執行(不除錯)”,結果如下:
至此,新建、編譯並執行一個程式即告完成。
二、 工程使用OpenCV-3.0.0動態連結庫
1、選中專案,右擊選擇“屬性”,
出現如下屬性設定框:
2、右側選中“C/C++”,左側“附加包含目錄”右側下拉按鈕選中“編輯”
出現如下附加包含目錄設定框:
從空白區第一行雙擊,選擇OpenCV-3.0.0加壓包中build目錄下的include資料夾
選擇後結果如下圖
確定後,附加包含目錄即設定OK。
設定“附加包含目錄”就是要告知編譯器去哪裡找標頭檔案的位置。
3、在右側選擇“連結器”,右側選中“附加庫目錄”
直接填入:D:\Softwares\OpenCV-3.0-beta\build\x86\vc11\lib,結果如下:
左側點開“連結器”,選擇“輸入”,在右側“附加依賴項”中加入opencv_world300d.lib
確定後,即配置完成。
設定“附加庫目錄”和“附加依賴項”就是要告知編譯器去哪裡連結標頭檔案中宣告函式。
4、在專案中,開啟檔案Win32Project2.cpp,新增標頭檔案引用
#include "opencv2\opencv.hpp"
結果如下:
在InitInstance函式中新增三行程式碼:
cv::Mat image = cv::imread("E:/IMG_0012.JPG "); // 讀入一幅影象
cv::imshow("IMG",image); // 顯示影象
cv::waitKey(10); // 等待10毫秒
點選選單“生成——生成解決方案”後,編譯成功如下圖:
點選選單“除錯——開始執行(不除錯)”,出現如下提示:
此時,將OpenCV中build/x86/vc11/bin/opencv_world300d.dll複製到Debug目錄下:
再次點選,執行顯示影象。
複製“*dll”檔案到執行目錄下,使得程式能夠連結到依賴庫並按照依賴庫來執行。
三、 工程使用OpenCV-3.0.0靜態連結庫
此過程與使用動態連結庫非常相似,在第3步存在差異,具體如下:
3、在右側選擇“連結器”,右側選中“附加庫目錄”
直接填入:D:\Softwares\OpenCV-3.0-beta\build\x86\vc11\staticlib,結果如下:
左側點開“連結器”,選擇“輸入”,在右側“附加依賴項”中加入
ippicvmt.lib
IlmImfd.lib
libjasperd.lib
libjpegd.lib
libpngd.lib
libtiffd.lib
libwebpd.lib
zlibd.lib
comctl32.lib
vfw32.lib
opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib
結果如下:
確定後,即配置完成。
此處載入的專案繁多,其中comctl32.lib和vfw32.lib是windows下的庫,必須載入;opencv_.lib可選擇性載入(只加載依賴項)。*
此外,在完成以上配置後,還需要修改程式碼生成的執行庫。
在“屬性——C/C++——程式碼生成”中,修改執行庫“多執行緒除錯DLL(/MDd)”為“多執行緒除錯(/MTd)”
重新編譯,執行即可使用靜態連結庫,且目標資料夾下無需複製檔案即可執行。
靜態連結庫將依賴的庫的相關部分全部連結到生成程式中,故無需依賴其他項。
四、 從OpenCV-3.0.0靜態連結庫製作自己的動態連結庫
1、右擊“解決方案”,選擇“新增——新建專案”
出現如下新增新專案
2、選擇“已安裝——Visual C++——Win32”,右側選擇“Win32 專案”,輸入專案名後確定,出現如下介面,點選“下一步”。
接下來出現的介面中選擇“應用程式型別——DLL”,點選“完成”。
出現如下DllWin32Project工程:
3、配置OpenCV-3.0.0的靜態連結庫,參見上一節內容。
4、在stdafx.H中加入OpenCV標頭檔案:
#include "opencv2\opencv.hpp"
在標頭檔案目錄下新增DllWin32Project.h,並新增如下程式碼:
#ifdef __DLL_WIN32PROJECT__
#define __DLL_WIN32PROJECT__ extern "C" _declspec(dllexport)
#else
#define __DLL_WIN32PROJECT__ extern "C" _declspec(dllimport)
#endif
__DLL_WIN32PROJECT__ void ShowImageByOpenCV(char *imageName);
在DllWin32Project.cpp中新增:
#define __DLL_WIN32PROJECT__
#include "DllWin32Project.h"
void ShowImageByOpenCV(char *imageName)
{
cv::Mat image = cv::imread(imageName); // 讀入一幅影象
cv::imshow("IMG SHOW BY DLL",image); // 顯示影象
cv::waitKey(10); // 等待10毫秒
}
5、編譯執行後,生成DllWin32Project.lib和DllWin32Project.dll檔案
至此,製作自己的動態連結庫即告完成,其中OpenCV的呼叫函式已整合到Dll內部,對外只有一個DllWin32Project.dll,可以很好的隱藏二次開發的依賴庫。
五、 C#呼叫自己的動態連結庫
1、從左側“其它語言——Visual C#——Windows”中新增ShowImageByOpenCVDll的Windows窗體應用程式,確定。
生成如下工程:
從右側工具欄,新增一個按鈕到Form1中,修改按鈕名稱為“顯示影象”:
2、雙擊按鈕,進入程式碼區,新增程式碼:
在引用區新增
using System.Runtime.InteropServices;
在Form1裡新增
[DllImport("DllWin32Project.dll")]
public static extern void ShowImageByOpenCV(String imageName);
在button1_Click中新增
String imName = "E:/IMG_0012.JPG";
ShowImageByOpenCV(imName);
編譯後生成可執行檔案,執行之即可得到如下窗體:
點選按鈕,顯示影象如下
至此,成功呼叫自己編寫的Dll程式。