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 - 最近已经转移到非自由。
这真是一个双重问题(抱歉; - )
更新
我克隆了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 ++标题? 答案 0 :(得分:10)
我现在一切都在工作。在对openCV.org提供的预建iOS库感到高兴之后,这就是我所做的......
从gitHub存储库的克隆编译openCV for iOS。运行build_framework.py
(在发行版的ios
文件夹中),指向您选择的输出目录。 一定要有最新的CMake 副本,否则你会像我一样绊倒。
您的输出文件夹最终会有两个子文件夹build
和opencv2.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
.mm文件在iOS中的C ++编译器中运行,因此不会显示错误。