簡體   English   中英

創建C ++ / CLI OpenCV包裝器以在C#中使用

[英]Creating an C++/CLI OpenCV wrapper to use in C#

我想創建一個OpenCV包裝器以在C#中使用它。 我使用此鏈接作為參考http://drthitirat.wordpress.com/2013/06/06/use-opencv-c-codes-in-a-vc-project-solution-of-creating-a-managed- clr-wrapper /到目前為止,我已經創建了一個包含我的圖像處理代碼的C ++控制台應用程序。 我還創建了一個C ++ / CLI類庫,其中包含了OpenCV代碼,但是當我嘗試構建它時,我得到了許多關於C ++代碼中使用的OpenCV函數的未解決的外部錯誤,我不知道如何解決它...知道如何解決這個問題嗎? 在C#中使用C ++ OpenCV代碼有一種更簡單,更簡單的方法嗎? 我不想使用Emgu或任何其他包裝器,我的圖像處理代碼必須使用C ++。

我如何使用visual studio 2012解決opencv的問題:

  1. 我創建的OpenCV一個C ++圖像處理庫和它編譯成如所提到的靜態庫(.LIB) 這里 基本上,創建一個控制台應用程序項目並將項目配置 - >常規 - >配置類型更改為“靜態庫(.lib)”。 這會將您的項目編譯為.lib文件,稍后您應該在c ++ / cli中使用該文件。
  2. 然后我做了一個C ++ / CLI包裝器 - 對於c ++中的每個類,我即將發布到c#我在這個鏈接中創建了一個包裝器。 我只是通過添加項目添加到項目 - >現有項目並從項目1中選擇標題來使用來自c ++的現有標題。這也有一個優點,即如果你在.lib文件中更改了某些內容,那么你有相同的.h文件,所以當你重新編譯.lib,你不必在c ++ / cli中更改標題。 我將1.lib包含在1.項目屬性 - >鏈接器 - >輸入 - >附加依賴項中,並將路徑放到.lib文件中。 該項目被編譯為.dll文件。 (項目配置 - >常規 - >配置類型 - >“動態庫(.dll)”)。
  3. 在c#項目中,我只是添加引用.dll和c ++ / cli中使用的類,它們是托管類。 這就是魔法的作用。

備注A:我可以保證這個解決方案有效。 我使用了opencv 2.4.2等模式檢測和camshift等功能。

備注B:另一個主題是如何進行准確的編組。 在簡單數據類型的情況下,毫無疑問使用像UInt32等c ++ / cli數據類型。但問題是,如果你想傳遞更復雜的對象,如cv :: Mat,它們在c ++ / cli中沒有直接等價的類型。 在那種情況下,我在c ++ / cli方面制作了這類的簡化版本。

備注C:不要在不同的項目中混淆架構。 如果您使用的是x86,則可以在所有項目中使用。

備注D:實際上,在c#中使用c ++代碼的問題有兩個解決方案:我描述的那個和使用動態動態編組從c#托管代碼直接調用c ++非托管代碼。 有兩個主要的缺點:即時編組需要時間,你不知道復雜數據類型之間的確切做法(即,與int或字符串不同的一切)。 所以c ++ / cli它真的是一個很好的選擇,因為你可以混合托管和非托管代碼。

備注E:此解決方案是通用的,它不僅僅在opencv中計數。 我成功地將這個制作c ++ / cli包裝器用於旋轉階段(電機設備),它只有c ++驅動程序並在c#代碼中使用了這些驅動程序。

關於備注C:使用Depends( http://www.dependencywalker.com/ )之類的依賴性walker來查看哪些依賴項不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM