创建C++/CLI OpenCV包装器以在C#中使用

DBW*_*ite 3 c# opencv c++-cli

我想创建一个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++.

mar*_*rol 7

我如何使用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 来查看哪些依赖项不一致.