iOS-OpenCV(一):iOS 上集成 OpenCV 库

一、OpenCV 概述

  • OpenCV(开源计算机视觉库:http://opencv.org)是一个开源的bsd许可库,包含数百种计算机视觉算法。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,可以运行在Linux、Windows、Mac OS、iOS和Android操作系统上。

二、在 iOS 上集成 OpenCV 库

集成 OpenCV 到工程有以下三种方式:
  1. 使用Cocopods进行管理依赖 pod ''OpenCV''
  2. 在官网OpenCV-iOS framework直接下载编译好的库
  3. GitHub 拉下源码,编译成framework,导入工程中

下面提前体验一下OpenCV的强大之处:
OpenCV官网提供的官方代码

三、构建opencv + opencv_contrib的framework

此存储库用于开发所谓的“额外”模块、贡献功能。新模块通常没有稳定的API,并且没有经过良好的测试。因此,它们不应该作为官方OpenCV发行版的一部分发布,因为该库保持了二进制兼容性,并试图提供良好的性能和稳定性。因此,所有新模块都应该单独开发,并首先在opencv_contrib存储库中发布。稍后,当模块成熟并流行起来时,它被转移到中央OpenCV存储库,开发团队为这个模块提供生产质量支持。

我们将尝试获取和构建OpenCV的所有模块。大致说来,这一进程将包括以下四个步骤:

  1. 获取OpenCV标准模块的源代码。将其存储在任何文件夹中,我们将其称为<opencv_source_path>.
  2. 获取OpenCV的额外模块的源代码。将其存储在任何文件夹中,我们将其称为<opencv_contrib_source_path>.
  3. 尝试构建所有模块并将构建存储在任何文件夹中,我们将其称为<opencv_contrib_build_path>.
  4. 如果任何模块未能构建,通过删除模块或修复其源代码来解决问题。然后,尝试再次构建。

运行以下命令下载标准模块的源代码:

$ git clone https://github.com/opencv/opencv.git <opencv_source_path>
$ git clone https://github.com/opencv/opencv_contrib.git <opencv_contrib_source_path>

OpenCV的源代码附带了针对各种平台的构建脚本。iOS构建脚本使用两个参数——构建路径和opencv_contrib源代码路径。以以下方式运行脚本:

$ ./<opencv_source_path>/platforms/ios/build_framework.py <opencv_contrib_build_path> --contrib <opencv_contrib_source_path>
  • 读取脚本的输出,看看是否构建任何模块失败。请记住,opencv_contrib都包含了来自不同作者的实验模块,有些作者可能就iOS兼容性测试过他们的模块。
  • 如果我们不需要有问题的模块,我们可以简单地在/modules中删除它的源子文件夹,然后重新运行build_framework.py。例如,为了避免构建显著性模块,我们可以删除/modules/saliency。

当build_framework.py工作正常,它打印:

** INSTALL SUCCEEDED **

并创建了框架文件<opencv_contrib_build_path>/opencv2.framework。稍后,我们将把这个框架添加到我们的iOS应用程序项目中;我们将使用以下代码导入它的头文件,如:

#import <opencv2/xphoto.hpp>
  • 使额外的模块在我们的代码中是可选的
    由于额外的模块不如标准模块稳定,我们可能希望在代码中让它们成为可选的。通过将可选代码封装在预处理器条件中,我们可以很容易地禁用或重新启用它以测试效果。考虑下面的例子:
#ifdef WITH_OPENCV_CONTRIB
#import <opencv2/xphoto.hpp>
#endif

如果我们想使用opencv2_contrib,我们就会编辑Xcode项目设置来添加带有_opencv_contrib的预处理器定义。然后,在前面的示例中,是xphoto.hpp头文件将被导入到我们的代码中。创建预处理器定义的详细步骤如下:

  • 在Build Settings选项卡中
  • 找到 Apple LLVM 9.0 - Preprocessing
  • 编辑 Preprocessor Macros | Debug and Preprocessor Macros | Release,添加WITH_OPENCV_ CONTRIB文本。

设置应该如下面的截图所示:


image.png

附:

将OpenCV和OpenCV_Contrib编译到了同一个Framework中(比较偷懒的方法)

  • 复制opencv_contrib\modules下需要的模块(文件夹)至opencv\modules中
  • 编译

四、配置工程

1. Info.plist配置
首先,让我们配置我们的应用程序在全屏模式下运行,没有状态栏。在导航窗格顶部选择项目文件。现在,选择编辑器区域中的 General 选项卡,这是XCODE窗口的中心部分。找到 Deployment Info 组,并启用 Hide status barRequires full screen 复选框,如下面的屏幕截图所示:

image.png

状态栏和全屏设置存储在应用程序的 Info.plist 文件中。打开工程的 Info.plist,在编辑器区域中,注意 UIRequiresFullscreenStatus bar is initially hidden 最初是隐藏的属性,它们都具有“YES”值。但是,我们仍然需要添加另一个属性来确保状态栏不会出现。悬停在列表中的最后一个项目上,然后单击“+”按钮插入新属性。输入 View controller-based status bar appearance 作为属性的键,并将其值设置为“NO”。如下面的截图所示:
image.png

2. 添加 frameworks
除了对 opencv2.framework 的依赖,还依赖于 iOS SDK 的以下标准框架:

Accelerate.framework
AssetsLibrary.framework
AVFoundation.framework
CoreGraphics.framework
CoreImage.framework
CoreMedia.framework
CoreVideo.framework
QuartzCore.framework
UIKit.framework
Foundation.framework
Photos.framework
Social.framework

将这些框架添加到 Build Phases | Link Binary With Libraries (项目设置部分)。

3. 指定相机要求
目前,在支持iOS 9的所有设备中都有摄像头。然而,也许在未来,一些iOS设备将缺少相机。为了覆盖这种可能性并防止App Store将我们的应用程序分发给不兼容的设备,我们应该明确地指定需要摄像头。
打开 Info.plist,展开 Required device capabilities 项,添加一个新的子项,并输入摄像机值。如图:

image.png

对于本工程,我们指定摄像机,因为我们希望使用现场视频作为预览。如果你有一个项目,你只关心捕捉静止图像,你可以指定 still-camera 代替。
Required Device Capabilities参数配置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容