如何在 Cocoa 应用程序中包含 OpenCV?

Posted

技术标签:

【中文标题】如何在 Cocoa 应用程序中包含 OpenCV?【英文标题】:How to include OpenCV in Cocoa Application? 【发布时间】:2010-09-28 08:04:23 【问题描述】:

当我使用“命令行工具”c++ stdc++ 模板创建 xCode 项目时,我能够包含和编译 opencv 头文件并运行一些代码。

但我想在“Cocoa 应用程序”上下文中使用 OpenCV。使用该模板创建时,当我在 main.mm 中包含 OpenCV 标头时出现编译错误。 (我已经把main.m改成了main.mm,'//NSApplicationMain(argc, (const char **) argv);'被注释掉了)

其中一个错误是:“语句表达式只允许在函数内部”

我想它是某种编译器版本错误,但是当我比较项目构建设置时,我找不到差异。

您有什么想法/专长吗?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我花了 2 天时间进行认真的系统跟踪,果然,解决方案非常简单,一个 8 岁的孩子可以比我更快地找到它。

准备好了吗?

在您要使用 OpenCV 的 .mm 文件中,您需要在任何其他包含之前执行您的 #include "opencv2/opencv.hpp"。就是这样!只需将其向上移动一条线,您的问题就会神奇地消失,比真正将房间绑在一起的地毯更快。

顺便说一下,这是针对 OpenCV 2.2 的,因此是新的包含文件。此外,如果您的 XCode 项目使用前缀头文件(在“其他来源”中查找“YourProjectName_Prefix.pch”文件),那么您需要将 #include "opencv2/opencv.hpp" 放在那里而不是任何其他文件中。

【讨论】:

即使没有实际的 Prefix.pch,目标的构建设置也可能包含一个前缀标头,例如系统的 UIKit.h。在删除它之后,它终于在我的机器上构建了。【参考方案2】:

Ian Charnas 的回答是正确的,但我会做一个修改。

这篇文章有一个更具体的解决方案,并解释了为什么需要这样做。 http://aptogo.co.uk/2011/09/opencv-framework-for-ios/

// 在 UIKit 和 Foundation 的 #import 语句之前添加这个新部分

#ifdef __cplusplus
    #import <opencv2/opencv.hpp>
#endif

【讨论】:

【参考方案3】:

即使您将“main.m”重命名为“main.mm”并将“#include opencv2/opencv.hpp”移动到顶部(在主文件中),预处理器也会首先插入 cocoa.h,因为预编译头文件的名称类似于“_Prefix.pch”。为避免此类问题 - 删除#import 语句或 - 在 cocoa.h 导入语句上方插入 #import 语句

【讨论】:

【参考方案4】:

尝试将:-lstdc++ 添加到 Cocoa 应用的构建设置中的“其他链接器标志”中。

默认情况下,由 Xcode 模板制作的可可应用程序不会在其设置中链接包含 c++ 库。

【讨论】:

嗨,我还添加了-lz,但仍然遇到同样的错误。我正在 i386 上构建。我错过了什么? 你为什么要注释掉 NSApplicationMain()?您必须使用更具体的信息更新您的问题,例如确切的错误消息和/或足够的代码 sn-p 以获得问题的线索。【参考方案5】:

    将此添加到您的 .pch 文件中

    #ifdef __cplusplus
    #import <opencv2/opencv.hpp>
    #endif
    

    不要忘记将所有 .m 文件转换为 .mm 文件

【讨论】:

【参考方案6】:

您可能会发现使用 OpenCV 的 C API 比使用 C++ API 更容易。当然,您可以直接从 Objective C 调用 C API,因此这让生活变得更加轻松。你只是失去了一些 C++ 的语法糖,比如默认参数值。

【讨论】:

以上是关于如何在 Cocoa 应用程序中包含 OpenCV?的主要内容,如果未能解决你的问题,请参考以下文章

qt:在一个 gui 窗口中包含 opencv 和 opengl 子窗口

不能在 Linux 的 Matlab 中包含 OpenCV 函数

如何在 iOS/Cocoa 应用程序中安全地包含密钥/签名

OpenCV 2.4:Windows 中 Qt 中包含的问题

即使图像在 Python 中的 OpenCV 中包含多行,霍夫线变换也只能识别一行

Cocoa 应用程序中的 OpenCV(OS X 应用程序)