
前言
北宋大家张载的“横渠四句”非常有名,“为天地立心,为生民立命,为往圣继绝学,为万世开太平”,历史上很多名人以之作为安身立命追求事业的勉励语。第一次读这句名言时,我非常激动,现在也时常想起,虽无法实现却也心向往之。
有幸与电子工业出版社再次合作,个人能力浅薄,不敢妄谈“为往圣继绝学”,但也希望自己的书有一些实用价值,能在技术传播中贡献一份绵薄之力。在写作前,刘伟老师(本书编辑)和我反复推敲写作的目的是什么,这本书与别的图书有什么不同,能给读者带来什么帮助等命题。我们围绕上述命题提出了如下4个问题:为什么要学习图像处理?为什么要选用OpenCV?为什么要用OpenCV 4?这本书与别的图书有什么不同?
下面就通过对这4个问题的回答来介绍一下本书,让读者能够对本书的写作目的、写作思路,以及如何参考本书进行OpenCV的学习有一个初步的理解。
为什么要学习图像处理?
图像处理之所以重要,是因为人类对认知世界的需要。
我们都知道,当前智能手机的普及率非常高,当看到美景或有事情发生时,几乎所有人都会拿起手机拍照或录制视频,并将它们分享在各大平台。爱美之心,人皆有之,因此,相机软件也集成了越来越多的功能,如美颜、滤镜等,其中很多功能都是在照片采集后通过图像处理技术实现的。
各大手机厂商不遗余力地升级拍照或摄像功能,为了让用户能存储更多的照片和视频而不断提升手机的存储空间,这些都证明了用户对图像和视频的需求非常强烈,从侧面也反映了图像处理技术的广阔市场前景。
为什么要选用OpenCV?
OpenCV之所以大行其道,是因为其简单易用。
作为一个开源的计算机视觉库,OpenCV由C++语言编写,读者可以通过阅读源码对算法的实现细节进行学习,可读性好。另外,OpenCV还实现了很多图像处理和计算机视觉中的通用算法,在Linux、Windows、Android和macOS等操作系统上均可运行,即一套代码能在多种系统中运行,通用性好。
OpenCV支持C++、Python、Java等语言和MATLAB等多种程序接口,在最新版本中还提供了对C#、Ch、Ruby、Go语言的支持,不同语言中的接口名称和参数差异较小,用户在不同的开发环境中只需改写少量代码即可使用,一致性好。
OpenCV在图像处理领域深耕多年,不仅对算法做了很多优化,还针对实用场景做了加速处理,如支持对CUDA等硬件的加速。另外,它还可以通过引入Intel的IPP高性能多媒体函数库获得更高的运行处理速度,高效性好。
OpenCV大受欢迎还有一个重要的原因,就是当前深度学习和计算机视觉的飞速发展。在计算机视觉中进行模型训练和使用时,需要对输入图像做很多预处理和后处理,这些都需要用到OpenCV库。OpenCV中很多算法的实现可以弥补深度学习模型推理耗时的缺陷,在某些特定场景下,OpenCV中的传统算法可以获得与深度学习方法相差不大的结果,但在执行速度上远胜于深度学习方法,应用性好。
为什么要用OpenCV 4?
不管什么软件,新版本的出现基本上都是因为对旧版本的代码做了很大力度的重构或增加了很多新特性,已经无法与旧版本兼容。
OpenCV 4版本升级中废弃了一些旧的API,对一些枚举类型的名称写法做了修改,对一些函数的参数做了调整,还有一个比较重要的变化就是增加了对dnn模块的支持。如果读者目前使用的是OpenCV 3,那么也不必对这些变化有过多的焦虑,因为OpenCV的错误提示清晰易懂,错误定位与修改均比较快速、简单。
此外,建议读者在学习一门新技术时,最好选用较新的软件版本,因为很多软件在发展过程中会逐渐停止对旧版本的支持。
这本书与别的图书有什么不同?
OpenCV对图像处理和计算机视觉算法做了系统封装,这些算法被划分为很多模块,其中最重要的就是core模块(第3章)和imgproc模块(第4章和第5章),而很多同类图书的内容就是围绕这两个模块展开的,但是本书内容没有局限于此。
本书以OpenCV模块来分章节作为写作思路,在每章的开始都有对模块的导读,导读内容依托OpenCV源码,讲述了本模块封装的算法函数,对其中的函数和数据结构做了清晰明了的注释,因此,导读内容既可以为读者学习算法提供帮助,又可以为读者开发查询提供参考。
本书在第1章讲述了C++开发语言和Python开发语言,以及Windows和Linux系统中的OpenCV开发环境的搭建,只要读者按照案例中的操作步骤执行,就能够顺利地运行OpenCV库,不必为开发环境搭建中的各种问题焦头烂额。
core模块和imgproc模块的重要性毋庸置疑,本书也针对这两个模块总结了很多案例,对这两个模块的算法做了透彻的讲解。但对于其他模块,如可视化模块highgui、视频处理模块videoio、视频分析模块video、照片处理模块photo、2D特征模块features2d、相机标定与三维重建模块calib3d、传统目标检测模块objdetect、机器学习模块ml、深度学习模块dnn,在其他图书中鲜有涉及,而本书对这些模块都做了详细导读和案例讲解。
这种系统化的讲解能够让读者对OpenCV有一个全面的认识,也能够让读者有机会了解OpenCV的强大功能,为读者在处理特殊需求时提供知识储备。
最后,感谢家人、朋友和出版社对本书写作的支持。希望本书能够给对OpenCV和图像处理有需求的读者以帮助,对于书中的疏漏之处,请不吝指教。如果有深度学习和计算机视觉学习需求的读者,敬请关注我的另一本图书《深度学习计算机视觉实战》,该书对深度学习和计算机视觉算法的基础、图像处理基础、计算机视觉案例、TensorFlow Lite,以及基于TensorFlow Lite在移动端和PC端的部署做了一站式的讲解,在此对您的支持表示衷心的感谢。
肖铃
2021年10月