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

fou*_*dry 11 c++ xcode opencv ios

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'
Run Code Online (Sandbox Code Playgroud)

这似乎只涉及以下头文件:
"opencv2/nonfree/features2d.hpp"
"opencv2/nonfree/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框架的当前版本时,我可以包含features2dnonfree并顺利构建.唯一的问题仍然是一个标题:video/background_segm.hpp,仍然产生:

#include <list>       !'list' file not found
Run Code Online (Sandbox Code Playgroud)

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

namespace cv          !unknown type name 'namespace'
Run Code Online (Sandbox Code Playgroud)

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

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

#include "opencv2/video/background_segm.hpp"
Run Code Online (Sandbox Code Playgroud)

我也可以用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");
Run Code Online (Sandbox Code Playgroud)

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

  • 如何说服编译器background_segm.hpp是合法的c ++标头?
  • 如何启用SURF支持?

fou*_*dry 11

我现在一切都在工作.在对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
Run Code Online (Sandbox Code Playgroud)

(应该去上面#ifdef __OBJC__线)

这足以让大多数openCV正常工作.但是,避免使用"objective-C++"(将c ++代码与目标C相同的文件混合)是一个非常好的主意.要管理它,你需要创建一个瘦的"包装器"对象(它将是obj-C++)来调解你的obj-C类和c ++代码.包装器本质上只有两个角色:转换数据格式(例如UIImage < - > cv :: Mat),以及在obj-C方法和C++函数调用之间进行转换.有关详细信息,请参阅我对此问题的回答(以及github托管的示例项目)

要使SURF(和SIFT)工作需要几个额外的步骤,因为SURF 由于许可问题而略微弃用(它被移入nonfree其中并未自动加载).

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

#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>
Run Code Online (Sandbox Code Playgroud)

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

   cv::initModule_nonfree();
Run Code Online (Sandbox Code Playgroud)

我的问题的另一部分,如何强制Xcode编译为C++,是一个红色的鲱鱼(必须与我正在使用的openCV构建有一些兼容性问题) - 并且不再需要此解决方案.但答案是首先,重命名.m文件.mm(对于objective-C++)或.cpp(对于纯C++)...但如果这不起作用,您可以通过更改'文件来强制解决文件检查器中的问题类型'.

更新

您还需要注意在使用openCV框架的任何项目中正确设置C++标准库.较早版本的openCV(to.2.4.2)希望libstdc++更新(2.4.3+)libc++.详细信息:

/sf/answers/993081841/

更新2

openCV现在安装了cocoaPods.引用SebastienThiebaud的话

OpenCV可在Cocoapods上找到.在Podfile中添加一行:pod'OpenCV'.满容易.

"相当容易"......考虑到我们之前的所有麻烦,可能是[最后]年的轻描淡写......