openCV 2.4.3 iOS框架编译器无法识别某些c ++标头

时间:2012-12-16 21:04:16

标签: c++ ios xcode opencv

openCV 2.4.3 / Xcode 4.5.2 / mac osx 10.8.2

我正在尝试让openCV与iOS一起工作。我试图使用openCV.org中的预构建的2.4.3框架。但是我得到以下xcode项目构建错误,表明编译器不知道它正在处理c ++,例如

#include <list>       !'list' file not found

namespace cv          !unknown type name 'namespace'

这似乎只涉及以下头文件:
“opencv2 /非自由/ features2d.hpp”
“opencv2 /非自由/ nonfree.hpp”
“opencv2 / video / video.hpp”

如果我不在opencv.hpp(或其他任何地方)中包含这三个文件,我似乎能够编译并使用openCV ok。问题是,我确实需要非自由文件,因为我正在试验SURF - 最近已经转移到非自由。

这真是一个双重问题(抱歉; - )

  • 如何说服编译器这些是c ++标头?
  • 我需要使用SURF哪个标题?

更新

我克隆了openCV git存储库并从中构建了一个新框架。这种方法以前没有用,但今天我意识到我没有使用当前版本的CMAKE。我一直在使用CMAKE 2.8.2,这将无法为ios构建opencv。当前版本的CMAKE 2.8.10构建它没有任何问题(这是一个服从文档的对象课程,确实需要CMAKE min.v2.8.8)。

现在,当我在Xcode项目中添加opencv框架的当前版本时,我可以包含 features2d nonfree 并顺利构建。唯一的问题仍然是一个标题:video/background_segm.hpp,它仍然产生:

#include <list>       !'list' file not found

如果我评论换行,我会在下一行收到错误:

namespace cv          !unknown type name 'namespace'

很明显,编译器不会将其识别为C ++标头,即使它是.hpp的后缀。

opencv2/video/video.hpp如果我删除

#include "opencv2/video/background_segm.hpp"

我也可以使用video.hpp构建(虽然我猜它在实践中无法使用)。

不幸的是我仍然无法让SURF工作。当我运行该项目时,它崩溃了这个错误:

  

OpenCV错误:未实现功能/功能(OpenCV是在没有SURF支持的情况下构建的)

这是在legacy/features2d.cpp

中触发的
   Ptr<Feature2D> surf = Algorithm::create<Feature2D>("Feature2D.SURF");
   if( surf.empty() )
        CV_Error(CV_StsNotImplemented, "OpenCV was built without SURF support");

问题仍然存在......

  • 如何让编译器相信background_segm.hpp是一个合法的c ++标题?
  • 如何启用SURF支持?

2 个答案:

答案 0 :(得分:10)

我现在一切都在工作。在对openCV.org提供的预建iOS库感到高兴之后,这就是我所做的......

  • 从gitHub存储库的克隆编译openCV for iOS。运行build_framework.py(在发行版的ios文件夹中),指向您选择的输出目录。 一定要有最新的CMake 副本,否则你会像我一样绊倒。

  • 您的输出文件夹最终会有两个子文件夹buildopencv2.framework。将后者拖入Xcode项目

project-Prefix.pch文件

中添加以下行
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

(应该以上 #ifdef __OBJC__行)

这足以让大部分openCV正常工作。但是,避免&#34; objective-C ++&#34;是一个非常好的主意。 (将c ++代码与目标-C相同的文件混合)。要管理这个,你需要创建一个瘦&#34;包装&#34; object(将是obj-C ++)在你的obj-C类和c ++代码之间进行调解。包装器本质上只有两个角色:转换数据格式(例如UIImage&lt; - &gt; cv :: Mat),以及在obj-C方法和C ++函数调用之间进行转换。有关详细信息,请参阅my answer to this question(以及github托管的示例项目)

要使SURF(和SIFT)工作需要几个额外的步骤,因为SURF为somewhat deprecated due to licensing issues(它已被移入nonfree,但不会自动加载。)

这些包括需要添加到使用SURF的文件中

#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>

我正在使用的代码使用SURF的C接口(例如cvExtractSURF),所以我们还需要在调用这些函数之前添加这一行:

   cv::initModule_nonfree();

我的问题的另一部分,如何强制Xcode编译为C ++,是一个红色的鲱鱼(我必须使用openCV版本的兼容性问题) - 并且不再需要解。然而答案是首先,重命名你的.m文件.mm(对于objective-C ++)或.cpp(对于纯C ++)......但如果这不起作用,你可以通过改变来强制解决文件检查器中的问题&#39;文件类型&#39;。

更新

您还需要注意在使用openCV框架的任何项目中正确设置C ++标准库。旧版本的openCV(to.2.4.2)需要libstdc++,较新版本(2.4.3+)需要libc++。详情如下:

https://stackoverflow.com/a/14186883/1375695

更新2

openCV现在安装了cocoaPods。引用SebastienThiebaud

  
    

OpenCV可在Cocoapods上找到。在Podfile中添加一行:pod&#39; OpenCV&#39;。很简单。

  

&#34;非常简单&#34; ......鉴于我们之前的所有麻烦,可能是[最后一年]的轻描淡写......

答案 1 :(得分:1)

openCV实现类只需将.m添加为.mm作为实现文件。

#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>

@interface ViewController : UIViewController

@end

enter image description here .mm文件在iOS中的C ++编译器中运行,因此不会显示错误。