1.1 OpenCV简介
OpenCV提供了一系列的图像处理模块与计算机视觉算法模块。自OpenCV4.x版本开始,其开源许可协议从BSD改为Apache2(商业应用授权),这使开发者可以在商业领域应用开发中更好地使用授权的专利算法,避免专利纠纷,从而进一步扩展了OpenCV商业应用的范围。
1.1.1 OpenCV历史
OpenCV自发布第一个版本至今已超过20年,其间经过了几次大的版本调整。其中OpenCV2、OpenCV3、OpenCV4等都是里程碑式的版本。OpenCV每次进行大的版本调整都会带给开发者一些新的功能与惊喜,这也体现了OpenCV团队主动拥抱技术变革的精神,并始终保持开发框架的实用性。
OpenCV早期一直由Intel支持,后来转由开源社区维护与支持。其源码与模块分为正式的Release模块和扩展模块。Release模块中以早期开发的模块居多,都是一些比较成熟的算法实现。扩展模块中以新开发的模块居多,这些模块大多数不够稳定,在商业项目中直接使用会有一定的技术风险,使用者最好能对模块本身与相关算法有一定程度的了解。同时,因为受到算法专利的影响,可能偶尔会发生上一版本Release模块中支持的函数到了下一版本被放到扩展模块中的情况,但这种情况并不常见,而且如果发生了也会在release log文件中进行说明。
OpenCV发展至今,已经从单纯支持C/C++接口,变成支持Java、JavaScript、Python、C++、C#等多种语言,并支持Windows、Linux、macOS等主流操作系统。
1.1.2 OpenCV的模块与功能
OpenCV最初包含500多个相关的算法实现,截至2023年,OpenCV已经收录了2000多个相关的算法实现。OpenCV官方发布版本中的算法模块经过时间沉淀与项目检验,不断得到优化,稳定性与易用性超高,基于底层支持的加速机制,速度与性能均达到了工业级应用水准。
OpenCV中的常用模块如图1-1所示。(注意,并不是全部模块。)
图1-1 OpenCV模块结构
在图1-1中,横向显示的模块主要如下。
1)最下面一层是图像编解码与视频编解码,OpenCV加载图像与视频文件必须依赖这两个模块。它们是OpenCV基于其他开源库构建而来的,这样OpenCV4就实现了自己的图像数据结构—Mat对象。
2)数据计算模块主要用于一些常见的图像像素处理与操作。
3)数据计算模块之上的图像处理模块与高阶GUI模块是OpenCV中最常用也是最重要的基础模块。传统数字图像处理中的大部分常见算法与功能收录在图像处理模块中,毫不夸张地说,熟练掌握此模块,可以完成常见的图像处理和预处理任务。高阶GUI模块中常用的只有imshow函数。
在图1-1中,竖向的模块都依赖横向的模块。每个竖向模块基本上代表的是视觉领域的一个细分方向,它们也是开发者最常用的模块,主要包括2D特征提取、对象检测、视频分析、机器学习等模块。
本书将主要介绍这些常用模块的使用方法,读者在掌握这些常用模块使用方法的基础上,再去拓展学习其他模块会比较容易。
此外,图1-1最右侧的竖条表示扩展模块,扩展模块必须在单独编译之后方可使用。扩展模块中往往会收录一些最新的算法实现,但它们不是很成熟,没有经过项目的充分验证,所以使用扩展模块的开发者需要有一定的相关知识积累。
1.1.3 OpenCV4里程碑
OpenCV4是OpenCV最新的里程碑版本,其版本命名格式为OpenCV4.x,其中x表示小版本号。OpenCV4是在深度学习与人工智能兴起的背景下发布的,其中加入了对深度学习推理模块与加速模块的支持。同时,OpenCV4的易用性、稳定性、可靠性都达到了一个新的高度。本书将围绕OpenCV4.x版本展开相关知识点的学习,并完成代码实现与程序演示,选择该版本主要出于以下3个方面的考量。
1)OpenCV4与之前的版本存在很大的不同,用官方宣传的话说就是“OpenCV4 is more than OpenCV”。
2)OpenCV4版本的SDK与接口更加人性化,学习曲线平缓,初学者更容易入门,即使没有C++基础也能很快上手。
3)OpenCV4支持丰富的第三方加速库集成,无论是在端侧还是云侧,都可以加速程序运行。
1.1.4 OpenCV发展现状与应用趋势
经过多年的发展,OpenCV因其可靠、开源、支持多种语言、免费集成商业产品等优势,得到了开发者与知名商业公司的青睐。应用场景覆盖全面,对图像处理、机器视觉、工业机器人、智慧农业、无人驾驶等领域都有涉及。随着未来对人工智能与视觉技术需求的不断增加,OpenCV作为开源免费的视觉框架,具有比较明显的竞争优势,必将成为很多商业公司产品开发的首选。相信掌握OpenCV开发框架的技术型人才也会获得丰厚的回报。