书海网短评:
OpenCV库包含500多个函数,2500多种算法,可以扩展应用到视觉行业中的很多领域,有广泛的用途,比如安保,医学成像,模式与人脸识别,机器人和工业产品检测,等等。《学习OpenCV3(中文版)》实用性强,内容全面,讲解透
OpenCV库包含500多个函数,2500多种算法,可以扩展应用到视觉行业中的很多领域,有广泛的用途,比如安保,医学成像,模式与人脸识别,机器人和工业产品检测,等等。《学习OpenCV3(中文版)》实用性强,内容全面,讲解透彻,可以帮助读者掌握如何构建具有一定AI(人工智能)的应用程序,使计算机能够“看见”并根据所得到的数据来做出决策。《学习OpenCV3(中文版)》全面介绍整个OpenCV库,所有示例代码都用C++实现,同时还介绍了可以用于计算机视觉的机器学习工具。《学习OpenCV3(中文版)》每一章都精心设计有动手练习,旨在方便课堂教学和自学,进一步帮助读者学以致用。
通过学习《学习OpenCV3(中文版)》,读者可以奠定扎实的基础,运用计算机视觉相关知识和OpenCV库来构建简单的或者精巧复杂的应用程序。
计算机视觉是在图像处理的基础上发展起来的新兴学科。OpenCV是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器之一。它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了各种各样的算法。
《学习OpenCV3(中文版)》由OpenCV发起人所写,站在一线开发人员的角度用通俗易懂的语言解释了OpenCV的缘起和计算机视觉基础结构,演示了如何用OpenCV和现有的自由代码为各种各样的机器进行编程,这些都有助于读者迅速入门并渐入佳境,兴趣盎然地深入探索计算机视觉领域。
《学习OpenCV3(中文版)》可作为信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等有关专业的高年级学生或研究生的教学用书,也可供相关领域的研究工作者参考。
第一个程序:显示图片
OpenCV提供了一些实用工具来读取从视频流到摄像机画面的各种各样的图像格式,这些工具都是HighGUI的一部分。我们将使用其中的一些工具来创建一个简单的程序,这个程序将打开一张图像并且将其显示在屏幕上(如示例2-1所示)。
示例2-1:一个简单的加载并显示图像的OpenCV程序
#include//IncludefileforeverysupportedOpenCVfunction
intmain(intargc,char**argv){
cv::Matimg=cv::imread(argv[1],-1);
if(img.empty())return-1;
cv::namedWindow("Example1",cv::WINDOW_AUTOSIZE);
cv::imshow("Example1",img);
cv::waitKey(0);
cv::destroyWindow("Example1");
return0;
}
注意,OpenCV的函数都位于cv这一命名空间下,为了调用OpenCV的函数,你需要在每个函数前加上cv::,向编译器说明你所调用的函数处于cv命名空间。为了摆脱这种繁琐的工作,我们可以像示例2-2一样用usingnamespacecv;指令,告诉编译器假设所有函数都位于cv命名空间下。注1你还需要注意示例2-1和示例2-2在头文件上的不同,在前者中,我们使用了通用的opencv.hpp,而在后者中,我们只使用了必须的头文件来节约编译时间。
示例2-2:与示例2-1不同的是直接使用了usingnamespace
#include"opencv2/highgui/highgui.hpp"
usingnamespacecv;
intmain(intargc,char**argv){
Matimg=imread(argv[1],-1);
if(img.empty())return-1;
注1:当然,如果这样做,需要冒着和其他潜在的命名空间冲突的风险。如果函数foo()已经存在于cv和std的命名空间,你必须指定自己使用的是位于cv::foo()的函数还是位于std::foo()的函数。在《学习OpenCV 3(中文版)》中,除了示例2-2,都会指明cv::命名空间,并以此保持一个良好的编程风格。
namedWindow("Example1",cv::WINDOW_AUTOSIZE);
imshow("Example1",img);
waitKey(0);
destroyWindow("Example1");
}
当使用命令行编译和运行时,注2示例2-1将加载一张图像到内存中并且显示到屏幕上。它会保持显示直到用户按下一个键,之后程序才会销毁窗口并退出。现在让我们来一行一行地解释代码,并花一些时间来理解每一行代码都在做什么工作。
cv::Matimg=cv::imread(argv[1],-1);
这一行将会载入图像。注3函数cv::imread()是高级的;依据文件名来决定载入图像格式的处理。这也会自动地申请图像需要的内存,注意,cv::imread()可以读取很多种图像格式,包括BMP,DIP,JPEG,JPE,PNG,PBM,PGM,PPM,SR,RAS以及TIFF。
函数会返回一个cv::Mat结构,这个结构是OpenCV中你将会接触最多的自带结构。OpenCV使用这个结构来处理所有类型的图像:单通道、多通道、整型、浮点数以及各种类型。紧接着的下面这一行:
if(img.empty())return-1;
检查这个图像是否真的被载入了。另一个高层级的函数cv::namedWindow()将会在屏幕打开一个窗口,其中可以包含需要显示的图片。
cv::namedWindow("Example1",cv::WINDOW_AUTOSIZE);
该函数由HighGUI模块提供,会将一个名称赋予窗口(在这里窗口名为"Example1")。未来HighGUI的和这个窗口的交互函数将由这个名称来指定要与哪个窗口交互。
cv::namedWindow第二个参数说明了Windows的特性。这可以全部设置为0(默认情况下),也可以设置为cv::WINDOW_AUTOSIZE。在之前的例子中,窗口的大小将会和载入图像的大小一致,图像将会被缩放以适应窗口的大小。在之后的例子中,窗口将会在图像载入的时候被自动缩放以适应图像的真实大小,也可能由用户自行调整。
注2:当然,如果这样做的话,你需要冒着和其他潜在的命名空间冲突的风险。如果函数foo()已经存在于cv和std的命名空间,必须指定你使用的是位于cv::foo()的函数还是位于std::foo()的函数。在《学习OpenCV 3(中文版)》中,除了示例2-2,都会指明cv::命名空间,并以此保持一个良好的编程风格。
注3:好的程序会检查argv[1]是否存在并且给用户反馈一个错误信息,但是在这里没有。我们在《学习OpenCV 3(中文版)》中将会简略掉这些处理并且假设读者都有足够的的知识来理解处理错误代码的方式及其重要性。
cv::imshow("Example1",img);
不论何时,只要在cv::Mat中拥有一个图像结构,我们都可以通过cv::imshow()进行显示。cv::imshow()将建一个窗口(如果这个窗口不存在,它会自动调用cv::namedWindow()新建一个窗口)。在调用cv::imshow()的时候,窗口将被重绘上要求的图片,并且窗口会按照要求自动调整大小(如果使用cv::WINDOW_AUTOSIZE参数)。
cv::waitKey(0);
cv::waitKey(0);函数告诉系统暂停并且等待键盘事件。如果其传入了一个大于零的参数,它将会等待等同于该参数的毫秒时间,然后继续执行程序。如果参数被设置为0或者一个负数,程序将会无限等待直到有键被按下。
因为有cv::Mat,图像将会在生命周期结束的时候自动释放,其行为类似于标准模板库(STL)中的容器类。这种自动的内存释放由内部的引用指针所控制,最重要的是,这表示我们用不着担心图像的内存申请和释放,这将程序员从OpenCV1.0IplImage结构繁琐的维护工作中解放了出来。
cv::destroyWindow("Example1");
最后,我们可以让窗口自行销毁。函数cv::destroyWindow()将会关闭窗口并且释放掉相关联的内存空间。为了更简洁的编码,我们将会在之后的例子中略过这一步。在更长、更复杂的代码中,程序员应该在窗口的生命周期自然结束之前自主销毁窗口以防止内存泄漏。
我们下一个任务是创建一个非常简单的、几乎和本例一样的程序来读取视频文件。在此之后,我们将会开始对实际图像进行更多的操作。
……
前言
这《学习OpenCV 3(中文版)》提供了C++开源计算机视觉库(OpenCV)3.0版本的工作指南,介绍了计算机视觉相关领域的通用背景,以便读者更有效地使用OpenCV。
《学习OpenCV 3(中文版)》的目标
计算机视觉在以下四个趋势的引导下,已经成为一个快速发展的领域:
?智能手机的出现让数以百万计的用户都拥有了相机
?互联网和搜索引擎聚集了海量的图像和视频数据
?计算资源变成一种廉价的商品
?视觉算法发展得更加成熟(由于深度神经网络的出现,OpenCV也正在逐渐支持这方面技术,详情可以参考opencv_contrib中的dnn)
OpenCV通过帮助成千上万的视觉工作者去做更多富有创造性的工作,在图像处理领域扮演着重要的角色。由于OpenCV3.x的存在,不管你是学生还是研究人员,是专家还是初学者,都可以快速建立应用,并且在OpenCV所提供的基于C++的多平台视觉基础架构上实现一个跨越性的发展。
《学习OpenCV 3(中文版)》的目标如下:
?通过详细讲述函数的惯用用法以及正确用法,成为一本更好的OpenCV经典参考文档
?帮助读者对各种计算机视觉算法的工作原理有一个基础的理解
?培养读者,使其知道什么算法工具可以使用并且应该在什么时候使用
?提供给读者许多有效的代码,提升其应用计算机视觉和机器学习算法的开发效率
?针对问题代码给读者提供建议,教读者如何解决一些简单或复杂的问题
《学习OpenCV 3(中文版)》的写作方式是力求帮助读者快速在计算机视觉领域做一些有意思的事情,因此直观地解释了算法是如何工作的,可以指导读者设计和调试计算机视觉程序,还能够使计算机视觉和机器学习算法的形式化描述更容易理解和记忆。
《学习OpenCV 3(中文版)》受众
《学习OpenCV 3(中文版)》包含描述、工作代码示例和OpenCV3.x库中包含的C++计算机视觉工具说明。因此,《学习OpenCV 3(中文版)》对各种不同类型的用户都有所帮助。
专业人士和开发者
对于需要快速设计原型或实现专业计算机视觉系统的专家而言,示例代码提供的框架可以帮助他们在此基础上进行快速开发。我们对算法的描述可以快速教会或者提醒读者如何使用它们。由于OpenCV3.x的设计基于位于硬件加速层(HAL)之上,所以它所实现的算法都可以高效运行,并且能够无缝应用各种硬件平台的诸多加速特性。
学生
这是我们希望能广泛应用于学校的教程。直观的解释、详细的文档以及示例代码将能够帮助你在计算机视觉之路上更快地前进,做更有趣的项目,最终为这个领域开拓新的研究方向。
教师
计算机视觉是一个快速发展的领域。我们发现,让学生快速浏览容易读的文章并且教师在必要的地方进行说明,再辅之以现阶段的论文或讲座,是一种非常高效的授课方法。与此同时,学生可以提前开始课程设计,并尝试做一些更有挑战性的任务。
爱好者
计算机视觉超有趣的,让我们一起深入探索它吧。
我们致力于为读者提供丰富的指导、文档以及代码来快速建立实时的视觉应用。
《学习OpenCV 3(中文版)》不是什么
这《学习OpenCV 3(中文版)》不是正式的论文,我们的确在很多地方讨论了数学上的细节注1,但这都是为了建立一种基于此的更深层次的直觉以及阐明算法中所构建的假设之含义。在这里,我们没有尝试进行一些更加正式的数学解释,因为过多的数学解释可能会使一些人觉得枯燥。
这《学习OpenCV 3(中文版)》本质上来说更偏向于“应用”,它将作为一个基础的帮助,但是并不着力于介绍某个具体的计算机视觉领域分类(比如医学图像或者遥感图像分析)。
也就是说,我们相信通过阅读这里的解释,学生不仅能更好地学习理论,而且还能记住更多、更久。因此,这《学习OpenCV 3(中文版)》将是一个很好的理论课程的辅助教材,并且很适合入门课程或以项目为中心的课程使用。
《学习OpenCV 3(中文版)》例程
《学习OpenCV 3(中文版)》所有例程都基于OpenCV3.x。这些代码在Linux,Windows以及OSX都可以运行。OpenCV也有充足的对安卓和IOS的支持。《学习OpenCV 3(中文版)》所有代码都可以在《学习OpenCV 3(中文版)》网站(http://bit.ly/learningOpenCV3)获取,OpenCV的源码可以在GitHub(https://github.com/opencv/opencv)获取,OpenCV的预编译版本可以在SourceFroge(https://sourceforge.net/projects/opencvlibrary/)获取。
OpenCV现在也处于开发过程中,每个季度都有新的官方版本发布。如果希望得到最新版本,可以从前述的GitHub网站得到代码更新。OpenCV的官方网站是http://opencv.org,如果是开发人员,还可以浏览它的维基页面:https://github.com/opencv/opencv/wiki。
预备知识
在大多数情况下,读者只需要了解如何使用C++编程。《学习OpenCV 3(中文版)》许多数学相关的段落都不是必须的并且也做出了相应的标记。《学习OpenCV 3(中文版)》需要的数学基础包括简单的线性代数以及基础矩阵运算,并且假设读者了解最小二乘优化、高斯分布的基础知识、贝叶斯法则以及一些简单方程的衍生和变化。
《学习OpenCV 3(中文版)》对数学的介绍是为了支持建立一种对算法的直觉。读者可以跳过数学部分以及算法描述部分,只阅读函数解释以及代码示例,也可以构建视觉应用并且使其正常工作。
如何使用《学习OpenCV 3(中文版)》
《学习OpenCV 3(中文版)》并不一定要按照章节顺序阅读,它可以作为一本用户手册:需要的时候,可以用来查询函数,如果你希望了解它的工作原理,请阅读该函数相关的描述。《学习OpenCV 3(中文版)》的意图在于提供一本指南。它提供对计算机视觉的基本理解以及如何在何时使用选择的算法。
《学习OpenCV 3(中文版)》的写作目的是作为计算机视觉的本科或研究生课程的辅助教材或教科书。采取的基本策略是先让学生能够快速阅读课本,然后在其他教科书或者文章中用更正式的章节进行补充阅读。每一章最后都配有练习题,可以帮助测试学生对知识的掌握程度并培养更多图像处理方面的意识。
可以采用如下任意一种方法来阅读《学习OpenCV 3(中文版)》。
抓取重点
先阅读第1~5章,之后只阅读你所需要的章节。除了第18章和第19章(涵盖了相机校正和双目视觉)以及第20章~第22章(涵盖机器学习),这《学习OpenCV 3(中文版)》并不需要按照章节顺序阅读。以项目为导向的学生和研发人员可以用这种方式阅读。
精读
坚持每周阅读两章,这样你就可以在11周之内读完第1章~第22章(第23章很短)。从项目开始,深入到具体研究领域,适当地使用额外的文献和论文作为补充。
速成
在可以理解的基础上尽可能快地浏览《学习OpenCV 3(中文版)》,阅读第1章~第23章,之后开始项目,并使用相关文献和论文在某一个领域进行更深入的研究。这也许是专业人员的一个选择,但也可能适合更高级的计算机视觉课程。
第20章对机器学习进行了简要的介绍,在此之后的第21章和第22章将对机器学习算法及其在OpenCV中的实现和实战进行更详细的解释。当然,机器学习是目标识别以及计算机视觉的重要组成部分,相关知识非常丰富以至于可以独立成书。专业人员会发现这《学习OpenCV 3(中文版)》是进一步探索的一个合适的起点,或者也可以仅仅对这一部分的OpenCV代码进行深入研究。在OpenCV3.x中,机器学习的接口已经大大简化和统一。
我们喜欢的计算机视觉教学方式是,在学生基本能够理解算法工作原理的基础上尽可能快速展开教学,然后让他们进一步加深理解,进而开始学习有意义的课程设计,同时通过相关领域的文献和论文让学生对所选择的领域拥有更深刻和系统的认识。这种方法适用于半学期、一学期以及两学期的课程。学生可以快速开始,在对视觉项目仅仅有一般认识的时候就开始编码,等到进行更富挑战性和更耗时的工作的时候,指导教师可以提供适当的帮助。
而对于计划时间更长的课程来说,OpenCV项目本身就可以成为项目管理的指导。先建立工作系统,然后用更多的知识、细节和研究进一步加以完善。这类课程的目的是让每个项目都有一个值得自己发表的地方并且其中一些真的能够发展壮大起来。
3.x的代码框架,Buildbots、GitHub的使用,pullrequest,单元测试和回归测试,文档,这些对商业软件架构来说都是很好的示例,值得参考。
《学习OpenCV 3(中文版)》约定
《学习OpenCV 3(中文版)》中使用下列约定。
斜体(Italic)
指示新的术语、URL、电子邮件地址、文件名、拓展名、路径名、文件夹和Unix工具。
固定宽度(ConstantWidth)
指示指令、选项、选择、变量、属性、键、函数、类型、类、命名空间、方法、模块、参数、值、对象、时间、事件句柄、XML标记、HTML标记、文件的内容或者指令的输出。
加粗固定宽度(Constantwidthbold)
指示指令以及其他应该由用户输入的文本。也用来着重显示代码片段。
斜体固定宽度(ConstantWidthItalic)
指示应当由用户提供的值取代的文本。
[…]
指示参考目录的引用。
这个标识表示建议或者一般性的笔记。
这个标识表示警告或需要注意的地方。
使用代码例程
补充材料(代码例程和练习等)都可以在https://github.com/oreillymedia/Learning-OpenCV-3_examples下载。
OpenCV不管是对于商业还是学术使用都是免费的,《学习OpenCV 3(中文版)》的代码我们也使用了相同的许可。不管是作为作业、研究还是商业产品,都可以使用。我们会非常感谢你在自己的文章中引用这《学习OpenCV 3(中文版)》,不过这不是必须的。引用通常包含标题、作者、出版商以及ISBN。
比如:“LearningOpenCV3byAdrianKaehlerandGaryBradski(O’Reilly)。Copyright2017AdrianKaehler,GaryBradski,978-1-491-93799-0。”
除了了解如何帮助你完成你的作业(最好保密),我们很乐意听到你将计算机视觉用于学术研究或者课堂教学以及使用OpenCV来帮助你开发商业产品。同样,这不是必须的,我们始终欢迎你们的来信。
O’ReillySafari
Safari是企业、政府、教育工作者和个人的会员制培训平台。该平台的成员可以获取上千种图书、培训视频、学习路线、交互教程以及来自超过250个出版商的播放列表,包括O’ReillyMedia,HarvardBusinessReview,PrenticeHallProfessional,Addison-WesleyProfessional,MicrosoftPress,Sams,Que,PeachpitPress,Adobe,FocalPress,CiscoPress,JohnWiley&Sons,Syngress,MorganKaufmann,IBMRedbooks,Packt,AdobePress,FTPress,Apress,Manning,NewRiders,McGraw-Hill,Jones&Bartlett,CourseTechnology以及其他一些出版商。
更多信息请访问http://oreilly.com/safari。
联系方式
请把你对《学习OpenCV 3(中文版)》的意见和疑问发给出版社:
美国:
O’ReillyMedia,Inc.
1005GravensteinHighwayNorth
Sebastopol,CA95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们还有一个服务于《学习OpenCV 3(中文版)》的网站。那里有示例的列表以及未来版本的计划。点击http://bit.ly/learningOpenCV3了解这些信息。
评论或是询问这《学习OpenCV 3(中文版)》技术相关的问题,请发送邮件到bookquestions@oreilly.com。
关于《学习OpenCV 3(中文版)》、课程、会议以及新闻更多信息,请访问我们的网站:http://www.oreilly.com在FaceBook上找到我们:http://facebook.com/oreilly在Twitter上关注我们:http://twitter.com/oreillymedia
在YouTube上观看我们:http://www.youtube.com/oreillymedia









