1. 程式人生 > >在C#中動態呼叫封裝好的opencv(C++)程式碼塊

在C#中動態呼叫封裝好的opencv(C++)程式碼塊

由於專案需要在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#中的型別,具體如何對應很多文章上有。