我想创建一个 OpenCV 包装器以在 C# 中使用它。我使用此链接作为参考http://drthitirat.wordpress.com/2013/06/06/use-opencv-c-codes-in-a-vc-project-solution-of-creating-a-management-clr-wrapper/到目前为止,我已经创建了一个包含图像处理代码的 C++ 控制台应用程序。我还创建了一个 C++/CLI 类库,在其中包装了 OpenCV 代码,但是当我尝试构建它时,我收到了很多关于 C++ 代码中使用的 OpenCV 函数的未解决的外部错误,我不知道如何修复它...知道如何解决这个问题吗?有没有更简单、更容易的方法在 C# 中使用 C++ OpenCV 代码?我不想使用 Emgu 或任何其他包装器,我的图像处理代码必须使用 C++。
我如何使用 Visual Studio 2012 解决 opencv 的问题:
- 我使用 opencv 创建了一个 C++ 图像处理库并将其编译为静态库(.lib),如上所述here。基本上,创建一个控制台应用程序项目并将项目配置 -> 常规 -> 配置类型更改为“静态库 (.lib)”。这会将您的项目编译为 .lib 文件,稍后您应该在 c++/cli 中使用该文件。
- 然后我制作了一个 C++/CLI 包装器 - 对于 c++ 中的每个类,我即将发布到 c# 我制作了一个包装器,如下所示这个链接。我使用了 C++ 中的现有标头,只需添加到项目(例如添加到项目 -> 现有项目)并从项目 1 中选择标头。这还有一个优点,如果您更改 .lib 文件中的某些内容,您将拥有相同的 .h 文件,因此当你重新编译.lib,你不必改变c++/cli中的头文件。我从 1. 开始包含 .lib ,转到项目属性 -> 链接器 -> 输入 -> 其他依赖项,然后输入 .lib 文件的路径。该项目被编译为.dll 文件。 (项目配置->常规->配置类型->“动态库(.dll)”)。
- 在 c# 项目中,我刚刚添加了 .dll 的引用并使用了 c++/cli 中的类,它们是托管类。这就是魔法的运作原理。
备注一:我可以保证这个解决方案有效。我在 opencv 2.4.2 中使用了模式检测和 camshift 等功能。
备注B:另一个主题是如何准确地进行编组。在简单数据类型的情况下,毫无疑问使用 c++/cli 数据类型(如 UInt32 等)。但问题是,如果您想传递更复杂的对象(如 cv::Mat ),这些对象在 c++/cli 中没有直接等效的类型。在这种情况下,我在 c++/cli 端制作了此类类的简化版本。
备注C:不要在不同的项目中搞乱架构。如果您正在使用例如x86,在所有项目中都是如此。
备注D:实际上,在 C# 中使用 C++ 代码的问题有两种解决方案:我描述的一种,以及使用动态即时编组从 C# 托管代码直接调用 C++ 非托管代码。有两个主要缺点:即时编组需要时间,并且您并不真正知道如何在复杂数据类型(即与 int 或 string 不同的所有内容)之间准确执行此操作。所以 c++/cli 它确实是一个不错的选择,因为您可以混合托管和非托管代码。
备注E:这个解决方案是通用的,不仅仅在opencv中算。我成功地将 c++/cli 包装器用于旋转阶段(电机设备),该旋转阶段仅具有 c++ 驱动程序,并在 c# 代码中使用该驱动程序。
关于备注 C:使用依赖遍历器,如 Depends (http://www.dependencywalker.com/)以查看哪些依赖关系不一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)