官网上发布了iOS framework库文件,它是一个包含库头文件和用于静态链接的二进制文件的包。二进制文件支持所有iOS设备体系结构(ARMv7、ARMv7s和ARM64)和所有iOS模拟器体系结构(x86和x64)。因此,我们可以对iOS应用程序项目的所有配置使用相同的框架文件。
OpenCV 3被设计成模块化的。它的构建过程是高度可配置的,允许在不破坏其他模块的情况下添加、重新实现或删除模块。每个模块由一个公共头文件以及各种私有头文件和实现文件组成。一些模块被认为是OpenCV构建的标准组件,这些标准模块由库的核心开发团队维护和测试。其他模块被认为是额外的,这些额外的或“贡献的”模块由第三方贡献者维护和测试。这些额外的模块统称为opencv_contrib。
如果我们仅仅是使用标准模块,就可以获得OpenCV for iOS的正式预构建发行版。这个预构建发行版由一个framework文件组成,opencv2.framework。如果我们想使用额外的模块,我们必须自己为自己构建opencv.framework.接下来,让我们检查获取或构建框架的步骤。
[对于本书的项目,额外模块并不是必要的,但是推荐使用它们,因为我们将使用它们来实现一些可选特性。]
1.2.1 获取预构建标准模块framework
前往https://opencv.org/releases.html并且点击对应版本的iOS pack来下载OpenCV for iOS.如果我们需要OpenCV 3.1 或者更新的版本.下载的文件名为opencv2.framework.zip.解压之后得到opencv2.framework文件.之后,我们将添加这个framework到我们的iOS应用程序.我们用以下代码导入该库的头文件:
#import <opencv2/core.hpp>
这样是从opencv2.framework导入了核心模块的头文件.如果要导入其它的模块,导入的申明语句将会不同.
1.2.2 用源文件中构建标准模块和附加模块的framework
我们尝试获取并编译所有的OpenCV模块,概括地说,这个过程将包含以下四个步骤:
- 获取OpenCV标准模块的源代码。将此存储在任何文件夹中,我们将之称为<opencv_source_path>,eg:
/Users/<User>/Downloads/Work/opencv_source_path
。 - 获取OpenCV的额外模块的源代码。将其存储在任何文件夹中,我们将其称为<opencv_contrib_source_path>,eg:
/Users/<User>/Downloads/Work/opencv_contrib_source_path
。 - 尝试构建所有模块并将构建结果存储在任何文件夹中,我们将其称为<opencv_contrib_build_path>,eg:
/Users/<User>/Downloads/Work/build
- 如果有模块无法构建,则通过删除模块或修补其源代码来解决问题。然后,尝试重建。
现在,让我们按照上述的步骤,讨论下每一步的具体操作.为了获得OpenCV的最新源代码,我们可以使用Git,一个开源版本控制工具。我们在安装Xcode命令行工具时,就已经安装了Git.OpenCV的标准模块和额外模块分别托管在GitHub(在线仓库托管服务器)上的两个仓库中。要将标准模块的源代码下载到<opencv_source_path>,请运行以下命令:
$ git clone https://github.com/opencv/opencv.git <opencv_source_path>
类似地,要将额外模块的源代码下载到<opencv_contrib_source_path>,请运行以下命令:
git cone https://github.com/opencv/opencv_contrib.git <opencv_contrib_source_path>
(这样下载的是仓库中当前的最新OpenCV的代码,小编觉得还是去https://github.com/opencv/opencv_contrib/releases和https://github.com/opencv/opencv/releases下载指定发布版本的代码比较好,小编自己用的是都是4.0.0版本的)
[Git更多的资料,请参阅Scott Chacon和Ben Straub的《Pro Git,第二版》(Apress,2014)。免费电子书版本可在https://www.git-scm.com/book获取]
OpenCV的源代码中附带了为各个平台准备的编译脚本.iOS编译脚本有两个参数,构建结果的存放路径和opencv_contrib的源代码路径.用以下的方式运行这个脚本:
$ <opencv_source_path>/platforms/ios/build_framework.py <opencv_contrib_build_path> --contrib <opencv_contrib_source_path>
阅读脚本的输出来观察是否有模块编译失败.因为opencv_contrib包含了不同作者的试验模块,并且有的作者或许没有很好地测试他们的模块的iOS兼容性.比如,下面的输出表示在’saliency’模块中有兼容性的错误(modules/saliency):
如果我们并不需要这个有问题的模块,我们只要简单地在<opencv_contrib_source_path>/modules中移除掉相关的子文件夹,然后重新运行build_framework.py就好了.比如,为了避免构建’saliency’模块,我们删除掉整个文件夹<opencv_contrib_source_path>/modules/saliency.
[对于这本书的项目来说,以下两个模块是有用的:
· xfeatures2d:这个模块提供了额外的算法来匹配图片的特定细节信息
· xphoto:这个模块提供了额外的图片处理技术]
另一方面,如果我们确实需要这个有问题的模块,那么首先必须有人修改源代码,以便它能够在iOS平台上顺利编译和运行.修改open_contrib中的源代码已经超出了本书的范围,但是如果你对c++ 编程很精通,我鼓励你抽空尝试一下.或者,你可以在https://github.com/opencv/opencv_contrib/issues中提出一个问题,然后等待模块作者的回应.
如果build_framework.py正常工作,将会打印
**INSTALL SUCCEEDED**
并且在<opencv_contrib_build_path>中创建opencv2.framework文件.之后来我们将添加该framework到我们的iOS应用程序中去.我们用以下的方式导入头文件:
#import <opencv2/xphoto.hpp>
这样就从opencv2.framework中导入了xphoto模块的头文件.导入语句将根据模块的名称而变化。
1.2.3 在我们的代码中设置附加模块为可选
因为附加模块不如标准模块那么稳定,我们可能想让附加模块在我们的代码中是可选的.将可选的代码放在条件编译预宏中,我们可以很容易地切换启用或者停用他们来测试效果.参考以下代码:
#ifdef WITH_OPENCV_CONTRIB
#import <opencv2/xphoto.hpp>
#endif
如果我们想要使用opencv2_contrib,我们只要在Xcode的项目设置里添加WITH_OPENCV_CONTRIB宏.这样,在前面的例子中,xphoto.hpp头文件就会导入到我们的代码中.详细的创建条件编译宏将在本章后面的配置工程这一节中介绍.