计算机视觉软件库OpenCV的开发基础介绍( 二 )


近年来 , 在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域 , OpenCV可谓大显身手 , 而这些 , 仅仅是其应用的冰山一角 。
如今 , 来自世界各地的各大公司、科研机构的研究人员 , 共同维护支持着OpenCV的开源库开发 。 这些公司和机构包括:微软 , IBM , 索尼、西门子、google、intel、斯坦福、MIT、CMU、剑桥 。
计算机视觉市场巨大而且持续增长 , 且这方面没有标准API , 如今的计算机视觉软件大概有以下三种:
(1)研究代码(慢 , 不稳定 , 独立并与其他库不兼容)
(2)耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
(3)依赖硬件的一些特别的解决方案(比如视频监控 , 制造控制系统 , 医疗设备)这是如今的现状 。
如果能有一个统一的标准API , 将简化计算机视觉程序和解决方案的开发 , 而OpenCV致力于成为这样的标准API 。
OpenCV致力于真实世界的实时应用 , 通过优化的C代码的编写对其执行速度带来了可观的提升 , 并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度(注:OpenCV 2.0版的代码已显著优化 , 无需IPP来提升性能 , 故2.0版不再提供IPP接口) 。 下图为OpenCV与当前其他主流视觉函数库的性能比较 。
计算机视觉软件库OpenCV的开发基础介绍文章插图
3、OpenCV内部构成OpenCV主体分为五个模块 , 其中四个模块如下所示:
计算机视觉软件库OpenCV的开发基础介绍文章插图
OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法 。 ML是机器学习库 , 包含一些基于统计的分类和聚类工具 。 HighGUI包含图像和视频输入/输出的函数 。 CXCore包含OpenCV的一些基本数据结构和相关函数 。
目前 , OpenCV的最高版本为OpenCV4.3.0 。 其中OpenCV3.0和OpenCV2.0的版本相比 , 改动比较大 , 主要改动如下:
(1)大体上保留了OpenCV 2经典的C++和Python编程接口风格 。 其中 , Python接口大大增强 , 也加入了Python 3.x的支持 。 一般来说 , 以前版本的程序只要做少数修改 , 就可以使用OpenCV 3了 。 另外还改善了Java接口 , 并且加入了MATLAB支持 。
(2)架构调整 。 图片、视频编解码从highgui模块分离出来 , 组成了imgcodecs和videoio 。 原先的OpenCL模块ocl事实上与其 它模块融为一体 , 而CUDA加速模块gpu分解成了数个以cuda开头的模块 。 此外 , 除了官方支持的OpenCV代码 , 还有一些自发贡献的内容、不稳定的 内容 , 或者版权尚存争议的内容 , 都放到了新的仓库opencv_contrib中 。
(3)更多新算法 。 新版本包括了TLD、鱼眼镜头模型等全新算法 , 还包括了一些更高层次可以直接拿来用的高级封装 , 比如汽车检测等 。
(4)引入T-API , 使OpenCL加速更容易 。 目前可以参考OpenCV源代码中T-API的范例 。 可以发现 , 开启和关闭OpenCL加速 , 只需要一个语句就够了 。 这也就是为什么ocl模块会消失了吧 。
(5)更多指令集优化 。 除了之前为Intel CPU做的优化以外 , OpenCV 3还容纳了ARM平台NEON指令集的支持 。 通过英特尔的帮助 , OpenCV 3对x86和x64平台默认使用IPP 。 下图是OpenCV3.0中部分函数得到加速的示意图 。
计算机视觉软件库OpenCV的开发基础介绍文章插图
下面主要介绍OpenCV3.0版本的东西 。
OpenCV3.0的sources文件结构:
(1)3rdparty/ , 包含第三方的库 , 比如视频解码用的 ffmpeg , jpg、png、tiff等图片的开源解码库 。
(2)apps/ , 包含进行 haar 分类器训练的工具 , opencv 进行人脸检测便是基于 haar 分类器 。 如果你想检测人脸以外的图片 , 千万不要错过这几个工具 。
(3)cmake/ , 包含生成工程项目时 cmake 的依赖文件 , 用于智能搜索第三方库 , 普通开发者不需要关心这个文件夹的内容 。
(4)data/ , 包含 opencv 库以及范例中用到的资源文件 , haar 物体检测的分类器位于haarcascades子文件中 。
【计算机视觉软件库OpenCV的开发基础介绍】(5)doc/ , 包含生成文档所需的源文件以及辅助脚本 。
(6)include/ , 包含入口头文件 。 opencv 子文件夹中是 C 语言风格的API , 也就是《Learning OpenCV (第一版)》中描述的API函数 , 官方将逐渐淘汰 C 风格函数 , 因此我不推荐大家使用该文件夹中的头文件 。 opencv2 子文件中只有一个 opencv.hpp 文件 , 这是 cv2 以及 cv3 推荐使用的头文件 。