在C#中動態呼叫封裝好的opencv(C++)程式碼塊
阿新 • • 發佈:2018-11-21
由於專案需要在C#中呼叫opencv的函式處理影象,而暫時沒時間瞭解CLR/C++,所以就採用封裝API的方式呼叫,使用的IDE是VS2015,記錄過程如下:
一、 建立封裝好的動態連結庫
1、建立新專案
在VS2015新建visual C++專案——Win32專案——應用程式型別DLL——完成,由於我的opencv在64位下配置,所以解決方案切換為x64、release(此模式下會省掉除錯資訊,適合最終釋出的版本)。
解決方案名稱與專案名稱都為useopencv,在專案中建立自己的標頭檔案useopencv.h,將要打包的函式在此宣告,如:
extern "C" __declspec(dllexport)void __stdcall use_opencv();
2、為要匯出的函式打包
開啟stdafx.h,將useopencv.h與opencv的標頭檔案放到stdafx.h裡面。再將函式的實現部分複製到useopencv.cpp,如:
void __stdcall use_opencv() {
using namespace cv;
Mat src = imread("D:/opencvimage/learn/1.jpg");
imshow("src", src);
waitKey(0);
return;
}
3、加入模組定義檔案
為進一步保證函式名不會被修飾,在專案——原始檔——新增——新建項——程式碼——模組定義檔案(.def),新增Source.def,並對要匯出的函式進行編號,如:
LIBRARY "useopencv.dll"
EXPORTS
use_opencv @ 1
4、生成解決方案
之後就可以生成解決方案了,在專案的\x64\release裡面就能看到useopencv.dll了
二、在C#中動態呼叫封裝的API
1、建立C#控制檯程式
新建專案——c#控制檯程式,建立好後引入這樣一個名字空間:
using System.Runtime.InteropServices;
然後專案右鍵——屬性——生成——目標平臺——x64(這一步非常關鍵,VS中解決方案的配置與專案的配置不一定一樣!)
2、匯入要使用的函式
通常每一個函式都要這樣的語句單獨匯入一次,DllImport還有一些可設定的引數,比如呼叫方式stdcal、Cdecl這些,這裡就直接用預設值了。
[DllImportAttribute(@"E:\VS專案\useopencv\x64\Release\useopencv.dll")]
public extern static void use_opencv();
3、使用匯入的函式
直接呼叫函式即可,另外,匯入的函式也可以有引數,只是得匹配好c++與c#中的型別,具體如何對應很多文章上有。