这篇文章基本上是翻译一篇博客内容。如果在Objective-C和Swift语言下配置OpenCV。
首先要知道OpenCV的库是由C++写的。那么Objective-C运行C++是没什么问题的。但是运行Swift的话需要添加一个bridging header的文件。这个文件的作用是告诉Swift的代码Objective-C里面有什么是可以用的。总览图可以定义为这样:
以举实例说明,如果您已有xcode工程,按照下面的步骤添加上OpenCV就好。这里就从新创建一个项目来说明。
第一步,下载OpenCV框架给iOS用
要想用OpenCV当然必须先下载了。这里是OpenCV的官网。截止撰稿,目前的最新版本是3.4。
第二步,新建一个iOS项目
由于Xcode版本不同,新建页面也可能不一样,这里用的是Xcode9.2。新建项目会吧?随便选一个Single View App就行。到下面的页面,如果你想试Objective-C的话,语言就选Objective-C。想试Swift的选Swift。这里因为Swift比objc多几步,就用Swift来做示范。语言选择Swift。
第三步,导入OpenCV库
找到你在第一步里下来的OpenCV库,直接拉到项目列表里就好了。
当下面窗口出现的时候,把Copy items if needed勾上。
第四步,创建bridging header
这里创建的文件objc和Swift都需要。先创建Objective-C文件,File > New > File (or ⌘N) ,选Cocoa Touch Class.
注意这个文件不是bridging header,而是你以后写OpenCV代码的文件。
随便起个名字,这里叫OpenCVWrapper。
现在分歧来了。如果你一开始语言选的Objective-C的话,不会有一下窗口。
Xcode询问是否创建Bridging Header文件,选择创建。
第五步,配置bridging header文件
为了能清楚的告诉Swift代码能用Objective-C的什么东西,在OpenCVWrapper.h需要导入到header文件当中。所以在bridging header文件添加以下代码:
#import "OpenCVWrapper.h"
第六步,更改为Objective-C++
因为OpenCV是用C++写的,这里要把OpenCVWrapper.m文件的后缀改成OpenCVWrapper.mm。要知道“.m”文件是用C编译器的。“.mm”文件是用C++编译器的。也就是说以后要用OpenCV的话就要在这里写C++代码。
改过之后就可以导入opencv的库了。在OpenCVWrapper.mm中添加以下代码:
#import <opencv2/opencv.hpp>
第七步,测试
随便写个方法测试一下看看文件编译上有没有问题。分别在OpenCVWrapper.h和OpenCVWrapper.mm里加入
OpenCVWrapper.h
@interfaceOpenCVWrapper:NSObject
- (void)isThisWorking;
@end
OpenCVWrapper.mm
@implementationOpenCVWrapper
- (void)isThisWorking{
cout << "Hey" << endl;
}
@end
为了能在console里输出文字,在OpenCVWrapper.mm文件的#import之后添加以下代码:
using namespace std;
最后一步,调用方法
在ViewController文件里import OpenCVWrapper.然后,
如果是Swift的话
override func viewDidLoad() {
super.viewDidLoad()
let openCVWrapper = OpenCVWrapper()
openCVWrapper.isThisWorking()
}
如果是Objective-C的话:
- (void)viewDidLoad {
[super viewDidLoad];
AntiShaking* test = [[AntiShaking alloc]init];
[test testOpenCV];
}
运行。如果看见console里输入:
说明opencv导入成功,并且可以顺利编译了。
注意:
如果build的时候遇到错误说什么在
stitching/detail/blenders.hpp line 63:
enum { NO, FEATHER, MULTI_BAND };
:Expanded from macro 'NO'
是因为Apple的macro check冲突导致的。只要把在OpenCVWrapper.mm中添加:
#import <opencv2/opencv.hpp>
写在所有import的最前面就好了
Ref:
https://medium.com/@borisohayon/ios-opencv-and-swift-1ee3e3a5735b