写在前面的一些话:《Learning OpenCV》中文版 .

 2009-09-17 15:51

 

<!-- /* 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;} -->php

重点指数: (重点-畅销)html

基本信息 linux

书名: 学习 OpenCV (中文版) 程序员

著译者: ( 美 )Gary Bradski   Adrian Kaehler 著   于仕琪   刘瑞祯 译 web

I SBN : 978-7-302-20993-5算法

责编:                               订价: 75 元   数据库

出版日期: 2009 年 9 月                       版次: 1 版 1 次编程

编目分类: TPapi

读者定位: 信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等专业人员安全

开本: 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 看到全部贡献者 。

感谢对 OpenCV 提供帮助的全部人士

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 的早期支持、大量的编辑工做以及长时间里一直具备的激情。

Gary 谢辞

家里有三个年幼的孩子,个人妻子 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 。

Adrian 谢辞

我最初的学习专业是理论物理,而后是超级计算机设计和数字计算,最后到机器学习和计算机视觉,这是一条很长的经历曲线。在这条学习之路中,不少人给了我巨大的帮助。有许多优秀的教师帮助我,有些是正式的导师,其余的是非正式的指路人。我要特别指出加州大学圣克鲁兹分校的 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 。

 

<!-- /* 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 看到全部贡献者 。

感谢对 OpenCV 提供帮助的全部人士

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 的早期支持、大量的编辑工做以及长时间里一直具备的激情。

Gary 谢辞

家里有三个年幼的孩子,个人妻子 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 。

Adrian 谢辞

我最初的学习专业是理论物理,而后是超级计算机设计和数字计算,最后到机器学习和计算机视觉,这是一条很长的经历曲线。在这条学习之路中,不少人给了我巨大的帮助。有许多优秀的教师帮助我,有些是正式的导师,其余的是非正式的指路人。我要特别指出加州大学圣克鲁兹分校的 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 。

相关文章
相关标签/搜索