内容简介
计算机视觉是在图像处理的基础上发展起来的新兴学科。OpenCV是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器之一。它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了各种各样的算法。
《学习OpenCV 3(中文版)》由OpenCV发起人所写,站在一线开发人员的角度用通俗易懂的语言解释了OpenCV的缘起和计算机视觉基础结构,演示了如何用OpenCV和现有的自由代码为各种各样的机器进行编程,这些都有助于读者迅速入门并渐入佳境,兴趣盎然地深入探索计算机视觉领域。
《学习OpenCV 3(中文版)》可作为信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等有关专业的高年级学生或研究生的教学用书,也可供相关领域的研究工作者参考。
前言
这本书提供了C++开源计算机视觉库(OpenCV)3.0版本的工作指南,介绍了计算机视觉相关领域的通用背景,以便读者更有效地使用OpenCV。
本书的目标
计算机视觉在以下四个趋势的引导下,已经成为一个快速发展的领域:
• 智能手机的出现让数以百万计的用户都拥有了相机
• 互联网和搜索引擎聚集了海量的图像和视频数据
• 计算资源变成一种廉价的商品
• 视觉算法发展得更加成熟(由于深度神经网络的出现,OpenCV也正在逐渐支持这方面技术,详情可以参考opencv_contrib中的dnn)
OpenCV通过帮助成千上万的视觉工作者去做更多富有创造性的工作,在图像处理领域扮演着重要的角色。由于OpenCV 3.x的存在,不管你是学生还是研究人员,是专家还是初学者,都可以快速建立应用,并且在OpenCV所提供的基于C++的多平台视觉基础架构上实现一个跨越性的发展。
本书的目标如下:
• 通过详细讲述函数的惯用用法以及正确用法,成为一本更好的OpenCV经典参考文档
• 帮助读者对各种计算机视觉算法的工作原理有一个基础的理解
• 培养读者,使其知道什么算法工具可以使用并且应该在什么时候使用
• 提供给读者许多有效的代码,提升其应用计算机视觉和机器学习算法的开发效率
• 针对问题代码给读者提供建议,教读者如何解决一些简单或复杂的问题
本书的写作方式是力求帮助读者快速在计算机视觉领域做一些有意思的事情,因此直观地解释了算法是如何工作的,可以指导读者设计和调试计算机视觉程序,还能够使计算机视觉和机器学习算法的形式化描述更容易理解和记忆。
本书受众
本书包含描述、工作代码示例和OpenCV 3.x库中包含的C++计算机视觉工具说明。因此,本书对各种不同类型的用户都有所帮助。
专业人士和开发者
对于需要快速设计原型或实现专业计算机视觉系统的专家而言,示例代码提供的框架可以帮助他们在此基础上进行快速开发。我们对算法的描述可以快速教会或者提醒读者如何使用它们。由于OpenCV 3.x的设计基于位于硬件加速层(HAL)之上,所以它所实现的算法都可以高效运行,并且能够无缝应用各种硬件平台的诸多加速特性。
学生
这是我们希望能广泛应用于学校的教程。直观的解释、详细的文档以及示例代码将能够帮助你在计算机视觉之路上更快地前进,做更有趣的项目,最终为这个领域开拓新的研究方向。
教师
计算机视觉是一个快速发展的领域。我们发现,让学生快速浏览容易读的文章并且教师在必要的地方进行说明,再辅之以现阶段的论文或讲座,是一种非常高效的授课方法。与此同时,学生可以提前开始课程设计,并尝试做一些更有挑战性的任务。
爱好者
计算机视觉超有趣的,让我们一起深入探索它吧。
我们致力于为读者提供丰富的指导、文档以及代码来快速建立实时的视觉应用。
本书不是什么
这本书不是正式的论文,我们的确在很多地方讨论了数学上的细节注1,但这都是为了建立一种基于此的更深层次的直觉以及阐明算法中所构建的假设之含义。在这里,我们没有尝试进行一些更加正式的数学解释,因为过多的数学解释可能会使一些人觉得枯燥。
这本书本质上来说更偏向于“应用”,它将作为一个基础的帮助,但是并不着力于介绍某个具体的计算机视觉领域分类(比如医学图像或者遥感图像分析)。
也就是说,我们相信通过阅读这里的解释,学生不仅能更好地学习理论,而且还能记住更多、更久。因此,这本书将是一个很好的理论课程的辅助教材,并且很适合入门课程或以项目为中心的课程使用。
本书例程
本书所有例程都基于OpenCV 3.x。这些代码在Linux,Windows 以及 OS X都可以运行。OpenCV也有充足的对安卓和IOS 的支持。本书所有代码都可以在本书网站(http://bit.ly/learningOpenCV3)获取,OpenCV的源码可以在GitHub(https://github.com/opencv/opencv)获取,OpenCV的预编译版本可以在SourceFroge(https://sourceforge.net/projects/opencvlibrary/)获取。
Op e nCV现在也处于开发过程中,每个季度都有新的官方版本发布。如果希望得到最新版本,可以从前述的GitHub网站得到代码更新。OpenCV的官方网站是http://opencv.org,如果是开发人员,还可以浏览它的维基页面:https://github.com/opencv/opencv/wiki。
预备知识
在大多数情况下,读者只需要了解如何使用C++编程。本书许多数学相关的段落都不是必须的并且也做出了相应的标记。本书需要的数学基础包括简单的线性代数以及基础矩阵运算,并且假设读者了解最小二乘优化、高斯分布的基础知识、贝叶斯法则以及一些简单方程的衍生和变化。
本书对数学的介绍是为了支持建立一种对算法的直觉。读者可以跳过数学部分以及算法描述部分,只阅读函数解释以及代码示例,也可以构建视觉应用并且使其正常工作。
如何使用本书
本书并不一定要按照章节顺序阅读,它可以作为一本用户手册:需要的时候,可以用来查询函数,如果你希望了解它的工作原理,请阅读该函数相关的描述。本书的意图在于提供一本指南。它提供对计算机视觉的基本理解以及如何在何时使用选择的算法。
本书的写作目的是作为计算机视觉的本科或研究生课程的辅助教材或教科书。采取的基本策略是先让学生能够快速阅读课本,然后在其他教科书或者文章中用更正式的章节进行补充阅读。每一章最后都配有练习题,可以帮助测试学生对知识的掌握程度并培养更多图像处理方面的意识。
可以采用如下任意一种方法来阅读本书。
抓取重点
先阅读第1~5章,之后只阅读你所需要的章节。除了第18章和第19章(涵盖了相机校正和双目视觉)以及第20章~第22章(涵盖机器学习),这本书并不需要按照章节顺序阅读。以项目为导向的学生和研发人员可以用这种方式阅读。
精读
坚持每周阅读两章,这样你就可以在11周之内读完第1章~第22章(第23章很短)。从项目开始,深入到具体研究领域,适当地使用额外的文献和论文作为补充。
速成
在可以理解的基础上尽可能快地浏览本书,阅读第1章~第23章,之后开始项目,并使用相关文献和论文在某一个领域进行更深入的研究。这也许是专业人员的一个选择,但也可能适合更高级的计算机视觉课程。
第20章对机器学习进行了简要的介绍,在此之后的第21章和第22章将对机器学习算法及其在OpenCV中的实现和实战进行更详细的解释。当然,机器学习是目标识别以及计算机视觉的重要组成部分,相关知识非常丰富以至于可以独立成书。专业人员会发现这本书是进一步探索的一个合适的起点,或者也可以仅仅对这一部分的OpenCV代码进行深入研究。在OpenCV 3.x中,机器学习的接口已经大大简化和统一。
我们喜欢的计算机视觉教学方式是,在学生基本能够理解算法工作原理的基础上尽可能快速展开教学,然后让他们进一步加深理解,进而开始学习有意义的课程设计,同时通过相关领域的文献和论文让学生对所选择的领域拥有更深刻和系统的认识。这种方法适用于半学期、一学期以及两学期的课程。学生可以快速开始,在对视觉项目仅仅有一般认识的时候就开始编码,等到进行更富挑战性和更耗时的工作的时候,指导教师可以提供适当的帮助。
而对于计划时间更长的课程来说,OpenCV项目本身就可以成为项目管理的指导。先建立工作系统,然后用更多的知识、细节和研究进一步加以完善。这类课程的目的是让每个项目都有一个值得自己发表的地方并且其中一些真的能够发展壮大起来。
3.x的代码框架,Buildbots、GitHub的使用,pull request,单元测试和回归测试,文档,这些对商业软件架构来说都是很好的示例,值得参考。
本书约定
本书中使用下列约定。
斜体(Italic)
指示新的术语、URL、电子邮件地址、文件名、拓展名、路径名、文件夹和Unix工具。
固定宽度(Constant Width)
指示指令、选项、选择、变量、属性、键、函数、类型、类、命名空间、方法、模块、参数、值、对象、时间、事件句柄、XML标记、HTML标记、文件的内容或者指令的输出。
加粗固定宽度(Constant width bold)
指示指令以及其他应该由用户输入的文本。也用来着重显示代码片段。
斜体固定宽度(Constant Width Italic)
指示应当由用户提供的值取代的文本。
[…]
指示参考目录的引用。
这个标识表示建议或者一般性的笔记。
这个标识表示警告或需要注意的地方。
使用代码例程
补充材料(代码例程和练习等)都可以在https://github.com/oreillymedia/Learning-OpenCV-3_examples下载。
OpenCV不管是对于商业还是学术使用都是免费的,本书的代码我们也使用了相同的许可。不管是作为作业、研究还是商业产品,都可以使用。我们会非常感谢你在自己的文章中引用这本书,不过这不是必须的。引用通常包含标题、作者、出版商以及ISBN。
比如:“Learning OpenCV 3 by Adrian Kaehler and Gary Bradski (O’Reilly)。Copyright 2017 Adrian Kaehler, Gary Bradski, 978-1-491-93799-0。”
除了了解如何帮助你完成你的作业(最好保密),我们很乐意听到你将计算机视觉用于学术研究或者课堂教学以及使用OpenCV来帮助你开发商业产品。同样,这不是必须的,我们始终欢迎你们的来信。
O’Reilly Safari
Safari是企业、政府、教育工作者和个人的会员制培训平台。该平台的成员可以获取上千种图书、培训视频、学习路线、交互教程以及来自超过250个出版商的播放列表,包括O’Reilly Media,Harvard Business Review,Prentice Hall Professional,Addison-Wesley Professional,Microsoft Press,Sams,Que,Peachpit Press,Adobe,Focal Press,Cisco Press,John Wiley & Sons,Syngress,Morgan Kaufmann,IBM Redbooks,Packt,Adobe Press,FT Press,Apress,Manning,New Riders,McGraw-Hill,Jones & Bartlett,Course Technology以及其他一些出版商。
更多信息请访问http://oreilly.com/safari。
联系方式
请把你对本书的意见和疑问发给出版社:
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们还有一个服务于本书的网站。那里有示例的列表以及未来版本的计划。点击http://bit.ly/learningOpenCV3了解这些信息。
评论或是询问这本书技术相关的问题,请发送邮件到bookquestions@oreilly.com。
关于本书、课程、会议以及新闻更多信息,请访问我们的网站:http://www.oreilly.com在FaceBook上找到我们:http://facebook.com/oreilly在Twitter上关注我们:http://twitter.com/oreillymedia
在YouTube上观看我们:http://www.youtube.com/oreillymedia
致谢
一个长期的开源项目通常经历很多人的加入和离开。每个人都从不同方面做出了贡献。这个库的贡献列表已经太长而不适合在这里展示,但是可以访问与OpenCV绑定的文档/opencv/docs/HTML/Contributors/doc_contributors.html,查看贡献列表。
感谢对OpenCV的帮助
英特尔是OpenCV诞生的地方,感谢英特尔在这个库发起和成长的过程中所做出的巨大支持。时光荏苒,英特尔始终在为OpenCV筹备竞赛并做出贡献。英特尔还捐赠了内置的性能原语代码,为英特尔的架构提供了无缝加速。感谢英特尔所做的这一切。
谷歌一直是Op e nCV开发者的稳定资助者,它为谷歌编程之夏(Go o g l e Summe r o f Code,GSoC)项目的Opencv实习生提供了赞助。这场活动贡献了许多杰出的工作成果。柳树车库(Willow Garage)公司提供了资金,致力于将OpenCV 2.0版本提升到3.0版本成果。在这些日子里,计算机视觉公司Itseez(最近被英特尔收购)提供了大量的工程师支持并承担了网站维护工作。英特尔已经表示继续支持维护网站(谢谢)。
在软件层面,特别需要感谢一些机构和个人,尤其是(英特尔)俄罗斯的软件团队。其中最主要的是俄罗斯首席程序员Vadim Pisarevsky(瓦迪姆 • 彼萨里夫斯)。他是这个库最大的独立贡献者。Vadim还在项目引爆前的萧条时期管理并且发展了OpenCV。如果要把有些人称为OpenCV的英雄,那么一定非他莫属。他的技术见解在我们写书的时候也起到了巨大的帮助,在管理方面他也受到了Victor Eruhimov的支持,俄罗斯视觉公司Itseez的联合创始人,现在是Itseez3D(已被英特尔收购)的CEO。
在每周会议上,有几个人一直在帮助管理库,他们是Grace Vesom,Vincent Rabaud,Stefano Fabri,当然还有Vadim Pisarevsky。这些会议可以在https://github.com/opencv/opencv/wiki/Meeting_notes看到。
在此期间,许多人都为OpenCV库做出了贡献,最近一些贡献者分别是Dinar Ahmatnurov,Pablo Alcantarilla,Alexander Alekhin,Daniel Angelov,Dmitriy Anisimov,Anatoly Baksheev,Cristian Balint,Alexandre Benoit,Laurent Berger,Leonid Beynenson,Alexander Bokov,Alexander Bovyrin,Hilton Bristow,Vladimir Bystritsky,Antonella
Cascitelli,Manuela Chessa,Eric Christiansen,Frederic Devernay,Maria Dimashova,Roman Donchenko,Vladimir Dudnik,Victor Eruhimov,Georgios Evangelidis,Stefano Fabri,Sergio Garrido,Harris Gasparakis,Yuri Gitman,Lluis Gomez,Yury Gorbachev,Elena Gvozdeva,Philipp Hasper,Fernando J. Iglesias Garcia,Alexander Kalistratov,Andrey Kamaev,Alexander Karsakov,Rahul Kavi,Pat O’Keefe,Siddharth Kherada,Eugene Khvedchenya,Anna Kogan,Marina Kolpakova,Kirill Kornyakov,Ivan Korolev,Maxim Kostin,Evgeniy Kozhinov,Ilya Krylov,Laksono Kurnianggoro,Baisheng Lai(赖百胜),Ilya Lavrenov,Alex Leontiev,Gil Levi,Bo Li(李波),Ilya Lysenkov,Vitaliy Lyudvichenko,Bence Magyar,Nikita Manovich,Juan Manuel Perez Rua,Konstantin Matskevich,Patrick Mihelich,Alexander Mordvintsev,Fedor Morozov,Gregory Morse,Marius Muja,Mircea Paul Muresan,Sergei Nosov,Daniil Osokin,Seon-Wook Park,Andrey Pavlenko,Alexander Petrikov,Philip aka Dikay900,Prasanna,Francesco Puja,Steven Puttemans,Vincent Rabaud,Edgar Riba,Cody Rigney,Pavel Rojtberg,Ethan Rublee,Alfonso Sanchez-Beato,Andrew Senin,Maksim Shabunin,Vlad Shakhuro,Adi Shavit,Alexander Shishkov,Sergey Sivolgin,
Marvin Smith,Alexander Smorkalov,Fabio Solari,Adrian Stratulat,Evgeny Talanin,Manuele Tamburrano,Ozan Tonkal,Vladimir Tyan,Yannick Verdie,Pierre Emmanuel Viel,Vladislav Vinogradov,Pavel Vlasov,Philipp Wagner,Yida Wang(王一达),Jiaolong Xu(许骄龙),Marian Zajko和Zoran Zivkovic。
这里(https://github.com/opencv/opencv/wiki/ChangeLog)还列出了其他的贡献者。最后,Arraiy现在也在协助维护OpenCV.org(免费开源的代码库)。
感谢对本书提供帮助的人
在准备这本书和这本书的前一个版本时,我们得到了《纽约时报》科技记者约翰 • 马尔科夫(John Ma rkoff)译注1的大力帮助,感谢他的鼓励、不厌其烦的指导以及多年所累积的一线写作经验。我们还要感谢O’Reilly(奥莱利)的许多编辑,特别是Dawn Schanafelt(道恩 • 施纳菲尔特),在叛逆的作者准备创业的时候,他满怀耐心地继续跟进本书相关工作。这本书是一个由OpenCV 2.x到3.x到长期项目。非常感谢O’Reilly始终站在我们这一边。
Adrian致谢
在第1版(Learning OpenCV)的写作过程中,我邀请一些优秀的教师来协助我,使得本书工作变成了可能。在这些年,从各位那里获得的指导变得愈发珍贵。我对他们每个人都怀有诚挚的谢意。我还特别想在这份感谢名单上加上我的导师汤姆 • 汤贝雷诺,我欠他非常多,在他的记忆里,我会把我的贡献献给这本书。他是一个具有非凡智慧的人,我很骄傲自己有机会追随他的足迹。最后,深深感谢OpenCV社区,感谢你们对第1版的欢迎,感谢你们耐心等待,这一版历经波折总算最终完成。
这一版花了很长时间才完成,在这几年里,我有幸与数十家不同的公司合作,担任顾问并进行技术研发,先后作为董事会的成员、顾问团的成员、技术总监、研发人员以及始创人。我有幸看到并热爱着研发的方方面面。我在Applied Minds公司很多年,在那里创建并且运行我们的机器人部门,更准确地说是Applied Minds子公司。我很欣慰地看到OpenCV是许多优秀项目的核心,涉及领域包括医疗、农业、航空、国防和国土安全。
我同样高兴地发现这本书的第1版已经成为几乎所有这些机构中的案头必备。Gary和我用来构建斯坦利(Stanley)的技术已经成为无数项目的一部分,其中至少包含许多正在研发的自动驾驶项目。它们其中的某一个,或许所有都是为了改变或改善无数人的日常生活而准备的,成为其中的一员是多么让人开心啊!在这些年我遇到过无数惊人的故事——有关于第1版如何在人们所工作或教学的领域让他们受益,帮助他们建立事业,帮助他们完成巨大的成就——这些事情成为快乐和奇迹的源泉。我希望这本新书将继续为你们所有人服务,并激励和支持新一代科学家、工程师和发明家前行。
在本书的最后一章,我们开始了在机器人、人工智能、视觉和其他领域工作的新篇章。就我个人而言,我深深地感激那些引领和激励我的人:教师、导师以及相关书籍的作者。我希望我们这本书的新版本能够让人在他们自己的生活中迈出重要的一步,希望看到你们迈向成功!
Gary致谢
我在1999年创立了OpenCV项目,目的是能够向所有人提供我当时只有在顶级实验室里才能见到的基础框架,并借此来加速计算机视觉和人工智能技术的发展。尽管很少有目标能够和预期一样实现,但我庆幸这一计划在时隔17年后终于实现了。完成这一目标还得归功于多方的帮助,有太多的朋友和贡献者,我没办法在此一一感谢注1。但我还是希望在这里特别感谢我在英特尔开始工作时所在的俄罗斯研究团队,它们造就了一个成功的计算机视觉公司(Itseez.com),并最终被英特尔收购。我们作为同事开始工作并建立了深厚的友谊。
由于家中有三个十几岁的孩子,我的妻子Sonya Bradski(桑雅 • 布拉德斯基)做了更多的工作来支持我写作本书,对于她,我的感谢与爱难以言表。我也一样爱我的孩子,但要说他们加速了我这本书的出版,委实说不出口:)。
我从帮助建立Industrial Perception公司(2013年被谷歌收购)的时候就萌生了创作第2版的想法。从此以后,写书的工作就不定期地在周末和深夜进行。不知不觉,现在已经是2016年,真是时光飞逝如电啊!我在第23章结束时所做的一些思考,灵感来源于我亲自参与过的机器人项目,一个由柳树车库制造的叫PR2的双臂机器人以及斯坦福的斯坦利(Stanley)项目,这个机器人赢得了DARPA机器人挑战赛200万美元的大奖。
读者朋友们,在我们结束本书创作之际,由衷地希望在创业公司、实验室、学术网站、会议、车间、风险投资以及正在研发的很酷的项目中看到你们的身影。然后轻松地互相致意,谈一谈你正在做的新东西。我发起了OpenCV,为了共同的利益来支持并加速计算机视觉以及人工智能技术,接下来要看你们的了。我们生活在一个充满创意的世界里,一个人可以创造一个罐子,下一个人就能把这个罐子变成一个鼓,如此等等,都是创造!用OpenCV来创造一些可以造福于人类的东西吧!
目录
译者序 xvii前言 xxi第1章 概述 1什么是OpenCV 1OpenCV怎么用 2什么是计算机视觉 3OpenCV的起源 6OpenCV的结构 7使用IPP来加速OpenCV 8谁拥有OpenCV 9下载和安装OpenCV 9安装 9从Git获取最新的OpenCV 12更多的OpenCV文档 13提供的文档 13在线文档和维基资源 13OpenCV贡献库 15下载和编译Contributed模块 16可移植性 16小结 17练习 17第2章 OpenCV初探 19头文件 19资源 20第一个程序:显示图片 21第二个程序:视频 23跳转 24简单的变换 28不那么简单的变换 30从摄像头中读取 32写入AVI文件 33小结 34练习 35第3章 了解OpenCV的数据类型 37基础知识 37OpenCV的数据类型 37基础类型概述 38深入了解基础类型 39辅助对象 46工具函数 53模板结构 60小结 61练习 61第4章 图像和大型数组类型 63动态可变的存储 63cv::Mat类N维稠密数组 64创建一个数组 65独立获取数组元素 69数组迭代器NAryMatIterator 72通过块访问数组元素 74矩阵表达式:代数和cv::Mat 75饱和转换 77数组还可以做很多事情 78稀疏数据类cv::SparesMat 79访问稀疏数组中的元素 79稀疏数组中的特有函数 82为大型数组准备的模板结构 83小结 85练习 86第5章 矩阵操作 87矩阵还可以做更多事情 87cv::abs() 90cv::add() 91cv::addWeighted() 92cv::bitwise_and() 94cv::bitwise_not() 94cv::bitwise_or() 94cv::bitwise_xor() 95cv::calcCovarMatrix() 95cv::cartToPolar() 97cv::checkRange() 97cv::compare() 98cv::completeSymm() 99cv::convertScaleAbs() 99cv::countNonZero() 100cv::Mat cv::cvarrToMat() 100cv::dct() 101cv::dft() 102cv::cvtColor() 103cv::determinant() 106cv::divide() 106cv::eigen() 106cv::exp() 107cv::extractImageCOI() 107cv::flip() 108cv::gemm() 108cv::getConvertElem()和cv::getConvertScaleElem() 109cv::idct() 110cv::inRange() 110cv::insertImageCOI() 111cv::invert() 111cv::log() 112cv::LUT() 112cv::Mahalanobis() 113cv::max() 114cv::mean() 115cv::meanStdDev() 116cv::merge() 116cv::min() 116cv::minMaxIdx() 117cv::minMaxLoc() 118cv::mixChannels() 119cv::mulSpectrums() 120cv::multiply() 121cv::mulTransposed() 121cv::norm() 122cv::normalize() 123cv::perspectiveTransform() 125cv::phase() 125cv::polarToCart() 126cv::pow() 126cv::randu() 127cv::randn() 127cv::repeat() 129cv::scaleAdd() 129cv::setIdentity() 130cv::solve() 130cv::solveCubic() 131cv::solvePoly() 132cv::sort() 132cv::sortIdx() 133cv::split() 133cv::sqrt() 134cv::subtract() 135cv::sum() 135cv::trace() 135cv::transform() 136cv::transpose() 136小结 137练习 137第6章 绘图和注释 139绘图 139艺术线条和填充多边形 140字体和文字 146小结 148练习 148第7章 OpenCV中的函数子 151操作对象 151主成分分析(cv::PCA) 151奇异值分解cv::SVD 154随机数发生器cv::RNG 157小结 160练习 160第8章 图像、视频与数据文件 163HighGUI模块:一个可移植的图形工具包 163图像文件的处理 164图像的载入与保存 165关于codecs的一些注释 167图片的编码与解码 168视频的处理 169使用cv::VideoCapture对象读取视频流 169使用cv::VideoWriter对象写入视频 175数据存储 176cv::FileStorage的写入 177使用cv::FileStorage读取文件 179cv::FileNode 180小结 183练习 183第9章 跨平台和Windows系统 187基于Windows开发 187HighGUI原生图形用户接口 188通过Qt后端工作 199综合OpenCV和全功能GUI工具包 209小结 222练习 222第10章 滤波与卷积 225概览 225预备知识 225滤波、核和卷积 225边界外推和边界处理 227阈值化操作 230Otsu算法 233自适应阈值 233平滑 235简单模糊和方框型滤波器 236中值滤波器 238高斯滤波器 239双边滤波器 240导数和梯度 242索贝尔导数 242Scharr滤波器 244拉普拉斯变换 245图像形态学 246膨胀和腐蚀 247通用形态学函数 250开操作和闭操作 251形态学梯度 254顶帽和黑帽 256自定义核 258用任意线性滤波器做卷积 259用cv::filter2D()进行卷积 259通过cv::sepFilter2D使用可分核 260生成卷积核 260小结 262练习 262第11章 常见的图像变换 267概览 267拉伸、收缩、扭曲和旋转 267均匀调整 268图像金字塔 269不均匀映射 273仿射变换 274透视变换 279通用变换 282极坐标映射 282LogPolar 283任意映射 287图像修复 287图像修复 288去噪 289直方图均衡化 292cv::equalizeHist()用于对比均衡 294小结 295练习 295第12章 图像分析 297概览 297离散傅里叶变换 297cv::dft()离散傅里叶变换 298cv::idft()用于离散傅里叶逆变换 300cv::mulSpectrums()频谱乘法 300使用傅里叶变换进行卷积 301cv::dct()离散余弦变换 303cv::idct()离散余弦逆变换 304积分图 304cv::integral()标准求和积分 306cv::integral()平方求和积分 306cv::integral()倾斜求和积分 307Canny边缘检测 307cv::Canny() 309Hough变换 309Hough线变换 309Hough圆变换 313距离变换 316cv::distanceTransform()无标记距离变换 317cv::distanceTransform()有标记距离变换 317分割 318漫水填充 318分水岭算法 322Grabcuts算法 323Mean-Shift分割算法 325小结 326练习 326第13章 直方图和模板 329OpenCV中直方图的表示 331cv::calcHist():从数据创建直方图 332基本直方图操作 334直方图归一化 334直方图二值化 335找出最显著的区间 335比较两个直方图 337直方图用法示例 339一些复杂的直方图方法 342EMD距离 342反向投影 347模板匹配 350方差匹配方法(cv::TM_SQDIFF) 351归一化方差匹配方法(cv::TM_SQDIFF_NORMED) 352相关性匹配方法(cv::TM_CCORR) 352归一化的互相关匹配方法(cv::TM_CCORR_NORMED) 352相关系数匹配方法(cv::TM_CCOEFF) 352归一化的相关系数匹配方法(cv::TM_CCOEFF_NORMED) 352小结 355练习 355第14章 轮廓 359轮廓查找 359轮廓层次 360绘制轮廓 364轮廓实例 365另一个轮廓实例 366快速连通区域分析 368深入分析轮廓 370多边形逼近 370几何及特性概括 372几何学测试 377匹配轮廓与图像 378矩 378再论矩 380使用Hu矩进行匹配 383利用形状场景方法比较轮廓 384小结 388练习 389第15章 背景提取 391背景提取概述 391背景提取的缺点 392场景建模 392像素 393帧间差分 396平均背景法 397累计均值,方差和协方差 403更复杂的背景提取方法 410结构 413进行背景学习 414存在移动的前景物体时进行背景学习 417背景差分:检测前景物体 418使用码书法的背景模型 419关于码书法的其他想法 419使用连通分量进行前景清理 420小测试 423两种背景方法的对比 425OpenCV中的背景提取方法的封装 425cv::BackgroundSubstractor基类 426KB方法 427Zivkovic方法 428小结 431练习 431第16章 关键点和描述子 433关键点和跟踪基础 433角点检测 434光流简介 437Lucas-Kanade稀疏光流法 438广义关键点和描述符 448光流,跟踪和识别 450OpenCV一般如何处理关键点和描述符 451核心关键点检测方法 461关键点过滤 497匹配方法 499结果显示 505小结 508练习 508第17章 跟踪 511跟踪中的概念 511稠密光流 512Farneback多项式扩展算法 513Dual TV-L1模型 515简单光流算法 519Mean-Shift算法和Camshift 追踪 522Mean-Shift算法 522Camshift 526运动模板 526估计 533卡尔曼滤波器 534扩展卡尔曼滤波器简述 549小结 551练习 551第18章 相机模型与标定 553相机模型 554射影几何基础 556Rodrigues变换 558透镜畸变 559标定 562旋转矩阵和平移向量 563标定板 566单应性 572相机标定 576矫正 587矫正映射 587使用cv::convertMaps()在不同表示方式之间转换矫正映射 588使用cv::initUndistortRectifyMap()计算矫正映射 589使用cv::remap()矫正图像 591使用cv::undistort()进行矫正 591使用cv::undistortPoints()进行稀疏矫正 591与标定结合 592小结 595练习 596第19章 投影与三维视觉 599投影 600仿射变换与透视变换 601鸟瞰图变换实例 602三维姿态估计 606单摄像机姿态估计 607立体成像 609三角测量 610对极几何 613本征矩阵和基本矩阵 615计算极线 624立体校正 624立体校正 628立体匹配 638立体校正、标定和对应的示例代码 650来自三维重投影的深度映射 657来自运动的结构 659二维与三维直线拟合 659小结 662练习 662第20章 机器学习基础 665什么是机器学习 665训练集和测试集 666有监督学习和无监督学习 667生成式模型和判别式模型 669OpenCV机器学习算法 669机器学习在视觉中的应用 671变量的重要性 673诊断机器学习中的问题 674ML库中遗留的机器学习算法 678K均值 679马氏距离 684小结 687练习 687第21章 StatModel:OpenCV中的基准学习模型 689ML库中的常见例程 689训练方法和cv::ml::TrainData的结构 691预测 697使用cv::StatModel的机器学习算法 698朴素贝叶斯分类器 699二叉决策树 703Boosting方法 716随机森林 721期望最大化算法 725K近邻算法 729多层感知机 731支持向量机 739小结 749练习 750第22章 目标检测 753基于树的目标检测技术 753级联分类器 754有监督学习和boosting理论 756学习新目标 764使用支持向量机的目标识别 772Latent SVM用于目标识别 772Bag of Words算法与语义分类 775小结 780练习 780第23章 OpenCV的未来 783过去与未来 783OpenCV 3.x 784我们上一次预测怎么样? 784未来应用 785目前GSoC的进展 787社区贡献 788OpenCV.org 789一些关于AI的猜测 790结语 793附录A 平面划分 795附录B opencv_contrib模块概述 809附录C 标定图案 813参考文献 819