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程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章