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框架的当前版本时,我可以包含features2d和nonfree,并且可以顺利构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的最新副本,否则你会像我一样绊倒。 -
您的输出文件夹将结束与两个子文件夹,
build
和opencv2.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 ++编译器中运行,所以不会显示错误。