C#呼叫opencv
最經做一個專案,底層呼叫openCV編寫的影象處理程式,使用者介面採用C#編寫。 於是學習了相關技術,總結如下:
C#編寫的是託管程式碼,編譯生成微軟中間語言,而普通C++程式碼則編譯生成本地機器碼,這兩種語言不能直接混合程式設計。常見的方式是:
1)將本機C++程式碼(指非託管C++)編譯成一個dll,供C#呼叫,呼叫方法為 [DllImport(×××.dll)] 。但是這裡只能從 DLL 匯出函式,不能匯出類(還沒有測試能否匯出變數)。不能匯出類是因為本機C++是非託管的,與C#的語言方式不相容。也就是說,不能將此類dll作為引用 新增到C#工程中,IDE會提示不是一個程式集。這種方法因為無法匯出類,對習慣面向物件程式設計的人來說,使用起來也不方便。
2)利用CLR C++(指託管C++)編寫輸出類庫,供C#使用,由於CLR C++和C#都符合CLS規範,所以兩者可以無縫整合,在一個解決方案裡包含這兩種語言的專案。生成的DLL可以匯出類。這種方法顯然不適用於我的情況,因為openCV程式碼並非託管C++程式碼,無法直接編譯成可供C#呼叫的類。
3)託管C++和C#一樣編譯成為微軟中間語言,這樣就可以和C#良好地通訊,即可以在c#中使用託管C++類。同時,託管C++可以呼叫本地C++的類和函式,一個託管C++的程式集可以巢狀本地C++編譯的機器碼。這樣的特徵決定了託管C++可以成為C#和本地C++之間的良好橋樑。所以可以讓C#以呼叫託管C++,而託管C++呼叫本地C++的類和函式。換句話說也就是用託管C++給本地C++程式碼做一個外殼供C#呼叫。這裡的本地C++程式碼就是我們要呼叫的opencv庫函式,託管C++程式碼就是我們基於openCV編寫的影象處理函式。由於這些函式是託管程式碼,所以可以被C#直接呼叫。
具體的實現過程可以參考百度文庫的文章: