图像处理( Image Processing
)是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理。
图像处理技术一般包括图像压缩, 增强和复原, 匹配、描述和识别 3 个部分。图像处理一般指数字图像处理( Digital Image Processing
)。其中, 数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组。该数组的元素称为像素,其值称为灰度值。而数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。
OpenCV
的全称是 Open Source Computer Vision Library
, 直译就是“开源计算机视觉库”。取代表开源的单词“Open”、“Computer ” 的首字母“C” 以及“ Vision ”的首字母“V”,组合命名为 OpenCV
。
OpenCV
是一个基于开源发行的跨平台计算机视觉库, 它实现了图像处理和计算机视觉方面的很多通用算法,已经成为了计算机视觉领域最有力的研究工具之一。
OpenCV
由一系列 C
函数和 C++
类构成,拥有包括 500 多个 C
函数的跨平台的中高层 API。 OpenCV
的设计目标是执行速度尽量快, 主要关注实时应用。它采用优化的 C/C++
代码编写,能够充分利用多核处理器的优势, 其主要目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关
应用程序。
OpenCV
还提供 MLL ( Machine Learning Library
) 机器学习库。该机器学习库主要用于统计方面的模式识别和聚类( clustering
)。
OpenCV
官方主页:http://opencv.orgOpenCV Github
主页:https://github.com/opencv/opencvOpenCV
开发版 Wiki
主页:http://code.opencv.org在 /usr/local/include/opencv4/opencv2
目录下,会发现上述文件夹中有个名为 opencv_modules.hpp
的 hpp
文件,里面存放的是OpenCV
中与新模块构造相关的说明代码,打开可以发现其定义的是 OpenCV
所有组件的宏,具体如下。
wohu@wohu:/usr/local/include/opencv4/opencv2$ cat opencv_modules.hpp
/*
* ** File generated automatically, do not modify **
*
* This file defines the list of modules available in current build configuration
*
*
*/
// This definition means that OpenCV is built with enabled non-free code.
// For example, patented algorithms for non-profit/non-commercial use only.
/* #undef OPENCV_ENABLE_NONFREE */
#define HAVE_OPENCV_CALIB3D
#define HAVE_OPENCV_CORE
#define HAVE_OPENCV_DNN
#define HAVE_OPENCV_FEATURES2D
#define HAVE_OPENCV_FLANN
#define HAVE_OPENCV_GAPI
#define HAVE_OPENCV_HIGHGUI
#define HAVE_OPENCV_IMGCODECS
#define HAVE_OPENCV_IMGPROC
#define HAVE_OPENCV_ML
#define HAVE_OPENCV_OBJDETECT
#define HAVE_OPENCV_PHOTO
#define HAVE_OPENCV_STITCHING
#define HAVE_OPENCV_VIDEO
#define HAVE_OPENCV_VIDEOIO
wohu@wohu:/usr/local/include/opencv4/opencv2$
工程文件包含路径为 /usr/local/include/opencv4
,该目录各个模块文件夹如下:
wohu@wohu:/usr/local/include/opencv4/opencv2$ ls
calib3d features2d highgui.hpp objdetect stitching.hpp
calib3d.hpp features2d.hpp imgcodecs objdetect.hpp video
core flann imgcodecs.hpp opencv.hpp video.hpp
core.hpp flann.hpp imgproc opencv_modules.hpp videoio
cvconfig.h gapi imgproc.hpp photo videoio.hpp
dnn gapi.hpp ml photo.hpp
dnn.hpp highgui ml.hpp stitching
wohu@wohu:/usr/local/include/opencv4/opencv2$
下面就是 OpenCV
的所有模块, 按照宏定义的顺序依次介绍。
Calibration
(校准)和 3D 这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容,包括基本的多视角几何算法、单个立体摄像头标定、物体姿态估计、立体相似性算法、3D 信息的重建等。
核心功能模块,包含如卜内容:
OpenCV
基本数据结构OpenGL
的互操作人类视觉系统倾向于从给定场景中提取主要特征,然后记住它,这样便于后续的检索。为了模仿这一点,人们开
始设计各种特征提取器,用于从给定的图像中提取出这些特征点。
流行的算法包括尺度不变特征变换(Scale Invariant Feature Transform,简称SIFT)、加速鲁棒特征(Speeded Up Robust Features,简称SURF)和加速分段测试特征(Features From Accelerated Segment Test,简称FAST)。
也就是 Features2D
, 即 2D 功能框架, 包含如下内容:
Fast Library for Approximate Nearest Neighbors
, 高维的近似近邻快速搜索算法库,包含以下两个部分:
高层 GUI
图形用户界面,可用于处理所有高级用户界面操作,包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。
它有一个等待功能,可以等你按下键盘上的一个键才进入下一步。还有一个可以检测鼠标事件的功能,在开发交互式应用程序时非常有用。
Image
和 Process
这两个单词的缩写组合,图像处理模块。包含如下内容:
可以执行诸如图像过滤、形态学操作、几何变换、颜色转换、图像绘制、直方图、形状分析、运动分析、特征检测等操作。
Machine Learning
,机器学习模块,基本上是统计模型和分类算法,包含如下内容:
它还有一个名为快速近似最近邻搜索库(Fast Approximate Nearest Neighbor Search Library,简称 FLANN)的模块,其中包含用于在大型数据集中进行快速最近邻搜索的算法。
目标检测模块,包含 Cascade Classification
(级联分类)和 Latent SVM
这两个部分。对象检测是指检测给定图像中对象的位置。此过程与对象类型无关。
如果你设计一个椅子检测器,它不会告诉你给定图像中的椅子是高靠背红色的,还是蓝色低靠背的,它只会告诉你椅子的位置。
Computational Photography
,包含图像修复和图像去噪两部分。计算摄影是指使用先进的图像处理技术来改善相机捕获的图像。
计算摄影并不专注于光学过程和图像捕捉方法,而是使用软件来操纵视觉数据。其应用领域包括高动态范围成像,全景图像、图像补光和光场相机等。
images stitching
,图像拼接模块,包含如下部分:
视频分析包括诸如分析视频中连续帧之间的运动、跟踪视频中的不同目标、创建视频监控模型等任务。该模块包括运动估计、背景分离、对象跟踪等视频处理相关内容。
videoio
模块可以处理与视频文件的输入和输出相关的所有操作。可以轻松地从网络摄像头捕获视频,或以多种不同格式读取视频文件。甚至可以通过设置诸如每秒帧数、帧大小等属性来将很多帧保存为视频文件。
人脸识别是指识别给定图像中的人物。这与人脸检测不同,在人脸检测中,只需要识别给定图像中人脸的位置。
如果你想建立一个可以识别相机前面的人的实用的生物识别系统,首先需要运行一个人脸检测器来识别人脸的位置,然后运行一个单独的人脸识别器来识别该人是谁。有一个名为 face
的 OpenCV
模块用于处理人脸识别。
正如我们之前讨论的那样,计算机视觉试图按照人类感知视觉数据的方式对算法进行建模。因此,在图像中找到显著的区域和对象将是有帮助的,这可以帮助我们处理不同的应用,例如目标识别、目标检测和跟踪等。一个名为 saliency
的模块是专门为此目的而设计的。它提供的算法可以检测静态图像和视频中的显著区域。
Kinect
是捕获深度信息和视觉数据的一个很好的设备例子,它现在能够识别输入的3D对象,并将其与数据库中的模型匹配。如果我们有一个可以识别和定位对象的系统,那么它就可以用于许多不同的应用程序。
一个名为 surface_matching
的模块包含用于 3D 对象识别的算法,以及使用 3D 特征的姿势估计算法。
一个名为 text
的模块包含处理文本检测和识别的各种算法。
在 GitHub
中, 除了存放着正式版 OpenCV
的主仓库和新增加的 opencv_extra
仓库以外, OpenCV 3.0
中还添加了一个名为 opencv_contrib
的全新仓库, 这个新仓库中有很多让人兴奋的功能:包括脸部识别和文本探测,以及文本识别、新的边缘检测器、充满艺术感的图像修复、深度地图处理、新的光流和追踪算法等。
OpenCV
主仓库的地址:https://github.com/opencv/opencv
opencv_extra
仓库地址:https://github.com/opencv/opencv_extra
opencv contrib
仓库地址:https://github.com/opencv/opencv_contrib
正式版 opencv
与 opencv_contrib
之间的区别如下:
OpenCV
官方幵发团队持续集成系统维护, 虽然目前 opencv_contrib
仓库中的代码测试并没有完成, 很多功能不稳定。OpenCV
在 GitHub
中由 Itseez 提供,其有着非常稳定的 API
以及少部分的创新。opencv_contrib
仓库是大多数实验性代码放置的地方,一些 API
可能会有改变,一直会欢迎广大开发者们贡献新的精彩算法。opencv contrib
中的这些额外模块可以在 CMake
中用 OPENCV_EXTRA_MODULES_PATH=/modules
传递给 CMake
文件, 和 OpenCV3
主体中的代码一起编译和运行。opencv_contrib
的文档是自动生成的,可以在 http://docs.opencv.org/master/ 中找到,并会在随后的版本中更加完善。