前言
本书为使用开放源代码计算机视觉库(OpenCV)提供了一个实战指南,同时还介绍了大量计算机视觉领域的背景知识以帮助读者充分使用OpenCV。
目的
计算机视觉是一个迅速发展的领域,摄像机价格不断降低且功能越来越强、计算能力的普及以及视觉算法的日臻成熟都带动了该领域的发展。OpenCV在计算机视觉的发展中扮演着重要的角色,它使得数千名研究人员在视觉领域能够获得更高的生产力。由于OpenCV专注于实时视觉应用,因此十分有助于学生和专业人员高效完成项目和加快研究进展,这是通过它提供的一个计算机视觉和机器学习基础架构来实现的,这个基础架构过去只是少数设备完善的实验室的专利。本书目的如下。
为OpenCV提供一份更好的文档——详细说明函数调用约定以及如何正确使用这些函数。
快速帮助读者对计算机视觉的算法原理获得直观的理解。
让读者认识到可以使用哪些算法,以及应用这些算法的场合。
通过许多可用的代码实例,让读者循序渐进地学会如何实现计算机视觉和机器学习算法。
培养读者具有一定的直觉,使其在出现问题的时候能够对一些OpenCV源代码中更高级的子程序进行修正。
简言之,本书既是我们在学校时希望使用的教材,也是我们在工作时希望翻阅的参考书。
本书为OpenCV这个工具提供了注解,旨在帮助读者快速在计算机视觉领域中开展有趣的工作。本书能帮助读者直观地理解算法的原理,这样可以帮助读者设计和调试视觉系统,并使得其他教材中对计算机视觉和机器学习算法的形式化描述更易于理解和记忆。
总而言之,如果直观地领会了算法的原理,便容易理解复杂的算法和与这些算法相关的数学知识。
本书面向的读者
本书包括算法描述、可运行的例程代码以及对OpenCV库中的计算机视觉工具的解释,因此,它应该会对多种类型的读者提供有益的帮助。
专业人员
对于需要迅速实现计算机视觉系统的专业人员来说,例程代码为开始工作提供了一个快速上手的框架。我们对算法原理的直观描述可以迅速教会读者或提示读者其 用法。
学生
如我们所说,本书是我们当年在学校时希望使用的教材。直观的解释、详细的文档和例程代码都有助于读者在计算机视觉领域获得迅速成长,完成更多有趣的课堂项目,并且最终为计算机视觉领域贡献新的研究成果。
教师
计算机视觉是一个迅速发展的领域。我们发现,在需要时讲解一些经典的理论、当前的论文或专家的讲稿,学生会迅速地掌握一本课本。同时,学生也可以更早开始一些课程项目,尝试更多有挑战性的任务。
业余爱好者
计算机视觉非常有趣,可任由你天马行空地“创造”!
我们对于为读者提供充分的直观感受、文档以及可运行的代码给予了强烈的关注,目的是使读者能够迅速实现实时计算机视觉应用程序。
本书声明
本书并不是一本正规教材。毋庸讳言,本书的许多知识点都涉及了大量数学细 节 ,但这样做的目的是加深读者对算法的理解,或者讲清楚算法中所用的前提条件。在这里,我们并不打算进行严格的数学推导,这也许会让一些一直用严格数学表达的人感到不习惯。
本书不是为理论研究人员所写,因为它更多地关注应用。本书针对视觉提供通用的知识,而不是仅仅针对计算机视觉的某些特定应用(例如医学图像或遥感分析)。
也就是说,作者深信一点:读完这里的解释之后,学生不仅会更好地学习理论知识,还会将这些知识铭记于心。因此,本书是针对理论课程的理想辅导书,也适用于入门课程或实战性较强的课程。
关于本书中的程序
本书所有的例程都基于OpenCV 1.0版本。代码可以在Linux或Windows下运行,也可能在OS-X下运行。本书的例程源代码可以本书的网站下载。OpenCV可以从它的代码管理网站下载。
OpenCV仍在不断发展,每年都会发布一到两个正式版本。一般来说,可以从代码管理网站的SVN服务器(获得最新代码。
预备知识
在大多数情况下,读者只需要知道如何用C语言编程,也许需要知道一些C++编程知识。许多数学相关的内容属于选读,并带有特定标记。书中涉及的数学知识包括简单的代数和基本的矩阵代数,并且假定读者较熟悉最小二乘优化问题的求解方法,以及高斯分布、贝叶斯定律和简单函数的求导等一些基本知识。
这些数学知识用于帮助读者加深对算法的直观理解。读者可以跳过数学和算法描述,只通过函数定义和范例代码,便可让计算机视觉应用程序启动和运行。
如何充分使用本书
本书不需要按照顺序从头到尾地阅读。它可以作为一种用户手册:在需要的时候,可以从中查找函数;如果想知其所以然,可以阅读函数的描述。然而,本书的设计初衷是更偏向于教程。它帮助读者基本了解计算机视觉,如何以及何时使用所选定的算法。
本书可以作为计算机视觉领域本科生或研究生的辅导书或主要教材。学生阅读本书可迅速了解计算机视觉,然后再辅以其他教材中的理论知识以及本领域内的学术论文,更深入地学习。每一章后面都有练习题,可以帮助测试学生对知识的掌握情况,并加深理解。
您可以通过下面三种方式之一阅读本书。
仅选有用部分
开始阅读本书时,请先阅读第1章~第3章,然后根据自己需要阅读其他章节。本书不一定要按照顺序阅读,不过第11章和第12章除外。
最佳进度
一个星期只读两章,直到用六个星期读完第1章~第12章(第13章有些特殊,详见下文讨论)。然后开始项目,着手解决具体问题,并阅读其他教材和相关的论文。
快速掌握
在充分理解内容的前提下尽快浏览本书第1章~第12章。然后开始项目,着手解决具体问题,并阅读其他的教材和相关的论文。该方法可供专业人员选用,同时也适用于比较高级的计算机视觉课程。
第13章的篇幅较多,介绍了机器学习的背景知识、OpenCV中实现的机器学习算法背后的细节,以及如何使用这些算法。当然,机器学习与物体识别以及计算机视觉的很多方面相关,详细描述需要一本书的篇幅。专业人员会发现,这是未来阅读文献(或直接使用OpenCV库中的代码立项)的一个理想起点。对于一般的计算机视觉课程来说,本章可作为选学内容。
这是作者所希望的教授计算机视觉的方法:学生掌握要点后,快速学完课程内容,然后动手做一些有意义的课堂项目,同时指导老师通过其他教材或论文提供该领域的一些有深度的知识。该方法对小学期、整个学期或两个学期的课程都适用。学生的兴趣和创造力可以被迅速激发起来,很好地将自己所理解的知识和可运行的代码结合起来。当他们开始更有挑战性且更耗时的项目时,指导老师可帮助他们开发和调试复杂的系统。对于课时较多的课程,项目本身可以以项目管理的方式变成教育方式。首先建立其一个可以运行的系统,并优化改进该系统,然后进行研究。课程的目标是每个项目可以发表一篇会议论文,并且在随后(课程结束之后)的工作中发表更多相关论文。
本书所用约定
本书采用如下印刷约定。
斜体
表示新名词,URL,电子邮件地址,文件名,文件扩展名,路径名,目录和Unix实用程序。
等宽字体
表示命令、选项、开关、变量、属性、键值、函数、类型、类、命名空间、方法、模块、参数、参数、值、对象、事件、事件句柄、XML标签、HTML标签、文件内容或者命令输出。
等宽粗体
显示需要用户逐字输入的命令或者其他文字。也用于代码中的强调。
等宽斜体
显示应该被用户输入值代替的文字。
[…]
表示引用参考文献。
注意: 该图标表示一个技巧,建议或一般注解。
警告:该图标表示警告或注意事项。
使用例程代码
OpenCV是免费的,可用于商业和研究,因此对本书的例程代码,我们也持同样的态度。本书例程代码可以用于课程作业、科研或商业产品。如果在使用OpenCV时能在参考文献中引用本书,我们将很高兴,但这不是必须的。它如何帮助你完成课程作业(最好保密)这方面的细节可以不必告诉我们,但在借助于OpenCV时,我们希望知道您是如何将计算机视觉用于科学研究,课堂教学以及商业产品的。再次强调,这不是必须的,但我们总期待着您能跟我们讲几句。