Learning OpenCV with iOS:Hello OpenCV

概念介绍

图像处理、计算机视觉

图像处理,用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别 3 个部分。

计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取‘信息’的人工智能系统。因为感知可以看作是从感官信号中提 取信息,所以计算机视觉也可以看作是研究如何使人工系统从图像或多维数据中“感知”的科学。

图像处理与计算机视觉区别: 图像处理侧重于对图像的“处理”(如:增强,还原,去燥,分割等)。 计算机视觉则重在使用计算机来模拟人的视觉,模拟才是计算机视觉的目的。

OpenCV

OpenCV(Open Source Computer Vision Library)于 1999 年由Intel建立,如今由 Willow Garage 提供支持。 OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉库,可以运行在LinuxWindowsMac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 覆盖了计算机视觉的许多领域,如产品检测、信息安全、立体视觉和机器人、医学成像等。因为计算机视觉和机器学习关系密切,所以 OpenCV 还提供了 MLL(Machine Learning Library)机器学习库。

常用链接:

OpenCV 官方主页

OpenCV github 主页

OpenCV iOS tutorials

环境搭建

“工欲善其事必先利其器”,接下来我们先搭建一下开发环境,借此了解下 OpenCV 的基本架构。

创建项目

注:这里以 Objective-C 作为语言是因为 OpenCV 接口为 C++,使用 Objective-C 较好与其交互。

加入 opencv2.framework

前往https://opencv.org/releases.html下载iOS pack。

将 opencv2.framework 加入项目

将 OpenCV 所需的依赖库添加到项目中

  • CoreGraphics.framework
  • Foundation.framework
  • UIKit.framework

如果要使用摄像头做视频处理,还需要添加以下依赖库:

  • CoreVideo.framework
  • CoreMedia.framework
  • AssetsLibrary.framework

Say Hello

新建 OpenCV.h & OpenCV.mm,并添加以下代码

  • 注:因为 OpenCV 是 C++写的,所以引入项目中的文件需要使用 Object-C++的兼容方式来写,具体的做法就是将需要导入 OpenCV 头文件的 m 文件改成 mm 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
//  OpenCV.h
//  LearningOpenCV
//
//  Created by CatchZeng on 2018/6/12.
//  Copyright © 2018年 catch. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface OpenCV : NSObject

+ (UIImage *)gray:(UIImage *)image;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//
//  OpenCV.m
//  LearningOpenCV
//
//  Created by CatchZeng on 2018/6/12.
//  Copyright © 2018年 catch. All rights reserved.
//

//!!!opencv的头文件引入必须在其他头文件之前
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#import <opencv2/core/core_c.h>
#import "OpenCV.h"
using namespace cv;

@interface OpenCV() {
}

@end

@implementation OpenCV

+ (UIImage *)gray:(UIImage *)image {
    Mat mat;
    UIImageToMat(image, mat);

    Mat grayMat;
    cvtColor(mat, grayMat, CV_BGR2GRAY);

    UIImage* result = MatToUIImage(grayMat);
    return result;
}

@end

新建视图控制器 SayHelloViewController

1
2
3
4
5
6
7
8
9
10
11
class SayHelloViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var grayImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        grayImageView.image = OpenCV.gray(#imageLiteral(resourceName: "sayHello"))
    }
}

效果

源码地址: https://github.com/CatchZeng/LearningOpenCV

OpenCV 基础架构

OpenCV 包含的内容较多,在学习之前先了解下它的整体模块架构,再选择自己感兴趣的部分重点学习,这样学起来比较得心应手。

鉴于此,下面我们一起来看下 OpenCV 的整体模块架构。

从上图可看到 OpenCV 的所有模块:

  • 【calib3d】Calibration(校准)和 3D 这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容,包括基本的多视角几何算法、单个立体摄像头标定,物体姿态估计,立体相似性算法,3D 信息的重建等。

  • 【core】核心功能模块,包含如下内容:

    • OpenCV 基本数据结构
    • 动态数据结构
    • 绘图函数
    • 数组操作相关函数
    • 辅助功能与系统函数和宏
    • 与 OpenGL 的互操作
  • 【feature2d】2D 功能框架。包含如下内容:

    • 特征检测和描述
    • 特征检测器(Fearure Detectors) 通用接口
    • 描述符提取器(Description Extractors) 通用接口
    • 描述符匹配器(Description Eatchers) 通用接口
    • 通用描述符(Generic Description)匹配器通用接口
    • 关键点绘制函数和匹配功能绘制函数
  • 【imgproc】Image 和 Process 这两个单词的缩写组合,图像处理模块。包含如下内容:

    • 线性和非线性的图像滤波
    • 图像的几何变换
    • 其他的图像变换
    • 直方图相关
    • 结构分析和形状描述
    • 运动分析和对象跟踪
    • 特征检测
    • 目标检测等内容
  • 【flann】Fast Library For Approximate Nearest Neighbors,高维的近似近邻快速搜索算法库,包含以下两个部分:

    • 快速近似最近邻搜索
    • 聚类
  • 【highgui】高层 GUI 图形用户界面,包含媒体的输入输出、视频捕捉、图像和视频的解码编码、图形交互界面的接口等内容。

  • 【ml】Machine Learning,机器学习模块, 基本上是统计模型和分类算法,包含如下内容:

    • 统计模型 (Statistical Models)
    • 一般贝叶斯分类器 (Normal Bayes Classifier)
    • K-近邻 (K-NearestNeighbors)
    • 支持向量机 (Support Vector Machines)
    • 决策树 (Decision Trees)
    • 提升(Boosting)
    • 梯度提高树(Gradient Boosted Trees)
    • 随机树 (Random Trees)
    • 超随机树 (Extremely randomized trees)
    • 期望最大化 (Expectation Maximization)
    • 神经网络 (Neural Networks)
    • MLData
  • 【objdetect】目标检测模块,包含 Cascade Classification(级联分类)和 Latent SVM 这两个部分。

  • 【photo】Computational Photography,包含图像修复和图像去噪两部分。

  • 【stitching】images stitching,图像拼接模块,包含如下部分:

    • 拼接流水线
    • 特点寻找和匹配图像
    • 估计旋转
    • 自动校准
    • 图片歪斜
    • 接缝估测
    • 曝光补偿
    • 图片混合
  • 【video】视频分析组件,该模块包括运动估计,背景分离,对象跟踪等视频处理相关内容。

  • 【Videostab】Video stabilization,视频稳定相关的组件,官方文档中没有多作介绍,不管它了。

看到到这里,相信大家已经对 OpenCV 的模块架构设计有了一定的认识,OpenCV 其实就是这么多模块作为代码容器组合起来的一个 SDK,了解这些可以更快的学习 OpenCV 了!

小结

本篇从概念到环境搭建再到基本架构的角度介绍了 OpenCV,让读者有一个宏观的认识。下一篇开始,我将以原理+例子的形式一步步介绍 OpenCV 的各个模块。

CatchZeng
Written by CatchZeng Follow
I am a boy who likes 💻 deep learning, 📱 mobile and 💻 server development. I like to build some 🔨 tools to improve development efficiency.