寫在前面的一些話:《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 。

相關文章
相關標籤/搜索