<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:汉仪书宋一简; mso-font-alt:微软雅黑; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:汉仪中黑简; mso-font-alt:微软雅黑; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:ˎ̥_GB2312; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:文泉驿正黑; mso-font-alt:仿宋_GB2312; mso-font-charset:134; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:汉仪中圆简; mso-font-alt:微软雅黑; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:汉仪楷体简; mso-font-alt:微软雅黑; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:"/@汉仪书宋一简"; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:"/@汉仪中黑简"; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:"/@文泉驿正黑"; mso-font-charset:134; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"/@汉仪中圆简"; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} @font-face {font-family:"/@汉仪楷体简"; mso-font-charset:134; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 135137280 18 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:240%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:22.0pt;} h3 {mso-style-name:"标题 3/,H3/,Map/,h3/,Level 3 Topic Heading/,目题/,Org Heading 1/,H31"; mso-style-parent:""; mso-style-next:正文; margin-top:15.0pt; margin-right:0cm; margin-bottom:9.0pt; margin-left:0cm; line-height:15.6pt; mso-pagination:widow-orphan lines-together; page-break-after:avoid; mso-outline-level:3; font-size:14.0pt; mso-bidi-font-size:10.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; font-weight:normal; mso-no-proof:yes;} p.MsoToc1, li.MsoToc1, div.MsoToc1 {mso-style-update:auto; mso-style-noshow:yes; mso-style-next:正文; margin-top:6.0pt; margin-right:0cm; margin-bottom:8.0pt; margin-left:43.4pt; text-align:justify; text-justify:inter-ideograph; text-indent:-43.4pt; line-height:15.0pt; mso-pagination:none; tab-stops:right dotted 374.45pt; layout-grid-mode:char; mso-layout-grid-align:none; font-size:11.0pt; mso-bidi-font-size:22.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-ansi-language:ZH-CN; mso-no-proof:yes;} p.MsoToc2, li.MsoToc2, div.MsoToc2 {mso-style-name:"目录 2/,toc2"; mso-style-update:auto; mso-style-noshow:yes; mso-style-next:正文; margin-top:0cm; margin-right:0cm; margin-bottom:3.0pt; margin-left:40.25pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:3.0pt; mso-para-margin-left:2.0gd; text-align:justify; text-justify:inter-ideograph; text-indent:-20.25pt; mso-char-indent-count:-2.25; line-height:15.0pt; mso-pagination:none; tab-stops:right dotted 373.75pt; layout-grid-mode:char; mso-layout-grid-align:none; font-size:9.0pt; mso-bidi-font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:汉仪书宋一简; mso-ansi-language:ZH-CN; mso-no-proof:yes;} span.MsoFootnoteReference {mso-style-noshow:yes; vertical-align:super;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} p.a, li.a, div.a {mso-style-name:图号; mso-style-update:auto; margin-top:0cm; margin-right:0cm; margin-bottom:8.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:15.0pt; mso-pagination:none; layout-grid-mode:char; mso-layout-grid-align:none; font-size:9.5pt; mso-bidi-font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:汉仪书宋一简; mso-ansi-language:ZH-CN;} p.a0, li.a0, div.a0 {mso-style-name:脚注; mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:21.7pt; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; text-indent:-21.7pt; line-height:13.0pt; mso-pagination:widow-orphan; layout-grid-mode:char; mso-layout-grid-align:none; font-size:8.5pt; mso-bidi-font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:汉仪楷体简;} p.1, li.1, div.1 {mso-style-name:"标题1 章"; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:right; mso-line-height-alt:15.6pt; mso-pagination:widow-orphan; font-size:19.0pt; mso-bidi-font-size:10.0pt; font-family:Helvetica; mso-fareast-font-family:汉仪中圆简; mso-bidi-font-family:"Times New Roman";} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:232391948; mso-list-type:hybrid; mso-list-template-ids:-1347239884 67698699 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l0:level1 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:21.0pt; mso-level-number-position:left; margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} @list l0:level2 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:42.0pt; mso-level-number-position:left; margin-left:42.0pt; text-indent:-21.0pt; font-family:Wingdings;} @list l1 {mso-list-id:752505142; mso-list-type:hybrid; mso-list-template-ids:-2066086378 67698699 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:21.0pt; mso-level-number-position:left; margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} @list l2 {mso-list-id:1578369341; mso-list-type:hybrid; mso-list-template-ids:1456228936 -1 -1 -1 -1 -1 -1 -1 -1 -1;} @list l2:level1 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:21.0pt; mso-level-number-position:left; margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} @list l3 {mso-list-id:1869025564; mso-list-type:hybrid; mso-list-template-ids:209631052 67698699 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l3:level1 {mso-level-number-format:bullet; mso-level-text:; mso-level-tab-stop:21.0pt; mso-level-number-position:left; margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->
重点指数: (重点-畅销)
基本信息
书名: 学习 OpenCV (中文版)
著译者: ( 美 )Gary Bradski Adrian Kaehler 著 于仕琪 刘瑞祯 译
I SBN : 978-7-302-20993-5
责编: 定价: 75 元
出版日期: 2009 年 9 月 版次: 1 版 1 次
编目分类: TP
读者定位: 信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等专业人员
开本: 178 × 233 印张: 39.25
字数: 800 千字 页数: 650
装帧:平装 版别:翻译版
陈列建议:计算机-计算机视觉
内容提要(卖点):四博士联袂推出的OpenCV经典教程
编辑推荐: 用 白话方式,介绍 OpenCV 和计算机视觉基础。在全球,已经有近 220 万 用户下载并使用 OpenCV Library 。在中国,至少有 40 万 用户已经下载将 OpenCV 用于商业用途。但相关图书,国内少之甚少。针对如此广泛的需求,我们特别提供由四位博士联手呈现的新书《学习 OpenCV( 中文版 ) 》。
内容简介:
计算机视觉是在图像处理的基础上发展起来的新兴学科。 OpenCV 是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器之一。它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了各种各样的算法。
本书由 OpenCV 发起人所写,站在一线开发人员的角度用通俗易懂的语言解释了 OpenCV 的缘起和计算机视觉基础结构,演示了如何用 OpenCV 和现有的自由代码为各种各样的机器进行编程,这些都有助于读者迅速入门并渐入佳境,兴趣盎然地深入探索计算机视觉领域。
本书可作为信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等有关专业的高年级学生或研究生的教学用书,也可供相关领域的研究工作者参考。
封底:
透过本书,您将置身于迅速发展的计算机视觉领域。本书由自由开源 OpenCV 的发起人所著,介绍了计算机视觉,并通过实例演示了如何快速生成这样的应用——能使计算机“看到”并根据由此获取的数据做出决策。 .
计算机视觉无处不在,安全系统、制造检验系统、医学图像分析、无人机等都可以见到它的踪影。它与 Google Map 和 Google Earth 紧密结合,它检查 LCD 屏幕上的像素,它确保衬衫上的每个针脚都能完全缝合。 OpenCV 提供了一个简易好用的计算机视觉框架和一个丰富的库,后者包含 500 多个可实时运行视觉代码的函数。
透过各章提供的练习,任何一个开发人员或爱好者都可以迅速掌握如何使用这个框架。本书特色主题如下:
Ø 透彻介绍 OpenCV
Ø 从摄像机获取输入
Ø 图像的变换
Ø 图像的分割和形状的匹配
Ø 模式识别,包括人脸检测
Ø 二维和三维场景中的跟踪监测
Ø 根据立体视觉进行三维重构
Ø 机器学习算法
“让机器来看”是一个富有挑战但也很有意思的目标。不管是想构建简单的视觉应用,还是复杂的视觉应用,都离不开这本入门必备参考,拿起它,开始愉快的学习之旅吧!
“我来说两句”
“ OpenCV 库对从业人员而言非常有用,对初涉该领域的新手而言也不失为一个优秀工具。正如其广而告之的那样,它是一套高效的计算机视觉算法。 ”
——William T. Freeman ,麻省理工学院计算机科学与人工智能实验室
“对计算机视觉领域内任何一个从业人员而言,《学习 OpenCV 》是他们不可或缺的重要参考。 ”
——David Lowe ,英属哥伦比亚大学计算机科学教授
作者简介:
Gary Rost Bradski 博士是斯坦福大学人工智能实验室计算机科学系的顾问教授,同时也是 Willow Garage 的资深科学家, Willow Garage 是一家机器人研究机构 / 孵化器。
Adrian Kaehler 博士, Applied Minds 公司的资深科学家,负责指导机器学习、统计建模、计算机视觉和机器人方面的研究。
译者简介
于仕琪 博士 供职于中国科学院深圳先进技术研究院,担任助理研究员。 OpenCV 中文网站( http://www.opencv.org.cn )的主要维护人。 2007 年北京 OpenCV 研讨会的组织者,邀请 OpenCV 开发者 Vadim Pisarevsky 和其他一些专业人员前来布道。目前主要研究方向是计算机视觉和模式识别。
刘瑞祯 博士 中国国内 OpenCV 推广的先行者,第一个 OpenCV 中文论坛的创办人。毕业于中国科学院自动化研究所模式识别国家重点实验室,目前从事智能图像识别与机器视觉方面的产业化工作。
Preface for Chinese Translation
Since the writing of book, OpenCV is now actively supported by Willow Garage(http://www.willowgarage.com), a robotics research institute located in Menlo Park , California.During the time when OpenCV had less support, Shiqi Yu helped out by producing a Chinese translation of OpenCV documentation. It is therefor fitting that Shiqi has continued on to produce the Chinese translation of this book. The Chinese translation timing is also nicely aligned with the new release 2.0 of OpenCV in September 2009. You can find links to current information on OpenCV at the main wiki page at http://opencv.willowgarage.com which links to the detailed page at http://opencv.willowgarage.com/wiki/FullOpenCVWiki. The new OpenCV releases are detailed in http://opencv.willowgarage.com/wiki/Welcome/Introduction#Announcements.
Applications for computer vision and machine perception are growing rapidly. For example, many people are familiar with face detection now available on consumer cameras. Many of those face detection techniques are adapted from the face detection algorithms developed in OpenCV. But, many people are not aware of just how important computer vision already is for manufacturing. Almost nothing is manufactured these days without making use of video inspection equipment, cameras now monitor fruits and vegetables for blemishes, make sure that the labels on products are put on in the right place, watch to make sure cloth has no flaws, or that each pixel works on an LCD screen and much more. Many of these applications make use of OpenCV routines, many such systems are deployed in China .
Computer vision also has growing uses in monitoring and safety. Some people are aware of security cameras in airports and train stations, but fewer people know that cameras are also increasingly used to monitor mine equipment, prevent drownings in swimming pools and watch traffic flow and accidents on freeways. OpenCV, with its BSD license, encourages commercial use and so is deployed on many of these monitoring systems. When you search the web, many of the image processing routines run by Google make use of OpenCV. These uses range from helping stitch satellite and airplane images together in Google Earth and Google Maps, but also to stitch street scenes together and align the imagery with laser scans in Google Street View.
Computer vision has many uses on the web, such as in the Video summary produced by Video Surfhttp://www.videosurf.com/ or for image retrieval by all the major search engines. There is a positive feedback here because the more images there are on the web, the more training data becomes available such as LabelMehttp://labelme.csail.mit.edu/data bases or Tiny Images http://people.csail.mit.edu/torralba/tinyimages/ collection. Additionally, more and more researchers are using Amazon's Mechanical Turk servicehttps://www.mturk.com/mturk/welcometo label images databases for pennies per image and tools are appearing to make such labeling tasks easier to runhttp://pr.willowgarage.com/wiki/ROS/mturk. The training data from these databases and services helps improve computer vision algorithms.
By coincidence, both authors of the OpenCV book now work in robotics where sensor perception is the main obstacle to enable wide deployment of robotics. Robots will be useful for elderly care, for agriculture, for services and for manufacturing. Robots have been doing well at navigation and mapping http://www.youtube.com/watch?v=qRrMHaO6NpE but the real key to unleashing a mobile robotics industry is perception for manipulation. Robots need to be able to see objects reliably in order to manipulate and build things. There is still much work to do to make perception reliable, and that is one of the reasons why OpenCV is open -- to collect the best work of the top people in order to enable seeing machines. Recently there have been many advances in mobile manipulationhttp://www.youtube.com/watch?v=0S2dc_B-6Kgbut much more work remains to be done. Fortunately, OpenCV is keeping up and now does a major release every?6 months with daily improvements available from the source code repositoryhttp://sourceforge.net/scm/?type=svn&group_id=22870.
I thank Shiqi Yu and Ruizhen Liu for their translation of this book. People who work in open source do their work for all of humanity and not for any specific country, company or group. OpenCV was designed to accelerate human knowledge and capability by making advances in knowledge available to everyone. This is an optimistic view of humanity but it depends on contributions back. We encourage top scientists and developers in China to learn OpenCV and to?contribute their advances back to the effort.
Gary Bradski
Senior Scientist, Willow Garage
Consulting Professor, Stanford University , CS Dept.
garybradski@gmail.com
September 2009
出版前言
在 CMU( 卡内基 · 梅隆大学,全球计算机专业三强之一 ) , A. 纽维尔教授时常饱含热情地对学生说:“世界上有这么多 ‘ 为什么 ?’‘ 要是能解决那些问题该有多好啊? ’ 这样的问题仿佛时时刻刻都在呼唤: ‘ 解决我吧,弄清我吧! ’ 像等待着恋人那样在等着我们这些研究者去解决它们。”作为出版工作者,我们时常也能听到这样的声音,吸引着时常以“超级好奇宝宝”自诩的我们循声而去并付诸实践。
在一次偶然的事件中,我们对计算机视觉发生了浓厚的兴趣。这是专门研究如何让机器 ( 即摄像机和计算机 ) “看”的科学,这些机器可用来定性或定量地分析图像中各目标之间的相互联系,并通过对这些图像内容含义的理解来解释场景。无论是研究人员或从业人员,还是门外汉,这都是一件多么有趣又富有挑战的事情啊!
循着计算机视觉这一主线, OpenCV 自然成为我们感兴趣的焦点。作为一个跨平台的计算机视觉库, OpenCV(Open Source Computer Vision Library ,开源的计算机视觉库 ) 最初由 Intel 公司发起并开发,以 BSD 许可证授权发行,可免费用于商业和研究领域。它包含许多常用的算法,已经广泛应用于对实时性要求较高的计算机视觉和模式识别系统的开发。截至 2009 年 8 月,在 sourceforge.net 的下载次数已经超过 2 200 000 次,大量用户来自中国。 OpenCV 中文网站 (http://www.opencv. org.cn ) 通过提供丰富的中文资料为 OpenCV 在中国的推广做出了巨大贡献,吸引着越来越多的新手参与 OpenCV 的学习、使用和贡献中。
随着对 OpenCV 的深入了解,我们把眼光投向 O’Reilly Media 。它是一家在技术圈内享有盛誉的出版公司。我们一向倾慕于其创始人 Tim O'Reilly 的出版理念: “All of our editors are expected to get their hands dirty with the technology we publish about. Many are former programmers, system administrators, technical writers, or practicing scientists, and all are expected to have written at least one successful book of their own. Because we’re close to the industry, we know what books are really needed, and we make sure they tell people what they really need to know.”
他们在适当的时候推出了 Learning OpenCV 这本优秀的教材。在浮夸之风盛行的当下 , 书名中的 Learning 显得格外清新、朴实 , 一种久闻的亲切感油然而生。书中广泛探讨的计算机视觉算法与理论,丰富的实例,清晰的结构,简繁适当的写作风格,无不引人入胜。对于更注重技术细节的专业人士而言,本书作者的背景和本书内容的组织和呈现方式可能更具有吸引力。关于 Gary 和 Adrian 的介绍,可参见书后的“关于作者和译者”。
顺利引进此书之后,更关键的工作之一便是物色“双优”译者。何为双优呢?优秀的专业知识背景 + 优秀的中英文文字功底。我们何其幸运,一发出邀请,国内 OpenCV 的先行者刘瑞祯和于仕琪两位博士便爽快地答应出手相助。感谢他们能在百忙之中贡献自己的休息时间参与本书的翻译,这是源于他们对于 OpenCV 的一往情深,源于他们对于计算机视觉领域难以割舍的情结,源于他们肩负的知识传播的使命感。
在翻译过程中,译者所表现出来的严谨、认真给我们留下了深刻的印象。整个沟通过程是令人愉快的。对于编辑提出的疑问,他们充分体现出他们的专业精神,以科学的态度负责任地加以肯定或否定。在这个互动过程中,我们受益良多。相信在他们的帮助下,学习 OpenCV 将成为一件轻松的事情。
为保证此书的尽善尽美,我们还有幸邀请到清华大学电子工 程系 博士研究生段菲对本书进行审阅。他曾经翻译过非常畅销的《 DirectX 3D 游戏开发编程基础》和《精通 3D 图形编程》。在我们的印象中,他是一个一丝不苟、地道的 science guy ,对技术抱有超常的激情。在解决疑问的时候,他会现场进行验算。对于本书,他以专业的眼光进行了仔细审阅。在此向他表示衷心的感谢!
在编辑此书过程中,为方便读者快速定位,为方便读者快速定位自己希望了解的知识点,我们保留了原书索引,并在正文中相应位置标注了原书页码 ( 见标记符【】 ) ,希望能为读者提供少许帮助。
OpenCV 在国内的应用情况如何呢?我们有幸从大恒 王亚鹏 先生那里获得了答案。作为行业领跑者,他抽出宝贵的休息时间与我们分享了他们最终选用 OpenCV 的历程,也让我们对本书能为 OpenCV 做出贡献大有信心。在此也向他致以诚挚的谢意!
任何一种技术,仅有赞助者是不够的,仅有充满激情的开拓者也不够的,还必须有执着的“传教士”,还必须有忠实的跟随者。 OpenCV 何其幸运,有优秀的公司 ( 早期的 Intel 和现在的 Willow Garage) 做支撑,有 Gary Bradski , Adrian Kaehler ,刘瑞祯和于仕琪这样乐于分享的“知识传播者”,有 Google 等优秀企业的开发人员积极参与和无私奉献,它的前景是可以预知的。计算机视觉是一个新兴领域,一个可以由天马行空自由创造的天地,一块等待着您留下脚印的“尚未凝固的水泥地” ( 注—— 明可夫斯基教授曾为迷茫中的爱因斯坦开“处方”,指导他大胆创新和开拓 ) 。
亲爱的读者朋友们,这本书是否也能点燃您对您产生这样的激情呢?拿起它,开始令人心动的新旅程吧!正如济慈所说:“ Now it appears to me that almost any Man may like the spider spin from his own inwards his own airy Citadel - the points of leaves and twigs on which the spider begins her work are few, and she fills the air with a beautiful circuiting. ( 在我看来,几乎人人都可以像蜘蛛那样,从体内吐出丝来结成自己的空中堡垒。她开始工作时,只凭借着树叶和树枝的几个尖儿,然后来回兜转,最后竟使空中布满了美丽迂回的路线。”希望我们也能借助于简单的“树叶和树枝的几个尖儿”,构筑起自己的城堡,计算机相关领域的城堡,共同共享自己微薄的力量。作为这一战线上的盟友,我们期待着您的任何意见和建议,电子邮箱 coo@netease.com 期待着您与我们分享这个旅程中的点点滴滴!
清华大学出版社
2009 年 9 月
译者序
计算机视觉是在图像处理的基础上发展起来的新兴学科,在计算机科学和工程、信号处理、物理学、应用数学和统计学,神经生理学和认知科学等研究方面,在制造业、检验、文档分析、医疗诊断,和军事等领域等各种智能/自主应用方面,都有非常广阔的发展前景。
由于涉及到如此多的专业知识,对普通的研发人员而言,计算机视觉颇有些阳春白雪的意味。其实这种意味来自于两个方面,即它是学术研究与工程开发的集合体。纯粹的研究人员,在有好的想法或者概念情况下,需要一个工程开发工具来验证自己的想法,这个开发工具必须是简单而易用的;工程人员则由于专业背景知识的缺乏,非常难以介入到计算机视觉领域。而 OpenCV 恰恰为这两者的结合提供了一个得心应手的开发工具或者应用平台。
OpenCV 作为一个开放源代码的应用平台,最大程度上体现出“众人拾柴火焰高”的开放精神。有大量的 OpenCV 学习资源可以在互联网上找到,这里译者深深感谢互联网的发展,一言以蔽之,没有互联网,就没有 OpenCV 。因此 OpenCV 发展到今天,已经快速从少数人的兴趣爱好逐步转变为一个系统的、有科研和商业应用价值的研发平台。
这几年在中国,译者很欣喜地看到越来越多的学生、科研人员和应用开发人员开始在计算机视觉的研究和工程应用领域使用 OpenCV ,并逐步把 OpenCV 作为自己所从事职业的一个忠实伙伴。
作为 OpenCV 项目的发起人, Gary Bradski 和 Adrain Kaebler 所撰写的 Learning OpenCV 一书,对 OpenCV 的很多基本算法函数都给出了详细的阐述,并且对函数算法的说明也非常到位。在阅读本书的过程中,读者不但有“知其然”,而且有“知其所以然”的感受。
本书在介绍计算机视觉各个算法思想的同时,通过大量的程序样例,给读者以启发和引导,始终体现出“学以致用”的精神。特别是每章之后的练习,让读者在浏览各章节内容的基础上,借此做更进一步的思考,对读者在视觉算法思想的领悟和视野的拓展大有裨益。“桃李不言,下自成蹊”,对本书真实价值的最有效评判,其实是来自于广大的读者。
翻译本书的过程对于每位译者而言,既是再次学习和思考的历程,也是追寻作者提出问题、分析问题、解决问题的思维过程。“嘤其鸣矣,求其友声”,本书翻译的过程虽然并不短暂,译者却无过多艰辛之感,原因大致是在翻译的路途上,我们既体味到作者在本书中所展现的灵动思维,也感受到广大同行对本书进展的热情关注。换言之,译者不是在独自前行。
参与翻译本书的人员还有徐明亮、孙涛、柴树杉、吴佳、周磊、罗明、武思远、马长正、陈瑞卿等人。感谢他们的辛勤工作。本书的翻译与其说是几个人的工作,毋宁说它是 OpenCV 爱好者集体工作的结晶。译者感谢清华大学出版社给予我们这样一个难得的机会。
刘瑞祯
2009 年 9 月于北京
写在前面的话
“工欲善其事,必先利其器”,古代的剑客会像爱护自己的手足一样珍惜自己的剑,因为他懂得在决斗中拥有适合自己的武器往往是克敌制胜的关键。对于从事机器视觉应用技术开发的工程师来说,他们所追求的是功能强大同时又快捷高效的工具,既能保证开发出来的视觉系统足以满足复杂应用现场的实际需求,又能快速完成一系列复杂算法的开发。毫无疑问,每个优秀的视觉技术开发人员都会认真地考虑自己所选用的开发工具。如果说 VC++ 是视觉技术开发人员不可或缺、随身必备的军刀,那么 OpenCV 就是他们冲锋陷阵时渴望拥有的冲锋枪,它带给开发人员两个重要的法宝—— 威力、速度,它对企业和开发人员具有两大“致命”诱惑—— 开放源码、完全免费。
中科院中国大恒集团下属的北京大恒图像视觉有限公司作为国内最早成立的专业从事机器视觉产品开发的公司,一直专注于自有产品、自有技术的研发,也经历了从最初在 DOS 操作系统下的汇编语言、 C 语言一直到目前 Vista 操作系统下的 Visual Studio 等基础开发工具的升级换代过程,到现在形成了 VC++ 、 IPP 、 OpenCV 、 Halcon 等多种工具并用的局面。说到 OpenCV ,就不得不提起 Intel 公司在 1996 年发布的著名的奔腾处理器和 MMX ( Multi Media Extended )技术,也可以说正是奔腾处理器和 MMX 技术的出现把机器视觉技术在各领域中的实际应用发展推向了快车道。我们都知道基于数字图像处理和模式识别等技术的算法运算量一般都非常之大,所以在早期用计算机对一幅图像做个基本的处理都要花费很长的时间,这一瓶颈严重制约了机器视觉技术在实际应用领域的发展,所以评价一个视觉算法程序开发质量的重要指标之一就是运算速度,一直到现在的多核处理器时代仍然如此。而 Intel 公司的 MMX 技术以及后来的 SSE ( Streaming SIMD Extensions )技术的出现使得机器视觉算法的开发人员看到了希望的曙光,这种基于单指令多数据的多媒体指令集技术可以使得图像处理算法的运行速度几倍甚至十几倍的提高,然而要想使用好该技术就必须面对令人头疼的汇编语言,算法开发和优化需要花费比较多的时间才能完成。
对于追求开发效率的机器视觉应用开发企业来讲,希望的是既能开发出性能优越的视觉系统,又能尽量提高开发效率、降低成本,大恒图像也在这方面经历了若干次选择。最初是选择了 Intel 公司的 IPL 及 IPP ,这里面的函数都是采用了 MMX 或 SSE 技术优化的,是很优秀的图像处理库,但这里面大都是比较基础的图像处理函数,不能满足复杂的应用技术快速开发的要求,而且还有一点就是不能开放源代码。 OpenCV 的出现使得每个机器视觉技术的开发人员都眼前一亮,它不仅是完全免费的开源软件,更可贵的是它包含的各类图像处理及识别的函数非常丰富,而且一般都利用 MMX 及 SSE 技术进行了很好的优化!我是从 2001 年开始接触 OpenCV ,虽然公司里的算法工程师都很快喜欢上了 OpenCV ,虽然我们从 2002 年起就正式地在产品的开发中使用了 OpenCV ,虽然 OpenCV 已经成为视觉算法开发部必备的开发工具之一,但说句实在话我一直心有疑虑,我担心的是会不会哪一天 Intel 公司突然宣布 OpenCV 要收费,当然我的担心也是缘于我计划把我们公司自己开发的算法库建立在 OpenCV 的基础之上。幸运的是我的这种担心被 Intel 公司的 IPP 首席设计 师李信宏 先生化解了,这还要感谢本书的两位译者 刘瑞祯 博士和 于仕琪 博士,正式在他们组织的一次 OpenCV 的研讨会上我结识了 李信宏 先生和来自 OpenCV 开发组的Vadim Pisarevsky 先生, 李信宏 先生亲口告诉我说 Intel 公司 不会这样做,我信了,我相信 Intel 公司是可以用他们强大的 CPU 的赢利来支持 OpenCV 的,我也因为 OpenCV 成为了 Intel CPU 的忠实拥护者。
当然,除了 IPP 和 OpenCV 之外还有一些非常优秀的专业机器视觉开发软件包,比如大家熟悉的 Matlab 、 Halcon 、 Sapera 、 VisionPro 、 EVision 等, Matlab 主要是高校里在视觉算法研究方面用的比较广泛,其他几个主要是针对商业应用开发的,虽然这些商业软件对于初级的开发者更容易掌握,但都是收费软件且不开源,所以专业的开发人员更喜欢 OpenCV ,因此 OpenCV 目前成为了在从事机器视觉技术开发的企业中广泛使用的开发工具。我相信本书的出版将有助于机器视觉算法开发人员更容易地掌握 OpenCV 这一独特的开发工具,希望有更多的开发人员借此了解 OpenCV ,也衷心祝愿 OpenCV 能走得更远、做得更好!
王亚鹏
北京大恒图像视觉有限公司 ( 副总经理 )
前言
本书为使用开放源代码计算机视觉库 (OpenCV) 提供了一个实战指南,同时还介绍了大量计算机视觉领域的背景知识以帮助读者充分使用 OpenCV 。
计算机视觉是一个迅速发展的领域,摄像机价格不断降低且功能越来越强、计算能力的普及以及视觉算法的日臻成熟都带动了该领域的发展。 OpenCV 在计算机视觉的发展中扮演着重要的角色,它使得数千名研究人员在视觉领域能够获得更高的生产力。由于 OpenCV 专注于实时视觉应用,因此十分 有助于学生和专业人员高效完成项目和加快研究进展,这是通过 它提供的一个计算机视觉和机器学习基础架构来实现的,这个基础架构过去只是少数设备完善的实验室的专利。本书目的如下。
为 OpenCV 提供一份更好的文档 —— 详细说明函数调用约定以及如何正确使用这些函数。
快速 帮助读者对计算机视觉的算法原理获得直观的理解。
让 读者认识到可以使用哪些算法,以及应用这些算法的场合。
通过 许多可用的代码实例,让读者循序渐进地学会如何实现计算机视觉和机器学习算法。
培养读者 具有一定的直觉,使其在出现问题的时候能够对一些 OpenCV 源代码中更高级的子程序进行修正。
简 言之,本书既是我们在学校时希望使用的教材,也是我们在工作时希望翻阅的参考书。
本书 为 OpenCV 这个工具提供了注解,旨在帮助读者快速在计算机视觉领域中开展有趣的工作。本书能帮助读者直观地理解算法的原理,这样可以帮助读者设计和调试视觉系统,并使得其他教材中对计算机视觉和机器学习算法的形式化描述更易于理解和记忆。
总而言之,如果直观地领会了算法的原理,便容易理解复杂的算法和与这些算法相关的数学知识。
本书 包括算法描述、可运行的例程代码以及对 OpenCV 库中的计算机视觉工具的解释,因此,它应该会对多种类型的读者提供有益的帮助。
对于需要迅速实现计算机视觉系统的专业人员来说,例程代码为开始工作提供了一个快速上手的框架。我们对算法原理的直观描述可以迅速教会读者或提示读者其 用法。
学生
如 我们所说,本书是我们当年在学校时希望使用的教材。直观的解释、详细的文档和例程代码都有助于读者在计算机视觉领域获得迅速成长,完成更多有趣的课堂项目,并且最终为计算机视觉领域贡献新的研究成果。
教师
计算机 视觉是一个迅速发展的领域。我们发现,在需要时讲解一些经典的理论、当前的论文或专家的讲稿,学生会迅速地掌握一本课本。同时,学生也可以更早开始一些课程项目,尝试更多有挑战性的任务。
业余爱好者
计算机 视觉非常有趣,可任由你天马行空地“创造”!
我们 对于为读者提供充分的直观感受、文档以及可运行的代码给予了强烈的关注,目的是使读者能够迅速实现实时计算机视觉应用程序。
本书并不是一本正规教材。毋庸讳言,本书的许多知识点都涉及了大量数学细 节 [1] ,但这样做的目的是加深读者对算法的理解,或者讲清楚算法中所用的前提条件。在这里,我们并不打算进行严格的数学推导,这也许会让一些一直用严格数学表达的人感到不习惯。
本书 不是为理论研究人员所写,因为它更多地关注应用。本书针对视觉提供通用的知识,而不是仅仅针对计算机视觉的某些特定应用 ( 例如医学图像或遥感分析 ) 。
也就是说,作者深信一点:读完这里的解释之后,学生不仅会更好地学习理论知识,还会将这些知识铭记于心。因此,本书是针对理论课程的理想辅导书,也适用于入门课程或实战性较强的课程。
本书所有的例程都基于 OpenCV 1.0 版本。代码可以在 Linux 或 Windows 下运行,也可能在 OS-X 下运行。 本书的例程源代码可以本书的网站 (http://www.oreilly.com/catalog/9780596516130 ) 下载。 OpenCV 可以从它的代码管理网站 ( http://sourceforge.net/projects/opencvlibrary ) 下载。
OpenCV 仍在不断发展,每年都会发布一到两个正式版本。 一般来说,可以从代码管理网站的 SVN 服务器 ( http://sourceforge.net/scm/?type=svn&group_id=22870) 获得最新代码。
预备知识
在大多数情况下,读者只需要知道如何用 C 语言编程,也许需要知道一些 C++ 编程知识。许多数学相关的内容属于选读,并带有特定标记。书中涉及的数学知识包括简单的代数和基本的矩阵代数,并且假定读者较熟悉最小二乘优化问题的求解方法,以及高斯分布、贝叶斯定律和简单函数的求导等一些基本知识。
这些数学知识用于帮助读者加深对算法的直观理解。读者可以跳过数学和算法描述,只通过函数定义和范例代码,便可让计算机视觉应用程序启动和运行。
本书不需要按照顺序从头到尾地阅读。它可以作为一种用户手册:在需要的时候,可以从中查找函数;如果想知其所以然,可以阅读函数的描述。然而,本书的设计初衷是更偏向于教程。它帮助读者基本了解计算机视觉,如何以及何时使用所选定的算法。
本书可以作为计算机视觉领域本科生或研究生的辅导书或主要教材。学生阅读本书可迅速了解计算机视觉,然后再辅以其他教材中的理论知识以及本领域内的学术论文,更深入地学习。每一章后面都有练习题,可以帮助测试学生对知识的掌握情况,并加深理解。
您可以通过下面三种方式之一阅读本书。
仅选有用部分
开始阅读本书时,请先阅读第 1 章~第 3 章,然后根据自己需要阅读其他章节。本书不一定要按照顺序阅读,不过第 11 章和第 12 章除外。
最佳进度
一个 星期只读两章,直到用六个星期读完第 1 章~第 12 章 ( 第 13 章有些特殊,详见下文讨论 ) 。然后开始项目,着手解决具体问题,并阅读其他教材和相关的 论文。
快速掌握
在 充分理解内容的前提下尽快浏览本书第 1 章~第 12 章。然后开始项目,着手解决具体问题,并阅读其他的教材和相关的论文。该方法可供专业人员选用,同时也适用于比较高级的计算机视觉课程。
第 13 章的篇幅较多,介绍了机器学习的背景知识、 OpenCV 中实现的机器学习算法背后的细节,以及如何使用这些算法。当然,机器学习与物体识别以及计算机视觉的很多方面相关,详细描述需要一本书的篇幅。专业人员会发现,这是未来阅读文献 ( 或直接使用 OpenCV 库中的代码立项 ) 的一个理想起点。对于一般的计算机视觉课程来说,本章可作为选学内容。
这是作者所希望的教授计算机视觉的方法:学生掌握要点后,快速学完课程内容,然后动手做一些有意义的课堂项目,同 时指导 老师通过其他教材或论文提供该领域的一些有深度的知识。该方法对小学期、整个学期或两个学期的课程都适用。学生的兴趣和创造力可以被迅速激发起来,很好地将自己所理解的知识和可运行的代码结合起来。当他们开始更有挑战性且更耗时的项目时,指导老师可帮助他们开发和调试复杂的系统。对于课时较多的课程,项目本身可以以项目管理的方式变成教育方式。首先建立其一个可以运行的系统,并优化改进该系统,然后进行研究。课程的目标是每个项目可以发表一篇会议论文,并且在随后 ( 课程结束之后 ) 的工作中发表更多相关论文。
本书所用约定
本书 采用如下印刷约定。
斜体
表示 新名词, URL ,电子邮件地址,文件名,文件扩展名,路径名,目录和 Unix 实用程序。
等宽字体
表示 命令、选项、开关、变量、属性、键值、函数、类型、类、命名空间、方法、模块、参数、参数、值、对象、事件、事件句柄、 XML 标签、 HTML 标签、文件内容或者命令输出。
等宽粗体
显示 需要用户逐字输入的命令或者其他文字。也用于代码中的强调。
等宽斜体
显示 应该被用户输入值代替的文字。
[…]
表示引用参考文献。
注意: 该图标表示一个技巧,建议或一般注解。
警告:该图标表示警告或注意事项。
OpenCV 是免费的,可用于商业和研究,因此对本书的例程代码,我们也持同样的态度。本书例程代码可以用于课程作业、科研或商业产品。如果在使用 OpenCV 时能在参考文献中引用本书,我们将很高兴,但这不是必须的。它如何帮助你完成课程作业 ( 最好保密 ) 这方面的细节可以不必告诉我们,但在借助于 OpenCV 时,我们希望知道您是如何将计算机视觉用于科学研究,课堂教学以及商业产品的。再次强调,这不是必须的,但我们总期待着您能跟我们讲几句。
联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商:
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街 2 号成铭大厦 C 座 807 室 (100035)
奥莱利技术咨询 ( 北京 ) 有限公司
本书也有相关的网页,我们在上面列出了勘误表、范例以及其他一些信息。你可以访问:
http://www.oreilly.com/catalog/9780596516246( 英文版 )
http://www.oreilly.com.cn/book.php?bn=978-7-???-??????-?( 中文版 )
对本书做出评论或者询问技术问题,请发送 E-mail 至:
bookquestions@oreilly.com
希望获得关于本书、会议、资源中心和 O ’ Reilly 网络的更多信息,请访问:
http://www.oreilly.com
http://www.oreilly.com.cn
一个长期的开源项目见证了许多人的参与和离开,每个人都以自己不同的方式做出贡献。 OpenCV 的贡献者列表实在太长 , 无法 在此列出 ,但可以通过 随 OpenCV 一起发布的文件…/opencv/docs/HTML/Contributors/doc_contributors.html 看到所有贡献者 。
Intel 是 OpenCV 的诞生地,它对该项目的全程支持理应得到感谢。开放源代码项目需要一个领军人物和充足的开发支持才能获得突破和迅速发展。 Intel 提供了这两个关键条件。无论境况如何,一个公司能够启动这样一个项目并坚持不懈地进行维护,着实难能可贵。自诞生以来, OpenCV 帮助发起了 Intel 的高性能多媒体函数库 (IPP) , Intel 的高性能多媒体函数库是一系列手工精心编制的汇编语言子程序,用于计算机视觉、信号处理、语音处理、线性代数等其他领域。现在, OpenCV 也可以通过 Intel 的高性能多媒体函数库提高效率 ( 可选选项 ) 。因此,一个伟大的商业产品和一个开源产品的发展历程是互相关联的。
Mark Holler 是 Intel 的一位研发主管。在比较早的时候,大量时间投入这个非正式的项目 , 他对此睁一只眼闭一只眼。他的好心得到了好报,他现在在加州酒乡 Napa 的 Mt. Veeder 地区经营一家葡萄酒厂,可尽情享用美酒。 Intel 高性能多媒体函数库小组的 Stuart Taylor 允许我们 “ 借用 ” 他的俄罗斯软件团队来帮助 OpenCV 。在 OpenCV 发展和存活下来 的 过程中, Richard Wirt 发挥了关键性作用。作为 Intel 实验室的主要负责人 ,实验室主任 Bob Liang ( 粱 兆柱博士 ) 使 OpenCV 蓬勃发展;当 Justin Rattner 成为 CTO 时,软件技术实验室为 OpenCV 确立了更加坚定的支持,这时获得了软件大师 Shinn-Horng Lee ( 李信弘 ) 的支持和以及他的经理 Paul Wiley 的间接支持。在早期 , Omid Moghadam 帮助 OpenCV 做了很多宣传工作。 Mohammad Haghighat 和 Bill Butera 在技术咨询委员会中做了优秀的工作。 Nuriel Amir 、 Denver Dash 、 John Mark Agosta 和 Marzia Polito 在启动机器学习库的过程中发挥了关键作用。 Rainer Lienhart 、 Jean-Yves Bouguet 、 Radek Grzeszczuk 和 Ara Nefian 是 OpenCV 的关键贡献者和优秀的合作者; Rainer Lienhart 现在是一个教授, Jean-Yves Bouguet 现在是研究实验室人员并已经上任。 技术贡献者的名字实在太多,无法一一列举。
在软件方面,一些人员特别突出,所以必须提到,特别是俄罗斯软件团队。这些人的领导者是俄罗斯优秀的程序员 Vadim Pisarevsky ,他开发了 OpenCV 的很大一部分,并且在项目从繁荣转为艰难时刻,挤出时间对这个项目进行管理并 “ 抚育 ” 。如果 OpenCV 有一个真英雄的话,那么这个人就是他。他的技术洞察力对本书的写作给予了巨大帮助。 在支持不足的 时期 , Valery Kuriakin 给予了管理支持和保护,他是一个具有伟大天才和智慧的人。还有 Victor Eruhimov ,他几乎一直在参与 OpenCV 项目。我们也感谢 Boris Chudinovich 完成了所有轮廓组件的工作。
最后,特别感谢 Willow Garage[WG] 公司,不仅因为它对 OpenCV 未来发展的坚实资金支持,而且在本书最后阶段为一个作者提供支持 ( 并提供了点心和饮料 ) 。
当准备本书时,有几个关键人物贡献了他们的建议、审阅和意见。非常感谢《纽约时报》的技术记者 John Markoff 的鼓励、关键沟通和实用的写作建议。 对于我们的评阅人,要特别感谢加州理工学院的物理学博士后 Evgeniy Bar ,每一章他都给出了很多有用的建议; Applied Minds 的 Kjerstin Williams 进行了详细的证明和验证,直至本书完成; Willow Garage 的 John Hsu 测试了所有的例程代码;还有 Vadim Pisarevsky ,他仔细阅读了每一章,验证了函数调用和代码,并提供了几个例程代码。 还有其他几位评阅人进行了部分章节的评阅, Google 的 Jean-Yves Bouguet 在摄像机标定和立体视觉章节的讨论中给予了巨大帮助。斯坦福大学的 Andrew Ng 教授为机器学习的章节提供了有用的建议。还有数目众多的其他评阅人评阅了不同章节,在此一并对他们表示感谢。当然,如果因为我们的大意或者误解造成的错误,是我们的责任,而不是由于我们收到的建议造成的。
最后,非常感谢我们的编辑 Michael Loukides 的早期支持、大量的编辑工作以及长时间里一直具有的激情。
家里有三个年幼的孩子,我的妻子 Sonya 为本书的出版比我付出了更多的劳动。虽然在人脸识别的例程图像中, OpenCV 让她受到关注,但是仍要向她表达我衷心的感谢和爱意。从更久远来讲,我的技术生涯始于俄勒冈大学物理系,然后是转入加州大学伯克利分校读本科期间。对于读研究生期间,我感谢我的导师,波士顿大学自适应系统中心的 Steve Grossberg 和 Gail Carpenter ,我从他们那儿开始了我的学术生涯。虽然他们专注的方向是大脑的数学模型,我已经结束了该研究而专注于人工智能的工程领域,但是我认为我在那儿学到的眼光使我有所不同。 在研究生院的一些前任同事,他们依然是我的亲密朋友并且 为 本书 提供了 一些建议、支持甚至进行了一些编辑工作:感谢 Frank Guenther 、 Andrew Worth 、 Steve Lehar 、 Dan Cruthirds 、 Allen Gove 和 Krishna Govindarajan 。
我要特别感谢斯坦福大学,目前我是该大学人工智能和机器人实验室的 顾问 教授。 跟世界上最 有头脑的人近距离 接触深深影响了我,我曾与 Sebastian Thrun 和 Mike Montemerlo 一起工作把 OpenCV 应用到 Stanley( 一个从美国国防部高级研究计划署赢得二百万美元的机器人 ) ,与 Andrew Ng 一起参与 STAIR( 最先进的个人机器人之一 ) ,这些 团队合作 比一个人做有趣 得 多。 这是一个做事全力以赴的实验室,是一个优秀的环境。 除了 Sebastian Thrun 和 Andrew Ng ,我还要感谢 Daphne Koller 设置了高的科技标准,并让我雇佣一些关键的实习生和学生;还要感谢 Kunle Olukotun 和 Christos Kozyrakis ,与他们一起讨论并一起工作。 我还要感谢 Oussama Khatib ,他在控制方面的工作激发了我现在对虚拟导航机器人控制的兴趣。 Intel 的 Horst Haussecker 是一个优秀的同事,他 的 写书经验帮助我完成 了 本书。
最后,再次感谢 Willow Garage 允许我在这个世界一级的天才环境里追求我毕生的机器人梦,并且支持我写本书以及支持 OpenCV 。
我最初的学习专业是理论物理,然后是超级计算机设计和数字计算,最后到机器学习和计算机视觉,这是一条很长的经历曲线。在这条学习之路中,很多人给了我巨大的帮助。有许多优秀的教师帮助我,有些是正式的导师,其他的是非正式的指路人。我要特别指出加州大学圣克鲁兹分校的 David Dorfan 教授和斯坦福大学国家加速器实验室的 Hartmut Sadrozinski 教授,在开始阶段他们给了我很大的鼓励, Norman Christ 利用简单的话语 “ 如果你不能用计算机实现,你就不知道你自己在讲什么 ” 教会了我计算的精髓。谨向 James Guzzo 致以特别的感谢,他允许我在 Intel 做一些任务之外的事情,这些年还鼓励我参加 DARPA 无人驾驶汽车大赛。最后,我感谢 Danny Hillis 创造了一个好的环境,在这儿所有的技术可以获得飞跃,并且在 Applied Minds 时鼓励我写本书。
另外要感谢斯坦福大学在这些年里对我特别的支持。从我与 Sebastian Thrun 一起参加无人驾驶汽车大赛团队,到与 Andrew Ng 一起参加 STAIR 机器人项目,斯坦福大学人工智能实验室一直慷慨地提供办公室,资金支持,大部分重要的创意,富有启发性的谈话,并在需要时在视觉、机器人和机器学习方面提供指导。我深深地感激那些在我成长和学习过程中提供重要帮助的人。
除了一份特别的感谢,没有其他的感谢能够表达对我的妻子 Lyssa 的谢意,她一直毫不犹豫地鼓励我参与这个项目,心甘情愿地陪伴我来回出差使我能与 Gary 一起写书。非常感谢她。
O’Reilly Media, Inc. 介绍
为了满足读者对网络和软件技术知识的迫切需求,世界著名计算机图书出版机构 O’Reilly Media, Inc. 授权清华大学出版社,翻译出版一批该公司久负盛名的英文经典技术专著。
O’Reilly Media, Inc. 是世界上在 Unix 、 X 、 Internet 和其他开放系统图书领域具有领导地位的出版公司,同时也是联机出版的先锋。
从最畅销的 The Whole Internet User’s Guide & Catalog( 被纽约公共图书馆评为 20 世纪最重要的 50 本书之一 ) 到 GNN( 最早的 Internet 门户和商业网站 ) ,再到 WebSite( 第一个桌面 PC 的 Web 服务器软件 ) , O’Reilly Media, Inc. 一直处于 Internet 发展的最前沿。
许多书店的反馈表明, O’Reilly Media, Inc. 是最稳定的计算机图书出版商 —— 每一本书都一版再版。与大多数计算机图书出版商相比, O’Reilly Media, Inc. 具有深厚的计算机专业背景,这使得 O’Reilly Media, Inc. 形成了一个非常不同于其他出版商的出版方针。 O’Reilly Media, Inc. 所有的编辑人员以前都是程序员,或者是顶尖级的技术专家。 O’Reilly Media, Inc. 还有许多固定的作者群体 —— 他们本身是相关领域的技术专家、咨询专家,而现在编写著作, O’Reilly Media,Inc. 依靠他们及时地推出图书。因为 O’Reilly Media, Inc. 紧密地与计算机业界联系着,所以 O’Reilly Media, Inc. 知道市场上真正需要什么图书。
目 录
出版前言 ... VI
译者序 .. .. XI
写在前面的话 ... XIII
前言 ...... ...... XV
第 1 章 概述 ... 1
什么是 OpenCV .. 1
OpenCV 的应用领域 ... 1
什么是计算机视觉 ... 2
OpenCV 的起源 ... 6
下载和安装 OpenCV .. 8
通过 SVN 获取最新的 OpenCV 代码 ... 11
更多 OpenCV 文档 ... 12
OpenCV 的结构和内容 ... 14
移植性 ... 16
练习 ... ... 16
第 2 章 OpenCV 入门 ... 18
开始准备 ... 18
初试牛刀 —— 显示图像 ... 19
第二个程序 —— 播放 AVI 视频 ... 21
视频播放控制 ... 23
一个简单的变换 ... 26
一个复杂一点的变换 ... 28
从摄像机读入数据 ... 30
写入 AVI 视频文件 ... 31
小结 33
练习 34
第 3 章 初探 OpenCV . 35
OpenCV 的基本数据类型 ... 35
CvMat 矩阵结构 ... 38
IplImage 数据结构 ... 48
矩阵和图像操作 ... 54
绘图 ... ... 91
数据存储 ... 98
集成性能基元 ... 102
小结 ... ... 103
练习 103
第 4 章 细说 HighGUI 106
一个可移植的图形工具包 ... 106
创建窗口 ... 107
载入图像 ... 108
显示图像 ... 110
视频的处理 ... 120
ConvertImage 函数 ... 125
练习 126
第 5 章 图像处理 ... 128
综述 128
平滑处理 ... 128
图像形态学 ... 134
漫水填充算法 ... 146
尺寸调整 ... 149
图像金字塔 ... 150
阈值化 ... 155
练习 162
第 6 章 图像变换 ... 165
概述 165
卷积 ... ... 165
梯度和 Sobel 导数 ... 169
拉普拉斯变换 ... 172
Canny 算子 ... 173
霍夫变换 ... 175
重映射 ... 183
拉伸、收缩、扭曲和旋转 ... 185
CartToPolar 与 PolarToCart 196
LogPolar 197
离散傅里叶变换 (DFT) 200
离散余弦变换 (DCT) 205
积分图像 ... 206
距离变换 ... 208
直方图均衡化 ... 211
练习 ... ... 213
第 7 章 直方图与匹配 ... 216
直方图的基本数据结构 ... 219
访问直方图 ... 221
直方图的基本操作 ... 223
一些更复杂的策略 ... 231
练习 244
第 8 章 轮廓 ... 246
内存 246
序列 248
查找轮廓 ... 259
Freeman 链码 ... 266
轮廓例子 ... 268
另一个轮廓例子 ... 270
深入分析轮廓 ... 271
轮廓的匹配 ... 279
练习 290
第 9 章 图像局部与分割 ... 293
局部与分割 ... 293
背景减除 ... 294
分水岭算法 ... 328
用 Inpainting 修补图像 ... 329
均值漂移分割 ... 331
Delaunay 三角剖分 和 Voronoi 划分 ... 333
练习 347
第 10 章 跟踪与运动 ... 350
跟踪基础 ... 350
寻找角点 ... 351
亚像素级角点 ... 353
不变特征 ... 355
光流 356
mean-shift 和 camshift 跟踪 ... 371
运动模板 ... 376
预估器 ... 383
condensation 算法 ... 399
练习 ... ... 403
第 11 章 摄像机模型与标定 ... 406
摄像机模型 ... 407
标定 ... ... 414
矫正 ... ... 430
一次完成标定 ... 432
罗德里格斯变换 ... 437
练习 ... ... 438
第 12 章 投影与三维视觉 ... 441
投影 441
仿射变换和透视变换 ... 443
POSIT : 3D 姿态估计 ... 449
立体成像 ... 452
来自运动的结构 ... 493
二维和三维下的直线拟合 ... 494
练习 ... ... 498
第 13 章 机器学习 ... 499
什么是机器学习 ... 499
OpenCV 机器学习算法 ... 502
Mahalanobis 距离 ... 516
K 均值 ... 519
朴素贝叶斯分类 ... 524
二叉决策树 ... 527
boosting . 537
随机森林 ... 543
人脸识别和 Haar 分类器 ... 549
其他机器学习算法 ... 559
练习 ... ... 560
第 14 章 OpenCV 的未来 ... 564
过去与未来 ... 564
发展方向 ... 565
OpenCV 与艺术家 ... 568
后记 ... ... 570
参考文献 ... 571
索引 ...... ...... 586
关于作者和译者 ... 599
封面图片 ... 601
第 1 章
概述
什么是 OpenCV
OpenCV 是一个开源 ( 参见 http://opensource.org ) 的计算机视觉库 , 项目主页 为 http://SourceForge.net/projects/opencvlibrary。 OpenCV 采用 C/C++ 语言编写,可以运行在 Linux/Windows/Mac 等操作系统上。 OpenCV 还提供了 Python 、 Ruby 、 MATLAB 以及其他语言的接口 。
OpenCV 的设计目标是执行速度尽量快,主要关注实时应用。它采用优化的 C 代码编写,能够充分利用多核处理器的优势。 如果是希望在 Intel 平台上得到更快的处理速度,可以购买 Intel 的 高性能多媒体函数库 IPP(Integrated Performance Primitives) 。 IPP 库包含许多从底层优化的函数,这些函数涵盖多个应用领域 。 如果系统已经安装了 IPP 库, OpenCV 会在运行时自动使用相应的 IPP 库。
OpenCV 的一个目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。 OpenCV 包含的函数有 500 多个,覆盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等。因为计算机视觉和机器学习密切相关,所以 OpenCV 还提供了 MLL ( Machine Learning Library ) 机器学习库。该机器学习库 侧重于 统计 方面的模式识别 和聚类 (clustering) 。 MLL 除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场合。
OpenCV 的应用领域
大多数计算机科学家和程序员已经意识到计算机视觉的重要作用。但是很少有人知道计算机视觉的所有应用。例如,大多数人或多或少地知道计算机视觉可用在监控方面,也知道视觉被越来越多地用在网络图像和视频方面。少数人也了解计算机视觉在游戏界面方面的应用。但是很少有人了解大多数航空和街道地图图像 ( 如 Google 的 Street View) 也大量使用计算机定标和图像拼接技术。一些人知道安全监控、无人飞行器或生物医学分析等方面的应用,但是很少人知道机器视觉是多么广泛地被用在工厂中:差不多所有的大规模制造的产品都在流水线上的某个环节上自动使用视觉检测。 【 1 ~ 2 】
OpenCV 所有的开放源代码协议允许你使用 OpenCV 的全部代码或者 OpenCV 的部分代码生成商业产品。使用了 OpenCV 后,你不必对公众开放自己的源代码或改善后的算法,虽然我们非常希望你能够开放源代码。 许多公司 (IBM , Microsoft , Intel , SONY , Siemens 和 Google 等其他 公司 ) 和研究单位 ( 例如斯坦福大学 、 MIT 、 CMU 、 剑桥 大学和 INRIA) 中的人都广泛使用 OpenCV ,其部分原因是 OpenCV 采用了这个宽松的协议。 Yahoo groups 里有一个 OpenCV 论坛 (http://groups.yahoo.com/group/OpenCV ) , 用户可以在此发帖提问和讨论 ; 该论坛大约有 20 000 个会员。 OpenCV 在全世界广受欢迎,在中国、日本、俄罗斯、欧洲和以色列都有庞大的用户群。
自从 OpenCV 在 1999 年 1 月发布 alpha 版本开始,它就被广泛用在许多应用领域、产品和研究成果中。相关应用包括卫星地图和电子地图的拼接,扫描图像的对齐,医学图像去噪 ( 消噪或滤波 ) ,图像中的物体分析,安全和入侵检测系统,自动监视和安全系统,制造业中的产品质量检测系统,摄像机标定,军事应用,无人飞行器,无人汽车和无人水下机器人。将视觉识别技术用在声谱图上, OpenCV 可以进行声音和音乐识别。在斯坦福大学的 Stanley 机器人项目中, OpenCV 是其视觉系统的关键部分。 Stanley 在 DARPA 机器人沙漠挑战赛中,赢得了二百万美元奖金 [Thrun06] 。
什么是计算机视觉
计算机视觉 [2] 是将来自静止图像或视频的数据转换成一个决策或者一种新的表达方式的过程,所有的这些转换都是为了达到某个目标。输入数据可以包含一些辅助信息,如“摄像机架在汽车上”或“激光扫描仪在 1 米 处发现一个物体”。最终的决策可能是 “ 场景中有一个人 ” 或 “ 在这个切片中有 14 个肿瘤细胞 ” 。一种新的表达方式可以是将一张彩色照片转为灰度照片,或者从图像序列中去除摄像机晃动影响。
因为人类是视觉动物,所以会误以为可以很容易地实现计算机视觉。当你凝视图像时,从中找到一辆汽车会很困难么?你凭直觉会觉得很容易。人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑。你的大脑有一个关注系统,会根据任务识别出图像的重要部分,并做重点分析,而其他部分则分析得较少。在人类视觉流中存在大量的反馈,但是目前我们对之了解甚少。肌肉控制的传感器以及其他所有传感器的输入信息之间存在广泛的关联,这使得大脑可以依赖从出生以来所学到的信息。大脑中的反馈在信息处理的各个阶段都存在,在传感器硬件 ( 眼睛 ) 中也存在。在眼睛中通过反馈来调节通过瞳孔的进光量,以及调节视网膜表面上的接收单元。 【 2 ~ 3 】
在计算机视觉系统中,计算机接接收到的是来自摄像机或者磁盘文件的一个数值矩阵。一般来说,没有内置的模式识别系统,没有自动控制的对焦和光圈,没有多年来经验的积累。视觉系统通常很低级。图 1-1 显示了一辆汽车的图像。在此图中,我们可以看到车的一侧有一个反光镜,而计算机 “ 看 ” 到的只是一个数值的矩阵。矩阵中的每个数值都有很大的噪声成分,所以它仅仅给出很少的信息,这个数值矩阵就是计算机 “ 看 ” 到的全部。我们的任务是将这个具有噪声成分的数值矩阵变成感知:“反光镜”。图 1-2 形象地解释了为什么计算机视觉如此之难。
图 1-1 :对一个计算机来说,汽车的反光镜只是一个数值矩阵
图 1-2 :视觉问题的病态本质:随着视点的变化,物体的二维外观会变化很大
实际上,计算机视觉问题比前面我们提到的更糟糕,它是不可解的。给出三维世界的二维视图,是没有固定方法来重建出三维信息的。在理论上,此类病态问题没有惟一和确定的解。即使数据很完美,同一张二维图像也可以表示多种三维场景。然而,如前面提到的,数据会被噪声和形变影响。这些影响来自真实世界的变化 ( 天气、光线、反射、运动 ) ,镜头和机械结构的不完美,传感器上的长时间感应 ( 运动模糊 ) ,传感器上和其他电子器件上的电子噪声,以及图像采集后的图像压缩引入的变化。有如此多令人头疼的问题,我们如何取得进展? 【 3 ~ 4 】
设计实际系统时,为了克服视觉传感器的限制,通常会使用一些其他的上下文知识。考虑这样一个例子,移动机器人在室内寻找并捡起订书机。机器人可以利用这个先验知识:可在办公室内发现桌子,订书机最可能在桌子上被找到。这给出了一个隐含的尺寸参考或参照,也就是订书机能够放在桌子上。这也可以用于消除在不可能的地方 ( 例如在天花板或者窗户上 ) 错误识别出订书机的可能性。机器人也完全可以忽略一个 200 英尺 大小的跟订书机形状类似的广告飞艇,因为飞艇周围没有桌子的木纹背景。与之相反,在图像检索中,数据库中的所有订书机图像都是对真正的订书机拍摄的,而且尺寸很大和形状不规划的订书机图像一般不可能被拍到。也就是拍摄者一般只拍摄真正的、普通大小的订书机图像。而且人们拍照时一般会将被拍物体置于中心,且将物体放在最能表现其特征的方向上。因此在由人拍摄的图像中,具有相当多的隐含信息。 【 4 ~ 5 】
我们也可以使用机器学习技术对上下文信息进行显式建模。隐含的变量 ( 例如物体大小、重力方向及其他变量 ) 都可以通过标记好的训练数据里的数值来校正。或者,也可以通过其他的传感器来测量隐含的变量。使用激光扫描仪可以精确测量出一个物体的大小。计算机视觉面临的另一个难题是噪声问题。我们一般使用统计的方法来克服噪声。例如,一般来说不可能通过比较一个点和它紧密相邻的点来检测图像里的边缘。但是如果观察一个局部区域的统计特征,边缘检测会变得容易些。由局部区域卷积的响应连成的点串,构成边缘。另外可以通过时间维度上的统计来抑制噪声。还有一些其他的技术,可以从数据中学习显式模型,来解决噪声和畸变问题。例如镜头畸变,可以通过学习一个简单多项式模型的参数来描述这种畸变,然后可以几乎完全校正这种畸变。
计算机视觉拟根据摄像机数据来采取行动或者做出决策,这样的行动或决策是在一个指特定目的或任务的环境中来解决。我们从图像去除噪声和损坏区域,可以让监控系统在有人爬过栅栏时给出报警,或者在一个游乐园里监控系统能够数出总共有多少人通过了某个区域。在办公室巡游的机器人的视觉软件所采用的方法与固定摄像机的不同,因为这两个系统有不同的应用环境和目标。通用的规律是:对计算机视觉应用环境的约束越多,则越能够使用这些约束来简化问题,从而使最终的解决方案越可靠。
OpenCV 的目标是为解决计算机视觉问题提供基本工具。在有些情况下,它提供的高层函数可以高效地解决计算机视觉中的一些很复杂的问题。当没有高层函数时,它提供的基本函数足够为大多数计算机视觉问题创建一个完整的解决方案。对于后者,有几个经过检验且可靠的使用 OpenCV 的方法;所有这些方法都是首先大量使用 OpenCV 函数来解决问题。一旦设计出解决方案的第一个版本,便会了解它的不足,然后可以使用自己的代码和知识来解决 ( 更为广知的一点是“解决实际遇到的问题,而不是你想像出来的问题” ) 。你可以使用第一个版本的解决方案作为一个基准,用之评价解决方案的改进程度。解决方案所存在的不足可以通过系统所用的环境限制来解决。 【 5 ~ 6 】
OpenCV 的起源
OpenCV 诞生于 Intel 研究中心,其目的是为了促进 CPU 密集型应用。为了达到这一目的, Intel 启动了多个项目,包括实时光线追踪和三维显示墙。一个在 Intel 工作的 OpenCV 作者在访问一些大学时,注意到许多顶尖大学中的研究组 ( 如 MIT 媒体实验室 ) 拥有很好的内部使用的开放计算机视觉库—— ( 在学生们之间互相传播的代码 ) ,这会帮助一个新生从高的起点开始他 / 她的计算机视觉研究。这样一个新生可以在以前的基础上继续开始研究,而不用从底层写基本函数。
因此, OpenCV 的目的是开发一个普遍可用的计算机视觉库。在 Intel 的性能库团队的帮助下 [3] , OpenCV 实现了一些核心代码以及算法,并发给 Intel 俄罗斯的库团队。这就是 OpenCV 的诞生之地:在与软件性能库团队的合作下,它开始于 Intel 的研究中心,并在俄罗斯得到实现和优化。
俄罗斯团队的主要负责人是 Vadim Pisarevsky ,他负责管理项目、写代码并优化 OpenCV 的大部分代码,在 OpenCV 中很大一部分功劳都属于他。 跟他一起, Victor Eruhimov 帮助开发了早期的架构, Valery Kuriakin 管理俄罗斯实验室并提供了很大的支持。在开始时, OpenCV 有 以下三大 目标 。
为基本的视觉应用提供开放且优化的源代码,以促进视觉研究的发展。能有效地避免“闭门造车”。
通过提供一个通用的架构来传播视觉知识,开发者可以在这个架构上继续开展工作,所以代码应该是非常易读的且可改写。
本库采用的协议不要求商业产品继续开放代码,这使得可移植的、性能被优化的代码可以自由获取,可以促进基于视觉的商业应用的发展。
这些目标说明了 OpenCV 的缘起。计算机视觉应用的发展会增加对快速处理器的需求。与单独销售软件相比,促进处理器的升级会为 Intel 带来更多收入。这也许是为什么这个开放且免费的库出现在一家硬件生产企业中,而不是在一家软件公司中。从某种程度上说,在一家硬件公司里,在软件方面会有更多创新的空间。 【 6 】
任何开放源代码的努力方面,达到一定的规模使项目自己能够发展是非常重要的。目前 OpenCV 已经有大约二百万的下载量,这个数字仍然在以平均每个月 26 000 的下载量递增。 OpenCV 用户组大约有 20 000 个会员。 OpenCV 吸纳了许多用户的贡献,核心开发工作已经从 Intel 转移到别处[4] 。 OpenCV 过去的开发历程如图 1-3 所示。在发展中, OpenCV 受到网络经济泡沫破裂的影响,也受到无数次管理和发展方向变化的影响。在这些变故中, OpenCV 曾经有多次缺乏 Intel 公司人员的支持。然而,随着多核时代的到来,以及计算机视觉的更多应用的出现, OpenCV 的价值开始提升。现在 OpenCV 在几个研究所中的开发都很活跃,所以不久应该会看到更多的功能出现,如多摄像机标定、深度信息感知、视觉与激光扫描的融合、更好的模式识别算法,同时还会支持机器人视觉的需求。关于 OpenCV 未来的发展,请参考第 14 章。
图 1-3 : OpenCV 发展路线图
用 IPP 给 OpenCV 加速
因为 OpenCV 曾由 Intel 性能基元 (IPP) 团队主持,而且几个主要开发者都与 IPP 团队保持着良好的关系,所以 OpenCV 利用了 IPP 高度手工优化的代码来实现加速。使用 IPP 获得的提速是非常显著的。图 1-4 比较了另外两个视觉库 LTI[LTI] 和 VXL[VXL] 与 OpenCV 以及 IPP 优化的 OpenCV 的性能。请注意,性能是 OpenCV 追求的一个关键目标;它需要实时运行代码的能力。
OpenCV 使用优化了的 C 和 C++ 代码实现。它对 IPP 不存在任何依赖。但如果安装了 IPP ,那么 OpenCV 将会通过自动载入 IPP 动态链接库来获取 IPP 的优势,来提升速度。 【 6 ~ 7 】
图 1-4 :另外两个视觉库 (LTI 和 VXL) 与 OpenCV( 不使用和使用 IPP) 的四个不同性能指标的比较:每个指标的四个柱图分别表示四个库的得分,得分与运行时间成正比;在所有指标中, OpenCV 均优于其他的两个库,且用 IPP 优化的 OpenCV 优于没有使用 IPP 优化的 OpenCV
OpenCV 属于谁
虽然 OpenCV 项目是 Intel 发起的,但这个库一直致力于促进商业和研究使用。它是开放源代码且免费的,无论是商业使用还是科研使用, OpenCV 的代码可用于或者嵌入 ( 整体或部分 ) 其他的应用程序中。它不强迫你开放或者免费发放你的源代码。它也不要求你将改进的部分提交到 OpenCV 库中 —— 但我们希望你能够提交。
下载和安装 OpenCV
OpenCV 项目主页在 SourceForge 网站 http://SourceForge.net/projects/ opencvlibrary, 对应的 Wiki 在 http://opencv.willowgarage.com 。对于 Linux 系统,源代码发布文件为 opencv- 1.0.0 .tar.gz ;对于 Windows 系统,则为 OpenCV_1.0.exe 安装程序。然而, 最新的版本 始终都在 SourceForge 的 SVN 仓库中。
安装
下载 OpenCV 库之后,就可以安装了。 L inux 和 M ac OS 系统的安装细节可以查看 .../ opencv / 目录下的INSTALL 文本文件中的说明。 INSTALL 文件中还描述了如何编译 OpenCV 和 运行 测试程序。对于 OpenCV 开发人员,INSTALL 还列出了 所需的 autoconf 、 automake 、 libtool 和 swig 其他开发工具。 【 8 ~9】
Windows
从 SourceForge 网站下载 OpenCV 安装程序,然后运行安装程序。安装程序将安装 OpenCV ,注册 DirectShow filter ,然后进行一些安装后的处理。 现在你就可以使用 OpenCV 了。 你还可以进入目录.../opencv/_make ,使用 MSVC++ 或者 MSVC.NET 2005 打开 opencv.sln ,或者使用低版本的 MSVC++ 打开opencv.dsw ,然后生成 Debug 版的库,也可以重新生成 Release 版的库 [5] 。
如果需要使用 IPP 的优化功能,首先需要从 Intel 网站 ( http://www.intel.com/soft ware/products/ipp/index.htm) 获得 IPP 并安装;请使用 5.1 或更新的版本。请确认二进制文件路径 ( 例如 c:/program files/intel/ipp/5.1/ia32/bin) 被添加到系统环境变量 PATH 中。现在 OpenCV 就能够自动探测到 IPP ,并在运行时装载 IPP 了 ( 详细信息请参考第 3 章 ) 。
Linux
因为在 Linux 系统的各个发行版 (SuSE , Debian , Ubuntu 等 ) 的 GCC 和 GLIBC 版本并不一样, OpenCV 的 Linux 版本并不包含可直接使用的二进制库。 如果发行版没有提供 OpenCV ,则需要从源代码重新编译 OpenCV ,具体的细节请参考.../opencv/INSTALL 文件。
如果要编译库和演示程序,需要版本为 2.x 或更高版本的 GTK+ 及其头文件。 除此之外还要需要具有开发文件的 pkgconfig , libpng , zlib , libjpeg , libtiff 和 libjasper。同时还要安装版本为 2.3 、 2.4 或 2.5 的 Python 及其头文件 ( 开发包 ) 。同时还需要依赖 ffmpeg 0.4.9 -pre1 或更 高 的版本中libavcodec 和 libav* 系列的库, ffmpeg 的最新版可以用以下命令获取: svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg。
从 http://ffmpeg.mplayerhq.hu/download.html 下载 ffmpeg 库 [6] , ffmpeg 库的授权协议为 GNU 宽通用公共许可证 ( LGPL ) 。 非 GPL 软件 ( 如 OpenCV) 使用 ffmpeg 库, 需要生成和调用共享的 ffmpeg 库 :
$> ./configure --enable-shared
$> make
$> sudo make install
编译完成后会生成以下系列库文件: /usr/local/lib/libavcodec.so.* , /usr/local/lib/libavformat.so.*, /usr/local/lib/libavutil.so.* ,及其对应的头文件 /usr/local/include/libav*。 【9】
下载了 OpenCV 后就 可以编译 OpenCV 了 [7]:
$> ./configure
$> make
$> sudo make install
$> sudo ldconfig
安装 完成后, OpenCV 会被默认安装在以下目录: /usr/local/lib/ 和 /usr/local/include/opencv/。 因此,用户需要将 /usr/local/lib/ 添加到 /etc/ld.so.conf 文件 ( 之后需要执行 ldconfig 命令 ) ,或者将该路径添加到 LD_LIBRARY_PATH 环境变量中。
同样在 Linux 平台也可以用 IPP 给 OpenCV 加速, IPP 的安装细节在前面已经提过。 我们现在假设 IPP 安装在以下路径: /opt/intel/ipp/5.1/ia32/。 修改初始化配置文件, 添加 < your install_path > /bin / 和 < your install_path> /bin/linux32 到 LD_LIBRARY_PATH 环境变量 ( 可以直接编辑 .bashrc 配置文件 ) :
LD_LIBRARY_PATH=/opt/intel/ipp/5.1/ia32/bin:/opt/intel/ipp/5.1/ia32/bin/linux32:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
另一个方法是将 < your install_path >/ bin 和 < your install_path> /bin/linux32 添加到 /etc/ld.so.conf 文件,每个文件占一行,完成后在 root 权限下 ( 也 可以使用 sudo 命令 ) 执行ldconfig 命令。
现在 OpenCV 就可以 找到并能 使用 IPP 的共享库了,具体的细节请参考 /opencv/INSTALL 。
Mac OS X
当写此书的时候,所有的功能都可以在 Mac OS X 下使用,但是仍然有一些限制 ( 如 AVI 文件的写操作 ) ;文件 .../opencv/INSTALL中详细描述了这些限制。
在 Mac OS X 下的编译需求和编译步骤跟 Linux 下类似,但是有如下不同。
默认情况下是使用 Carbon 而不是 GTK+ 。
默认情况下是使用 QuickTime 而不是 ffmpeg 。
pkg-config 是非必需的 ( 它只在脚本 samplels/c/build_all.sh 中用到 )
默认情况下不支持 RPM 和 ldconfig 。使用命令 configure+make+sudo make install 来编译和安装 OpenCV ;如果不是使用 ./configure --prefix=/usr 命令来配置的话,需要更新 DYLD_LIBRARY_PATH 变量。
如果要使用全部功能, 需要使用 darwinports 来安装 libpng 、 libtiff 、 libjpeg 和 libjasper , 然后使它们能够被脚本 ./configure 检测到 ( 详细帮助请运行./ configure --help) 。对于大多数 信息 ,可以参考 OpenCV Wiki ( 网址为 http:// opencv.willowgarage.com/) 和 Mac 相关的页面 ( 网址为 http://opencv.willowgarage. com/Mac_OS_X_OpenCV_Port) 。
通过 SVN 获取最新的 OpenCV 代码
OpenCV 是一个相对活跃的开发项目,如果提交了 bug 的详细描述以及出错的代码,该 bug 会被很快修复。然而, OpenCV 一般一年才会发布一个或两个官方版本。如果用 OpenCV 开发比较重要的应用,你可能想获得修复了最新 bug 的最新 OpenCV 代码。 如果要获取 OpenCV 的最新代码,需要通过 SourceForge 网站上的 OpenCV 库的 SVN(Subversion) 获得。 【 10 ~ 11 】
这里并不是一个 SVN 的完整教程。如果你 参与过其他的开源项目,也许很熟悉 SVN 。 如果不了解 SVN , 可以参考 Ben Collins-Sussman 等人 所著 的Version Control with Subversion (O’Reilly 出版 ) 。 SVN 的命令行客户端一般被打包在 Linux 、 OS X 和 大部分 类 UNIX 系统中。对于 Windows 系统的用户,可以选择 TortoiseSVN(http://tortoisesvn.tigris.org/ ) 客户端,很多命令被集成到 Windows 资源管理器的右键菜单中,使用很方便。
对于 Windows 用户,可使用 TortoiseSVN 检出最新源代码,检出地址为 https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk。
对于 Linux 用户,可以使用如下命令检出最新源代码:
svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk
更多 OpenCV 文档
OpenCV 的主要文档是 随源 代码一起发布的 HTML 帮助文件。除此之外, 网上的 参考 文档还有 OpenCV Wiki 网站和以前的 HTML 帮助。
HTML 帮助 文档
安装 OpenCV 后,在 .../opencv/docs 子目录中有相应的 HTML 格式的 帮助文件,打开 index.htm 文件, 其中 包含以下链接。
CXCORE
包含数据结构、矩阵运算、数据变换、对象持久 (object persistence) 、内存管理、错误处理、动态装载、绘图、文本和基本的数学功能等。
CV
包含图像处理、图像结构分析、运动描述和跟踪、模式识别和摄像机标定。
Machine Learning (ML)
包含许多聚类、分类和数据分析函数。
HighGUI
包含图形用户界面和图像 / 视频的读 / 写。
CVCAM
摄像机接口,在 OpenCV 1.0 以后的版本中被移除。
Haartraining
如何训练 boosted 级联物体分类器。文档在文件 .../opencv/apps/HaarTraining/ doc/haartraining.htm 中。
目录 .../opencv/docs 中还有一个 IPLMAN.pdf 文件,它是 OpenCV 的早期文档。这个文档已经过时,阅读时一定要注意。但是这个文档中详细描述了一些算法以及某些算法中应该使用何种类型的图像。 当然,本书是详细描述这些图像和算法的 最佳参考资料。
Wiki 帮助 文档
OpenCV 的文档 Wiki 所包含的内容比 OpenCV 安装文件自带的 HTML 帮助 更新 ,并包含自带文档没有的一些内容。 Wiki 网址为 http://opencv.willowgarage.com , 它包含以下 内容 :
Ø 用 Eclipse 集成开发环境编译 OpenCV 的帮助
Ø 使用 OpenCV 进行人脸识别
Ø 视频监控
Ø 使用向导
Ø 摄像机支持
Ø 中文和韩文网站链接
另外一个 Wiki 地址为 http://opencv.willowgarage.com/wiki/CvAux , 是下一节“ OpenCV 架构和内容 ” 提到的辅助函数的惟一文档。 CvAux 模块包含以下信息:
Ø 双目匹配
Ø 多摄像机情况下的视点渐变
Ø 立体视觉中的三维跟踪
Ø 用于物体识别的 PCA 方法
Ø 嵌入隐马尔可夫模型 (HMM)
Ø OpenCV 中文的 Wiki 地址为 http://www.opencv.org.cn/ 。
Ø 刚才提到的帮助文档并没有解释下面的问题:
Ø 哪些类型 ( 浮点、整数、单字节; 1-3 通道 ) 的图像适用于某个函数?
Ø 哪些函数可以以 in place 模式 ( 输入和输出使用同一个图像结构 ) 调用?
Ø 一些复杂函数的调用细节 ( 如 contours) ?
Ø 目录 …/opencv/samples/c/ 中各个例子的运行细节?
Ø 为什么要这样使用函数,而不仅仅是如何使用?
Ø 怎么样设置某些函数的参数?
本书 的 目的是 解答上述 问题。
OpenCV 的结 构和内容
OpenCV 主体分为五个模块,其中四个模块如图 1-5 所示。 OpenCV 的 CV 模块包含基本的图像处理函数和高级的计算机视觉算法。 ML 是机器学习库,包含一些基于统计的分类和聚类工具。 HighGUI 包含图像和视频输入 / 输出的函数。 CXCore 包含 OpenCV 的一些基本 数据 结构和 相关 函数。
图 1-5 : OpenCV 的基本结构
图 1-5 中并没有包含 CvAux 模块,该模块中一般存放一些即将被淘汰的算法和函数 ( 如基于嵌入式隐马尔可夫模型的人脸识别算法 ) ,同时还有一些新出现的实验性的算法和函数 ( 如背景和前景的分割 ) 。 CvAux 在 Wiki 中并没有很完整的文档,而 在.../opencv/docs 子目录下的 CvAux 文档 也 不是很完整。 CvAux 包含以下一些内容 。
特征物体,它是一个模式识别领域里用于降低计算量的方法,本质上,依然是模板匹配。
一维和二维隐马尔可夫模型 (HMM) ,它是一个基于统计的识别方法,用动态规划来求解。
嵌入式 HMM( 一个父 HMM 的观测量本身也符合 HMM)
通过立体视觉来实现的动作识别
Delaunay 三角划分、序列等方法的扩展
立体视觉
基于轮廓线的形状匹配
纹理描述
眼睛和嘴跟踪
3D 跟踪
寻找场景中的物体的骨架 ( 中心线 )
通过两个不同视角的图像合成中间图像
前景 / 背景分割
视频监控 ( 请参考 Wiki 的 FAQ 获得更多资料 )
摄像机标定的 C++ 类 (C 函数和引擎已经在 CV 模块中 )
未来一些特性可能被合并到 CV 模块,还有一些可能永远留在 CvAux 中。
【 13 ~ 14 】
移植性
OpenCV 被设计为可移植的库。它的代码可以用 Borland C++, MS VC++, Intel 等编译器编译。 为了使得跨平台更容易实现, C/C++ 代码必须按照通用的标准来编写。图 1-6 显示了目前已知的可以运行 OpenCV 在各种系统平台。 基于 32 位 Intel 架构 ( IA32 ) 的 Windows 系统支持最好,然后是 IA32 架构 的 L inux 平台。 对于 Mac OS X 平台的支持,只有在 Apple 采用 Intel 处理器后才提上议程。 ( 在 OS X 平台 上的移植 目前还 不像 Windows 和 Linux 平台上一样成熟 ,但是已在快速完善中 。 ) 成熟度次之的是在扩展内存上 64 位 (EM64T) 和 64 位 Intel 架构 (IA64) 。最不成熟的是 Sun 的硬件和其他操作系统。
图 1-6 : OpenCV 1.0 移植指南
如果某个 CPU 架构或操作系统没有出现在图 1-6 中,并不意味着在那上面不能使用 OpenCV 。 OpenCV 几乎可用于所有的商业系统,从 PowerPC Mac 到机器狗。 OpenCV 同样可以很好的运行在 AMD 处理器上, IPP 也会采用 AMD 处理器里的多媒体扩展技术 (MMX 等 ) 技术进行加速。 【 14 ~ 15 】
练习
1. 下载并安装最新的 OpenCV 版本,然后分别在 debug 和 release 模式下编译 OpenCV 。
2. 通过 SVN 下载 OpenCV 的最新代码,然后编译。
3. 在三维信息转换为二维表示时,存在一些有歧义的描述,请描述至少三个歧义描述,并提供克服这些问题的方法。
[1] 深入数学细节的部分都有一个提示,指出一般读者可以直接跳过此部分内容。
[2] 计算机视觉是一个很广的领域,本书只涉及该领域的一些基本知识。我们推荐的参考书有 Trucco 的教科书 [Trucco98]( 了解计算机视觉 ) 、 Forsyth 的教科书 [Forsyth03]( 全面参考 ) 以及 Hartley 的教科书 [Hartley06] 和 Faugeras 的教科书 [Faugeras93]( 了解三维视觉的工作原理 ) 。
[3] Shinn Lee( 李信弘 ) 提供了主要的帮助。
[4] 撰写此书时,一个机器人研究所和孵化器 Willow Garage [WG] (www.willowgarage.com ) 开始积极支持日常的 OpenCV 维护以及在机器人应用领域的开发。
[5] 注意, Windows 版本的 OpenCV 只包含 release 版的库,并不包含 debug 版的库。如果要在 debug 模式下使用 OpenCV ,则需要自己重新编译 debug 模式的 OpenCV 库。
[6] 可以用以下命令获取 ffmpeg : svn checkout svn://svn.mplayerhq.hu/ff mpeg/trunk ffmpeg 。
[7] 可以用 Red Hat的包管理工具 (RPMs)编译 OpenCV, 编译命令为rpmbuild -ta OpenCV-x.y.z.tar.gz (4.X以上的 rpm)或 rpm -ta OpenCV-x.y.z.tar.gz(早期版本的 rpm), OpenCV-x.y.z.tar.gz 应该 放在 /usr/src/redhat/SOURCES/ 目录或其他 类似的目录中。然后使用rpm -i OpenCV-x.y.z.*.rpm 命令安装 OpenCV 。