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

2023-11-27

我想创建一个 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 的问题:

  1. 我使用 opencv 创建了一个 C++ 图像处理库并将其编译为静态库(.lib),如上所述here。基本上,创建一个控制台应用程序项目并将项目配置 -> 常规 -> 配置类型更改为“静态库 (.lib)”。这会将您的项目编译为 .lib 文件,稍后您应该在 c++/cli 中使用该文件。
  2. 然后我制作了一个 C++/CLI 包装器 - 对于 c++ 中的每个类,我即将发布到 c# 我制作了一个包装器,如下所示这个链接。我使用了 C++ 中的现有标头,只需添加到项目(例如添加到项目 -> 现有项目)并从项目 1 中选择标头。这还有一个优点,如果您更改 .lib 文件中的某些内容,您将拥有相同的 .h 文件,因此当你重新编译.lib,你不必改变c++/cli中的头文件。我从 1. 开始包含 .lib ,转到项目属性 -> 链接器 -> 输入 -> 其他依赖项,然后输入 .lib 文件的路径。该项目被编译为.dll 文件。 (项目配置->常规->配置类型->“动态库(.dll)”)。
  3. 在 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(使用前将#替换为@)

创建要在 C# 中使用的 C++/CLI OpenCV 包装器 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh

随机推荐