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 - 最近已经转移到非自由.
这真是一个双重问题(对不起;-)
更新
我克隆了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
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 ++标头? fou*_*dry 11
我现在一切都在工作.在对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
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++.详细信息:
更新2
openCV现在安装了cocoaPods.引用SebastienThiebaud的话
OpenCV可在Cocoapods上找到.在Podfile中添加一行:pod'OpenCV'.满容易.
"相当容易"......考虑到我们之前的所有麻烦,可能是[最后]年的轻描淡写......
| 归档时间: |
|
| 查看次数: |
9785 次 |
| 最近记录: |