如何在iOS配置OpenCV

这篇文章基本上是翻译一篇博客内容。如果在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容