【问题标题】:calling opencv c++ code in C# application在 C# 应用程序中调用 opencv c++ 代码
【发布时间】:2012-11-09 16:44:28
【问题描述】:

我开发了一个使用 OpenCV 的 c++ 程序。现在我想用 C# 开发一个基于 Windows 窗体的应用程序。 由于 C# 只能处理托管代码,因此几乎不可能直接在 C# 应用程序上运行 OpenCV。我已经搜索了使用 OpenCV 创建 C# 应用程序的不同方法,其中一种是 EmguCV,而我更感兴趣的另一种方法是在 C# 应用程序中导入 c++ .dll 文件并以这种方式调用非托管函数。

我首先在 c++ 中创建简单的函数,然后通过导入 dll 在我的 C# 应用程序中使用 coutcin。当我尝试在我的 C++ 应用程序中包含 OpenCV 头文件并且当我编译时出现此错误时,问题就出现了

错误 LNK1104:无法打开文件 'tbb_debug.lib'

以前有人做过,但我不知道他是如何将 c++ 与 C# 接口的 Displaying webcam feed in cv::Mat format in a picturebox

问题是我有一个函数,它接受一个 cv::Mat 变量并对其执行一些图像处理并返回处理后的矩阵。我想在我的 C# 应用程序中使用用 C++ 编写的函数。但问题是当我在 C++ 中包含 OpenCV 库时,我无法创建 dll。

所以请不要建议我使用 EmguCV 或任何其他 .NET 包装器 对于 OpenCV。

我正在为我的项目使用 Visual Studio 2010。

【问题讨论】:

  • 问题是什么?您已经提到,您可以创建一个 DLL 并通过 P/Invoke 访问它。您还可以使用 C++/CLI 编写程序集,该程序集访问本机头文件并使用本机库。至于链接错误,您没有提供足够的信息让我们告诉您,出了什么问题。
  • 我已经编辑了帖子,当我尝试编写任何使用 OpenCV 的方法时,我收到了我在上面发布的错误,因此无法创建 dll,但是当我只使用 cout 和 cin 时没有错误出现起来,dll创建成功

标签: c# c++ opencv


【解决方案1】:

我会明确导出将入口点包装在 C++ 标头中的方法,然后使用 P/Invoke 来引用它们:

extern "C" __declspec(dllexport) BOOL DoSomething();

然后在 C# 中使用它们:

[DllImport("MyOpenCVWrapper.dll")]
private static extern bool DoSomething();

我不会尝试引用 OpenCV 标头。

【讨论】:

    【解决方案2】:

    虽然它可能不是您想要的,但我使用 C++/CLI 完成了这项任务,并通过程序集公开了它。这很简单,而且效果很好。 Blog article here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多