gpt4 book ai didi

c# - 创建要在 C# 中使用的 C++/CLI OpenCV 包装器

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:21 24 4
gpt4 key购买 nike

我想创建一个 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 函数的 Unresolved external 错误,我不知道如何修复它...知道如何解决这个问题吗?在 C# 中使用 C++ OpenCV 代码是否有更简单、更容易的方法?我不想使用 Emgu 或任何其他包装器,我的图像处理代码必须使用 C++。

最佳答案

我是如何使用 visual studio 2012 解决 opencv 问题的:

  1. 我用 opencv 创建了一个 c++ 图像处理库,并将其编译为静态库 (.lib),如前所述 here .基本上,创建一个控制台应用程序项目并将项目配置 -> 常规 -> 配置类型更改为“静态库 (.lib)”。这会将您的项目编译为 .lib 文件,稍后您应该在 c++/cli 中使用该文件。
  2. 然后我制作了一个 C++/CLI 包装器 - 对于我即将发布到 C# 的每个 C++ 类,我制作了一个包装器,如 this link .我只是通过添加到项目中来使用 C++ 中的现有 header ,例如添加到项目 -> 现有项并从项目 1 中选择 header 。这也有一个优点,如果您更改 .lib 文件中的某些内容,您将拥有相同的 .h 文件,所以当您重新编译 .lib,您不必更改 c++/cli 中的 header 。我从 1. 中包含了 .lib,转到项目属性 -> 链接器 -> 输入 -> 附加依赖项并将路径放入 .lib 文件。该项目被编译为 .dll 文件。 (项目配置->常规->配置类型->“动态库(.dll)”)。
  3. 在 c# 项目中,我刚刚添加了对 .dll 的引用,并使用了来自 c++/cli 的类,它们是托管类。这就是魔法的运作方式。

备注 A: 我可以保证此解决方案有效。我在 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/ ) 这样的依赖 walker 来查看哪些依赖不一致。

关于c# - 创建要在 C# 中使用的 C++/CLI OpenCV 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com