iOS / Swift中的OpenCV入门

对于不认识的人,OpenCV是计算机视觉开放源代码库。 它是用C ++编写的,这意味着您几乎可以在任何地方使用它。 从桌面应用程序到移动应用程序。 简而言之,OpenCV是:

OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库。 OpenCV的构建旨在为计算机视觉应用程序提供通用的基础结构,并加速在商业产品中使用机器感知。 作为BSD许可的产品,OpenCV使企业可以轻松地使用和修改代码。

尽管创建新项目并添加pod或框架不是通常的任意任务,但考虑到它的好处,这是一个相当简单的过程。

首先,您可以克隆包含我们将在此处执行的操作的存储库。 在这个项目中,我们将从手机的摄像头获取视频流,并对其应用一些简单的色彩效果,仅用于演示目的。 因此,您需要将必需的权限添加到您的info.plist文件(即NSCameraUsageDescription

我们将添加OpenCV框架并将其与Swift一起使用。 首先创建一个项目(du!)。 然后初始化pods:

  $ cd project_root_directory 
$ pod init

然后将框架添加到您的Podfile

  pod'OpenCV','〜> 3.1.0.1' 

不要忘记打开由CocoaPods创建的工作区,而不是打开您创建的项目。

OpenCV对称为Mat的n维密集数组数据类型(而不是UIImages 。 因此,我们需要一种在两者之间进行转换的方法。 为此,我们UIImage添加扩展

UIImage + OpenCV.h
UIImage + OpenCV.mm

不要错过.mm扩展名。 它表明它是一个Objective-C ++文件,因此XCode以此进行编译。 否则它将无法正常工作。

接下来,我们将创建一个类,用于从相机获取图像流以进行处理:

OpenCVCam.h
OpenCVCam.mm

上面的类初始化相机,并处理每一帧。 它没有做任何花哨或复杂的事情,但对于初学者来说,这很好。

好了,图像已处理。 现在怎么办? 现在,我们必须在视图控制器中获取图像,或者将其实际使用或呈现。 为此,我们定义了一个委托(在OpenCVCam.mm ):

OpenCVCamDelegate.h

到目前为止并不难,不是吗?

好的,我们差不多完成了。 不过,有一个很小的问题。 我们将在Swift中使用此类。 因此,显然我们必须将其添加到桥接头中。 好吧,不完全是。 如果我们直接将其添加到桥接头文件中,则将其编译为Objective-C,尽管它是一个Objective-C ++文件( .mm ),但仍无法正常工作。 相信我,去过那里,做到了! 因此,现在为我们的OpenCVCam类创建一个包装器类:

OpenCVWrapper.h
OpenCVWrapper.mm

最后,在桥接头中添加一个条目,以将这些类公开给Swift:

  #import“ OpenCVWrapper.h” 

Tadaaaaaa! 我们在这里完成。 现在该回到甜美的Swift了。 您现在要做的就是实例化OpenCVWrapper实例并使用提供的方法。 这是我在文章开头提到的存储库中的示例用法:

ViewController.swift

这很简单,需要做什么。 只要注意imageProcessed在后台线程上执行即可。 因此,如果您要更新UI,请不要忘记在主线程上运行任何必要的代码。