在C#应用程序中调用OpenCV C++代码

6
我已经开发了一个使用OpenCV的C++程序。现在我想用C#开发一个基于窗体的应用程序。由于C#只能处理托管代码,因此几乎不可能直接在C#应用程序上运行OpenCV。我已经搜索了不同的方法来使用OpenCV创建C#应用程序,其中之一是EmguCV,而我更感兴趣的另一种方法是在C#应用程序中导入C++ .dll文件,并以这种方式调用非托管函数。
我首先在C++中创建了简单的函数,通过导入dll,我能够在我的C#应用程序中使用cout和cin。当我尝试在我的C++应用程序中包含OpenCV头文件并编译时,问题出现了,我得到了以下错误:
error LNK1104: cannot open file 'tbb_debug.lib'
有人以前做过这个,但我无法弄清楚他如何在在picturebox中以cv :: Mat格式显示网络摄像头中将C++与C#接口化。
问题是我有一个函数,它接受一个cv::Mat变量并对其进行一些图像处理,然后返回处理后的矩阵。我想在我的C#应用程序中使用用C++编写的该函数。但问题是当我在C++中包含OpenCV库时,我无法创建dll。
请不要建议我使用EmguCV或任何其他OpenCV的.NET封装。
我正在使用Visual Studio 2010进行我的项目。

问题是什么?您已经提到了,您可以创建一个DLL并通过P/Invoke访问它。您还可以使用C++/CLI编写一个程序集,该程序集访问本地标头并使用本地库。至于链接错误,您提供的信息不足以告诉我们发生了什么错误。 - Spook
我已经编辑了这篇文章,当我尝试编写任何使用OpenCV的方法时,我会收到上面发布的错误,因此无法创建dll文件。但是当我只使用cout和cin时,没有出现错误,并且dll文件成功创建。 - Mujahid Daud Khan
2个回答

3

我建议您在C++头文件中明确导出包装入口点的方法,然后使用P/Invoke引用它们:

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

那么在 C# 中消耗它们:
[DllImport("MyOpenCVWrapper.dll")]
private static extern bool DoSomething();

我不建议直接引用OpenCV头文件。

1

虽然这可能不是你想要的,但我使用C++/CLI完成了该任务,并通过程序集公开了它。 这很简单,而且效果非常好。 博客文章在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接