一、OpenCV 概述
- OpenCV(开源计算机视觉库:http://opencv.org)是一个开源的bsd许可库,包含数百种计算机视觉算法。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,可以运行在Linux、Windows、Mac OS、iOS和Android操作系统上。
二、在 iOS 上集成 OpenCV 库
集成 OpenCV 到工程有以下三种方式:
- 使用Cocopods进行管理依赖 pod ''OpenCV''
- 在官网OpenCV-iOS framework直接下载编译好的库
- 从 GitHub 拉下源码,编译成framework,导入工程中
下面提前体验一下OpenCV的强大之处:
OpenCV官网提供的官方代码
三、构建opencv + opencv_contrib的framework
- 标准模块:opencv
- 额外的模块:opencv_contrib
此存储库用于开发所谓的“额外”模块、贡献功能。新模块通常没有稳定的API,并且没有经过良好的测试。因此,它们不应该作为官方OpenCV发行版的一部分发布,因为该库保持了二进制兼容性,并试图提供良好的性能和稳定性。因此,所有新模块都应该单独开发,并首先在opencv_contrib存储库中发布。稍后,当模块成熟并流行起来时,它被转移到中央OpenCV存储库,开发团队为这个模块提供生产质量支持。
我们将尝试获取和构建OpenCV的所有模块。大致说来,这一进程将包括以下四个步骤:
- 获取OpenCV标准模块的源代码。将其存储在任何文件夹中,我们将其称为<opencv_source_path>.
- 获取OpenCV的额外模块的源代码。将其存储在任何文件夹中,我们将其称为<opencv_contrib_source_path>.
- 尝试构建所有模块并将构建存储在任何文件夹中,我们将其称为<opencv_contrib_build_path>.
- 如果任何模块未能构建,通过删除模块或修复其源代码来解决问题。然后,尝试再次构建。
运行以下命令下载标准模块的源代码:
$ 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文本。
设置应该如下面的截图所示:
附:
将OpenCV和OpenCV_Contrib编译到了同一个Framework中(比较偷懒的方法)
- 复制opencv_contrib\modules下需要的模块(文件夹)至opencv\modules中
- 编译
四、配置工程
1. Info.plist配置
首先,让我们配置我们的应用程序在全屏模式下运行,没有状态栏。在导航窗格顶部选择项目文件。现在,选择编辑器区域中的 General 选项卡,这是XCODE窗口的中心部分。找到 Deployment Info 组,并启用 Hide status bar 和 Requires full screen 复选框,如下面的屏幕截图所示:
状态栏和全屏设置存储在应用程序的 Info.plist 文件中。打开工程的 Info.plist,在编辑器区域中,注意 UIRequiresFullscreen 和 Status bar is initially hidden 最初是隐藏的属性,它们都具有“YES”值。但是,我们仍然需要添加另一个属性来确保状态栏不会出现。悬停在列表中的最后一个项目上,然后单击“+”按钮插入新属性。输入 View controller-based status bar appearance 作为属性的键,并将其值设置为“NO”。如下面的截图所示:
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 项,添加一个新的子项,并输入摄像机值。如图:
对于本工程,我们指定摄像机,因为我们希望使用现场视频作为预览。如果你有一个项目,你只关心捕捉静止图像,你可以指定 still-camera 代替。
Required Device Capabilities参数配置