openCV 2.4.3 iOS框架编译器在识别一些c ++头文件时遇到麻烦

openCV 2.4.3 / Xcode 4.5.2 / mac osx 10.8.2

我正在尝试让openCV与iOS一起工作。 我正在尝试使用openCV.org预构build的2.4.3框架。 不过,我正在得到以下xcode项目生成错误,build议编译器不知道它正在处理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好了。 麻烦的是,我确实需要使用非自由文件,因为我正在尝试使用SURF – 最近已将其移至非自由文件中。

这真是一个双重的问题(对不起;-)

  • 我如何说服编译器这些是C ++头文件?
  • 哪些头正是我需要使用SURF?

更新

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

现在,当我在Xcode项目中添加opencv框架的当前版本时,我可以包含features2dnonfree,并且可以顺利构build。 唯一的问题仍然是一个头: 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构build(虽然我猜这在实际中是不可用的)。

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

OpenCV错误:function/function没有实现(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支持?

我现在有一切工作。 在用openCV.org提供的预build的iOS库没有什么喜悦之后,这就是我所做的…

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

  • 您的输出文件夹将结束与两个子文件夹, buildopencv2.framework 。 把后者拖到你的Xcode项目中

project-Prefix.pch文件中添加以下行

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

(应该在#ifdef __OBJC__之上

这足以让openCV的大部分工作。 不过,避免使用“objective-C ++”(将c ++代码与您的objective-C相同的文件混合在一起)是个好主意。 要pipe理这个,你可以创build一个薄的“包装器”对象(它将是obj-C ++)来在你的obj-C类和c ++代码之间进行调解。 包装本质上只有两个angular色:翻译数据格式(例如UIImage < – > cv :: Mat),并在obj-C方法和C ++函数调用之间进行转换。 查看我对这个问题的回答以获取详细信息(以及一个github托pipe的示例项目)

要获得SURF(和SIFT)的工作需要一些额外的步骤,因为SURF 由于许可问题 (已被移入非nonfree而不能自动加载) 而被弃用 。

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

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

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

  cv::initModule_nonfree(); 

我的问题的其他部分,如何迫使Xcode编译为C ++,是一个红鲱鱼(肯定有一些兼容性问题,我正在使用的openCV版本) – 并不再需要这个解决scheme。 然而,答案是首先,重命名.m文件.mm(对于Objective-C ++)或.cpp(对于纯C ++)…但是如果不起作用,可以通过更改'filetypes'。

更新

您还需要注意在任何使用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'OpenCV'。 挺容易。

“相当容易”…给我们以前的麻烦,可能是[last]一年的轻描淡写…

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

 #import <UIKit/UIKit.h> #import <opencv2/opencv.hpp> @interface ViewController : UIViewController @end 

在这里输入图像说明 .mm文件在iOS的C ++编译器中运行,所以不会显示错误。