创建C ++ / CLI OpenCV包装器以在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中使用的类,它们是托管类。 这就是魔法的作用。

备注答:我可以保证这个解决方案有效。 我使用了opencv 2.4.2等模式检测和camshift等function。

备注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来查看哪些依赖项不一致。