OpenCV
是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python
接口,实现了图像处理和计算机视觉方面的很多通用算法。在本文中,将介绍 OpenCV 库,包括它的主要模块和典型应用场景。
Python安装OpenCV
对于 Linux
和 Windows
操作系统,首需要在 shell
或 cmd
中运行以下命令安装 NumPy:
pip install numpy
然后再安装 OpenCV,可以选择两种不同版本:
pip install opencv-python
pip install opencv-contrib-python
OpenCV主要模块
OpenCV 可以被划分为不同模块,其主要模块如下:
下表整理介绍了各主要模块的作用:
| 模块 | 介绍 |
| — | — |
| core | 核心模块,是定义基本数据结构的模块,也包括库中所有其他模块使用的基本函数 |
| imgproc | 图像处理模块,包括图像滤波、几何图像变换、颜色空间变换和直方图 |
| imgcodecs | 图像文件读写 |
| highgui | 高级GUI,提供UI功能的接口,可以执行以下操作:创建和操作可以显示的窗口、将滑动条添加到窗口、键盘命令和处理鼠标事件等 |
| videoio | 视频I/O,视频捕获和视频编解码器的接口 |
| video | 视频分析模块,包括背景减法、运动估计和目标跟踪算法 |
| calib3d | 摄像机标定和三维重建,包括基本的多视点几何算法、立体匹配算法、目标姿态估计、单摄像机和立体摄像机标定以及三维重建 |
| features2d | 二维特征框架,该模块包括特征检测器、描述符和描述符匹配器 |
| objdetect | 目标检测,检测预定义类的对象和实例(例如,人脸、眼睛、人和汽车) |
| dnn | 深度神经网络(Deep neural network, DNN)模块,本模块包含以下内容:用于创建新层的API、一组预定义的常用层、从层构造和修改神经网络的API、从不同深度学习框架加载序列化网络模型的功能等 |
| ml | 机器学习库(Machine Learning Library, MLL)是一组可用于分类、回归和聚类目的的类和方法 |
| flann | 快速近似近邻库(Fast Library for Approximate Nearest Neighbors, FLANN)是一组非常适合快速近邻搜索的算法,用于多维空间中的聚类和搜索 |
| photo | 计算摄影,提供一些计算摄影的函数 |
| stitching | 图像拼接,实现了一个自动拼接全景图像的拼接流水线 |
| shape | 形状距离和匹配模块,可用于形状匹配、检索或比较 |
| superres | 超分辨率,包含一组可用于提高分辨率的类和方法 |
| videostab | 视频稳定,包含一组用于视频稳定的类和方法 |
| viz | 三维可视化工具,用于显示与场景交互的小部件 |
OpenCV应用场景
OpenCV 可以应用但不仅限于以下场景:二维和三维特征提取、街景图像拼接、人脸识别系统、手势识别、人机交互、动作识别、物体识别、自动检查和监视、分割与识别、医学图像分析、运动跟踪、增强现实、视频/图像搜索与检索、机器人与无人驾驶汽车导航与控制、驾驶员疲劳驾驶检测等。
图像基础
接下来,首先从理论上介绍图像的相关概念。
图像处理中的主要问题
我们看可以把图像看作是三维世界的二维视图,那么数字图像作为2D图像,可以使用称为像素的有限数字集进行表示(像素的概念将在像素、颜色、通道、图像和颜色空间部分中详细解释)。我们可以,将计算机视觉的目标定义为将这些2D数据转换为以下内容:
-
新的数据表示(例如,新图像)
-
决策目标(例如,执行具体决策任务)
-
目标结果(例如,图像的分类)
-
信息提取(例如,目标检测)
在进行图像处理时,经常会遇到以下问题:
-
图像的模糊性,由于受到透视的影响,从而会导致图像视觉外观的变化。例如,从不同的角度看同一个物体会产生不同的图像;
-
图像通常会受许多自然因素的影响,如光照、天气、反射和运动;
-
图像中的一部分对象也可能会被其他对象遮挡,使得被遮挡的对象难以检测或分类。随着遮挡程度的增加,图像处理的任务(例如,图像分类)可能非常具有挑战性。
为了更好的解释上述问题,我们假设需要开发一个人脸检测系统。该系统应足够鲁棒,以应对光照或天气条件的变化;此外,该系统应该