1. 程式人生 > >寫在前面的一些話 Learning OpenCV 中文版

寫在前面的一些話 Learning 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 BradskiSenior Scientist, Willow GarageConsulting Professor, Stanford University , CS Dept.[email protected] 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. ( 在我看來,幾乎人人都可以像蜘蛛那樣,從體內吐出絲來結成自己的空中堡壘。她開始工作時,只憑藉著樹葉和樹枝的幾個尖兒,然後來回兜轉,最後竟使空中佈滿了美麗迂迴的路線。”希望我們也能借助於簡單的“樹葉和樹枝的幾個尖兒”,構築起自己的城堡,計算機相關領域的城堡,共同共享自己微薄的力量。作為這一戰線上的盟友,我們期待著您的任何意見和建議,電子郵箱 [email protected] 期待著您與我們分享這個旅程中的點點滴滴!

清華大學出版社 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 至:          [email protected]

希望獲得關於本書、會議、資源中心和 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 多個,覆蓋了計算機視覺的許多應用領域,如工廠產品檢測、醫學成像、資訊保安、使用者介面、攝像機標定、立體視覺和機器人等。因