寫在前面的一些話:《Learning OpenCV》中文版 .

2009-09-17 15:51 7578人閱讀 評論(4) 收藏 舉報

?

<!-- /* 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 。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/454874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454874.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

獨家 | 一文讀懂自然語言處理NLP(附學習資料)

前言 自然語言處理是文本挖掘的研究領域之一&#xff0c;是人工智能和語言學領域的分支學科。在此領域中探討如何處理及運用自然語言。 對于自然語言處理的發展歷程&#xff0c;可以從哲學中的經驗主義和理性主義說起。基于統計的自然語言處理是哲學中的經驗主義&#xff0c;基…

python mock測試_使用mock測試python中的函數

對于測試覆蓋&#xff0c;我想測試文件signalC中該函數的異常塊&#xff1a;class SignalC:def readSignal(self, a):try:with open(os.path.join(self.newSubFolder, "my file" .csv), a) as csvfile:writer csv.writer(csvfile, delimiter,, quotechar|,quotingc…

如何更好閱讀源代碼 .

寫在前面的話&#xff1a;    自從我在linuxaid.com.cn上發表一些文章開始&#xff0c;就不斷的有網友發來電子郵件&#xff0c;或者是就其中某些問題進行探討&#xff0c;或者是查詢其他文章的地址&#xff08;往往這些網友看的是其他網站轉載的我的文章&#xff09;&#x…

wins系統flask綁定mysql_flask如何連接mssql,網上大多是sqlite和mysql教程?

這個居然也冒出來&#xff0c;刨墳了。我們不喜歡寫原生SQL語句&#xff0c;那個寫著費勁&#xff0c;日常開發時候&#xff0c;我們怎么CRUD數據庫呢&#xff1f;一般使用ORM&#xff0c;對象關系映射(英語&#xff1a;Object Relational Mapping&#xff0c;簡稱ORM)。主力使…

hdu 6086 -- Rikka with String(AC自動機 + 狀壓DP)

題目鏈接 Problem DescriptionAs we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:Yuta has n 01 strings si, and he wants to know the number of 01 antisymmetric strings …

課堂動手動腦問題

對于隨機數&#xff0c;java通過Math.random&#xff08;&#xff09;來實現&#xff0c;比如要得到一個隨機數我們可以int a&#xff1b; a&#xff08;int&#xff09;Math.random();但對于隨機數&#xff0c;它是從0到1之間的數&#xff0c;所以必須通過int把它轉為整數&…

GNU/Linux下有多少是GNU的?

導讀&#xff1a;一個葡萄牙的學生寫了一篇文章 《How much GNU is there in GNU/Linux?》由酷殼網的陳皓整理編譯為《GNU/Linux下有多少是GNU的》。這篇文章主要分布了今年4月份的Ubuntu Natty的Linux分發包。其主要是用代碼行來做的分析&#xff0c;用兩個餅圖對比分析。 內…

便攜式三星mysql_JDBC鏈接mysql - 三星藍

package chp07;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;public classJDBC_Test {//創建靜態全局變量staticConnection conn;staticStatement st;public static voidmain(Stri…

C++ 類、對象、class

一、對象初始化 1.不能在類聲明中對數據成員初始化&#xff0c;因為類只是一個抽象類型&#xff0c;不占存儲空間&#xff0c;無處容納數據。 2.若某類的數據成員都是public&#xff0c;則可以像結構體一樣初始化&#xff0c;如 Time t{12,21,04}&#xff1b; 若數據成員有priv…

Unity 富文本

參考鏈接&#xff1a;http://www.ceeger.com/Manual/StyledText.html 首先要說的是不僅僅ugui的text組件支持富文本&#xff0c;Debug.Log也是支持的 Debug.Log("<color#ffff00ff><b>愛生活</b></color> <color#00ffffff><b> 愛海瀾&…

Web項目替換jar包中的文件的方法

經常遇到這樣的問題&#xff0c;需要修改jar包中的方法。應該如何做&#xff1f; 1、有些很人性化的框架jar包&#xff0c;比如SpringSecurity&#xff0c;可以修改配置文件指定一個新建的類&#xff0c;讓類實現Jar包中的對應的接口就好了。 2、大部分的jar包都不會有這么方便…

程序員技術練級攻略

導讀&#xff1a;本文是由陳皓和他的一位朋友Mailper合作完成&#xff0c;原名叫《Build Your Programming Technical Skills》&#xff0c;本文分享了Mailper和作者個人的學習經歷。每個程序員都希望自己能順利的升級到高的層次&#xff0c;您不妨按照下面的方法去做。 前言 你…

Linux shell 之 提取文件名和目錄名的一些方法

很多時候在使用Linux的shell時&#xff0c;我們都需要對文件名或目錄名進行處理&#xff0c;通常的操作是由路徑中提取出文件名&#xff0c;從路徑中提取出目錄名&#xff0c;提取文件后綴名等等。例如&#xff0c;從路徑/dir1/dir2/file.txt中提取也文件名file.txt&#xff0c…

bzoj 2752: [HAOI2012]高速公路(road)

Description Y901高速公路是一條重要的交通紐帶&#xff0c;政府部門建設初期的投入以及使用期間的養護費用都不低&#xff0c;因此政府在這條高速公路上設立了許多收費站。Y901高速公路是一條由N-1段路以及N個收費站組成的東西向的鏈&#xff0c;我們按照由西向東的順序將收費…

搭建DNS主、從服務實驗

此次我們的口號是&#xff1a;簡單、有趣上手DNS服務博主是一個言出必行de好人&#xff0c;&#xff08;正經臉&#xff09;上次轉載了有關DNS的基礎介紹&#xff0c;此次我們來通過實驗搭建DNS服務器從而更好的了解DNS搭建過程如何開始&#xff0c;且聽我細細道來首先我們通常…

GDB中應該知道的幾個調試方法

七、八年前寫過一篇《用GDB調試程序》&#xff0c;于是&#xff0c;從那以后&#xff0c;很多朋友在MSN上以及給我發郵件詢問我關于GDB的問題&#xff0c;一直到今天&#xff0c;還有人在問GDB的相關問題。這么多年來&#xff0c;有一些問題是大家反復在問的&#xff0c;一方面…

長沙java技術_長沙如何提高自身的Java技術

長沙如何提高自身的Java技術&#xff1f;Java自發行二十多年來&#xff0c;一直都是開發者的寵兒&#xff0c;在編程界的位置一直十分穩固。雖然Java人才需求量大&#xff0c;薪資水平高&#xff0c;但想要用Java語言勝任企業工作不容易。比如要成為一名Java架構師&#xff0c;…

strcpy與strcat函數原型

1.strcpy函數原型 char *my_strcpy(char *dest,const char *src) //const使在函數中不能修改*src其原先的值{   char *strDest dest; //保存原始的strDest   assert((dest!NULL)&&(src!NULL)); //檢驗參數&#xff0c;…

CCF 201312-4 有趣的數

試題編號&#xff1a;201312-4試題名稱&#xff1a;有趣的數時間限制&#xff1a;1.0s內存限制&#xff1a;256.0MB問題描述&#xff1a; 問題描述我們把一個數稱為有趣的&#xff0c;當且僅當&#xff1a;1. 它的數字只包含0, 1, 2, 3&#xff0c;且這四個數字都出現過至少一次…

java 代碼重用_Java 代碼重用:功能與上下文重用

我幾乎不需要討論為什么重用代碼是有利的。代碼重用通常使得程序開發更加快速&#xff0c;并使得 BUG 減少。一旦一段代碼被封裝和重用&#xff0c;那么只需要檢查很少的一段代碼即可確保程序的正確性。如果在整個應用程序中只需要在一個地方打開和關閉數據庫連接&#xff0c;那…