內(nèi)容簡介
計算機視覺是在圖像處理的基礎(chǔ)上發(fā)展起來的新興學(xué)科。OpenCV是一個開源的計算機視覺庫,是英特爾公司資助的兩大圖像處理利器之一。它為圖像處理、模式識別、三維重建、物體跟蹤、機器學(xué)習(xí)和線性代數(shù)提供了各種各樣的算法。
《學(xué)習(xí)OpenCV 3(中文版)》由OpenCV發(fā)起人所寫,站在一線開發(fā)人員的角度用通俗易懂的語言解釋了OpenCV的緣起和計算機視覺基礎(chǔ)結(jié)構(gòu),演示了如何用OpenCV和現(xiàn)有的自由代碼為各種各樣的機器進行編程,這些都有助于讀者迅速入門并漸入佳境,興趣盎然地深入探索計算機視覺領(lǐng)域。
《學(xué)習(xí)OpenCV 3(中文版)》可作為信息處理、計算機、機器人、人工智能、遙感圖像處理、認知神經(jīng)科學(xué)等有關(guān)專業(yè)的高年級學(xué)生或研究生的教學(xué)用書,也可供相關(guān)領(lǐng)域的研究工作者參考。
前言
這本書提供了C++開源計算機視覺庫(OpenCV)3.0版本的工作指南,介紹了計算機視覺相關(guān)領(lǐng)域的通用背景,以便讀者更有效地使用OpenCV。
本書的目標
計算機視覺在以下四個趨勢的引導(dǎo)下,已經(jīng)成為一個快速發(fā)展的領(lǐng)域:
• 智能手機的出現(xiàn)讓數(shù)以百萬計的用戶都擁有了相機
• 互聯(lián)網(wǎng)和搜索引擎聚集了海量的圖像和視頻數(shù)據(jù)
• 計算資源變成一種廉價的商品
• 視覺算法發(fā)展得更加成熟(由于深度神經(jīng)網(wǎng)絡(luò)的出現(xiàn),OpenCV也正在逐漸支持這方面技術(shù),詳情可以參考opencv_contrib中的dnn)
OpenCV通過幫助成千上萬的視覺工作者去做更多富有創(chuàng)造性的工作,在圖像處理領(lǐng)域扮演著重要的角色。由于OpenCV 3.x的存在,不管你是學(xué)生還是研究人員,是專家還是初學(xué)者,都可以快速建立應(yīng)用,并且在OpenCV所提供的基于C++的多平臺視覺基礎(chǔ)架構(gòu)上實現(xiàn)一個跨越性的發(fā)展。
本書的目標如下:
• 通過詳細講述函數(shù)的慣用用法以及正確用法,成為一本更好的OpenCV經(jīng)典參考文檔
• 幫助讀者對各種計算機視覺算法的工作原理有一個基礎(chǔ)的理解
• 培養(yǎng)讀者,使其知道什么算法工具可以使用并且應(yīng)該在什么時候使用
• 提供給讀者許多有效的代碼,提升其應(yīng)用計算機視覺和機器學(xué)習(xí)算法的開發(fā)效率
• 針對問題代碼給讀者提供建議,教讀者如何解決一些簡單或復(fù)雜的問題
本書的寫作方式是力求幫助讀者快速在計算機視覺領(lǐng)域做一些有意思的事情,因此直觀地解釋了算法是如何工作的,可以指導(dǎo)讀者設(shè)計和調(diào)試計算機視覺程序,還能夠使計算機視覺和機器學(xué)習(xí)算法的形式化描述更容易理解和記憶。
本書受眾
本書包含描述、工作代碼示例和OpenCV 3.x庫中包含的C++計算機視覺工具說明。因此,本書對各種不同類型的用戶都有所幫助。
專業(yè)人士和開發(fā)者
對于需要快速設(shè)計原型或?qū)崿F(xiàn)專業(yè)計算機視覺系統(tǒng)的專家而言,示例代碼提供的框架可以幫助他們在此基礎(chǔ)上進行快速開發(fā)。我們對算法的描述可以快速教會或者提醒讀者如何使用它們。由于OpenCV 3.x的設(shè)計基于位于硬件加速層(HAL)之上,所以它所實現(xiàn)的算法都可以高效運行,并且能夠無縫應(yīng)用各種硬件平臺的諸多加速特性。
學(xué)生
這是我們希望能廣泛應(yīng)用于學(xué)校的教程。直觀的解釋、詳細的文檔以及示例代碼將能夠幫助你在計算機視覺之路上更快地前進,做更有趣的項目,最終為這個領(lǐng)域開拓新的研究方向。
教師
計算機視覺是一個快速發(fā)展的領(lǐng)域。我們發(fā)現(xiàn),讓學(xué)生快速瀏覽容易讀的文章并且教師在必要的地方進行說明,再輔之以現(xiàn)階段的論文或講座,是一種非常高效的授課方法。與此同時,學(xué)生可以提前開始課程設(shè)計,并嘗試做一些更有挑戰(zhàn)性的任務(wù)。
愛好者
計算機視覺超有趣的,讓我們一起深入探索它吧。
我們致力于為讀者提供豐富的指導(dǎo)、文檔以及代碼來快速建立實時的視覺應(yīng)用。
本書不是什么
這本書不是正式的論文,我們的確在很多地方討論了數(shù)學(xué)上的細節(jié)注1,但這都是為了建立一種基于此的更深層次的直覺以及闡明算法中所構(gòu)建的假設(shè)之含義。在這里,我們沒有嘗試進行一些更加正式的數(shù)學(xué)解釋,因為過多的數(shù)學(xué)解釋可能會使一些人覺得枯燥。
這本書本質(zhì)上來說更偏向于“應(yīng)用”,它將作為一個基礎(chǔ)的幫助,但是并不著力于介紹某個具體的計算機視覺領(lǐng)域分類(比如醫(yī)學(xué)圖像或者遙感圖像分析)。
也就是說,我們相信通過閱讀這里的解釋,學(xué)生不僅能更好地學(xué)習(xí)理論,而且還能記住更多、更久。因此,這本書將是一個很好的理論課程的輔助教材,并且很適合入門課程或以項目為中心的課程使用。
本書例程
本書所有例程都基于OpenCV 3.x。這些代碼在Linux,Windows 以及 OS X都可以運行。OpenCV也有充足的對安卓和IOS 的支持。本書所有代碼都可以在本書網(wǎng)站(http://bit.ly/learningOpenCV3)獲取,OpenCV的源碼可以在GitHub(https://github.com/opencv/opencv)獲取,OpenCV的預(yù)編譯版本可以在SourceFroge(https://sourceforge.net/projects/opencvlibrary/)獲取。
Op e nCV現(xiàn)在也處于開發(fā)過程中,每個季度都有新的官方版本發(fā)布。如果希望得到最新版本,可以從前述的GitHub網(wǎng)站得到代碼更新。OpenCV的官方網(wǎng)站是http://opencv.org,如果是開發(fā)人員,還可以瀏覽它的維基頁面:https://github.com/opencv/opencv/wiki。
預(yù)備知識
在大多數(shù)情況下,讀者只需要了解如何使用C++編程。本書許多數(shù)學(xué)相關(guān)的段落都不是必須的并且也做出了相應(yīng)的標記。本書需要的數(shù)學(xué)基礎(chǔ)包括簡單的線性代數(shù)以及基礎(chǔ)矩陣運算,并且假設(shè)讀者了解最小二乘優(yōu)化、高斯分布的基礎(chǔ)知識、貝葉斯法則以及一些簡單方程的衍生和變化。
本書對數(shù)學(xué)的介紹是為了支持建立一種對算法的直覺。讀者可以跳過數(shù)學(xué)部分以及算法描述部分,只閱讀函數(shù)解釋以及代碼示例,也可以構(gòu)建視覺應(yīng)用并且使其正常工作。
如何使用本書
本書并不一定要按照章節(jié)順序閱讀,它可以作為一本用戶手冊:需要的時候,可以用來查詢函數(shù),如果你希望了解它的工作原理,請閱讀該函數(shù)相關(guān)的描述。本書的意圖在于提供一本指南。它提供對計算機視覺的基本理解以及如何在何時使用選擇的算法。
本書的寫作目的是作為計算機視覺的本科或研究生課程的輔助教材或教科書。采取的基本策略是先讓學(xué)生能夠快速閱讀課本,然后在其他教科書或者文章中用更正式的章節(jié)進行補充閱讀。每一章最后都配有練習(xí)題,可以幫助測試學(xué)生對知識的掌握程度并培養(yǎng)更多圖像處理方面的意識。
可以采用如下任意一種方法來閱讀本書。
抓取重點
先閱讀第1~5章,之后只閱讀你所需要的章節(jié)。除了第18章和第19章(涵蓋了相機校正和雙目視覺)以及第20章~第22章(涵蓋機器學(xué)習(xí)),這本書并不需要按照章節(jié)順序閱讀。以項目為導(dǎo)向的學(xué)生和研發(fā)人員可以用這種方式閱讀。
精讀
堅持每周閱讀兩章,這樣你就可以在11周之內(nèi)讀完第1章~第22章(第23章很短)。從項目開始,深入到具體研究領(lǐng)域,適當(dāng)?shù)厥褂妙~外的文獻和論文作為補充。
速成
在可以理解的基礎(chǔ)上盡可能快地瀏覽本書,閱讀第1章~第23章,之后開始項目,并使用相關(guān)文獻和論文在某一個領(lǐng)域進行更深入的研究。這也許是專業(yè)人員的一個選擇,但也可能適合更高級的計算機視覺課程。
第20章對機器學(xué)習(xí)進行了簡要的介紹,在此之后的第21章和第22章將對機器學(xué)習(xí)算法及其在OpenCV中的實現(xiàn)和實戰(zhàn)進行更詳細的解釋。當(dāng)然,機器學(xué)習(xí)是目標識別以及計算機視覺的重要組成部分,相關(guān)知識非常豐富以至于可以獨立成書。專業(yè)人員會發(fā)現(xiàn)這本書是進一步探索的一個合適的起點,或者也可以僅僅對這一部分的OpenCV代碼進行深入研究。在OpenCV 3.x中,機器學(xué)習(xí)的接口已經(jīng)大大簡化和統(tǒng)一。
我們喜歡的計算機視覺教學(xué)方式是,在學(xué)生基本能夠理解算法工作原理的基礎(chǔ)上盡可能快速展開教學(xué),然后讓他們進一步加深理解,進而開始學(xué)習(xí)有意義的課程設(shè)計,同時通過相關(guān)領(lǐng)域的文獻和論文讓學(xué)生對所選擇的領(lǐng)域擁有更深刻和系統(tǒng)的認識。這種方法適用于半學(xué)期、一學(xué)期以及兩學(xué)期的課程。學(xué)生可以快速開始,在對視覺項目僅僅有一般認識的時候就開始編碼,等到進行更富挑戰(zhàn)性和更耗時的工作的時候,指導(dǎo)教師可以提供適當(dāng)?shù)膸椭?/p>
而對于計劃時間更長的課程來說,OpenCV項目本身就可以成為項目管理的指導(dǎo)。先建立工作系統(tǒng),然后用更多的知識、細節(jié)和研究進一步加以完善。這類課程的目的是讓每個項目都有一個值得自己發(fā)表的地方并且其中一些真的能夠發(fā)展壯大起來。
3.x的代碼框架,Buildbots、GitHub的使用,pull request,單元測試和回歸測試,文檔,這些對商業(yè)軟件架構(gòu)來說都是很好的示例,值得參考。
本書約定
本書中使用下列約定。
斜體(Italic)
指示新的術(shù)語、URL、電子郵件地址、文件名、拓展名、路徑名、文件夾和Unix工具。
固定寬度(Constant Width)
指示指令、選項、選擇、變量、屬性、鍵、函數(shù)、類型、類、命名空間、方法、模塊、參數(shù)、值、對象、時間、事件句柄、XML標記、HTML標記、文件的內(nèi)容或者指令的輸出。
加粗固定寬度(Constant width bold)
指示指令以及其他應(yīng)該由用戶輸入的文本。也用來著重顯示代碼片段。
斜體固定寬度(Constant Width Italic)
指示應(yīng)當(dāng)由用戶提供的值取代的文本。
[…]
指示參考目錄的引用。
這個標識表示建議或者一般性的筆記。
這個標識表示警告或需要注意的地方。
使用代碼例程
補充材料(代碼例程和練習(xí)等)都可以在https://github.com/oreillymedia/Learning-OpenCV-3_examples下載。
OpenCV不管是對于商業(yè)還是學(xué)術(shù)使用都是免費的,本書的代碼我們也使用了相同的許可。不管是作為作業(yè)、研究還是商業(yè)產(chǎn)品,都可以使用。我們會非常感謝你在自己的文章中引用這本書,不過這不是必須的。引用通常包含標題、作者、出版商以及ISBN。
比如:“Learning OpenCV 3 by Adrian Kaehler and Gary Bradski (O’Reilly)。Copyright 2017 Adrian Kaehler, Gary Bradski, 978-1-491-93799-0。”
除了了解如何幫助你完成你的作業(yè)(最好保密),我們很樂意聽到你將計算機視覺用于學(xué)術(shù)研究或者課堂教學(xué)以及使用OpenCV來幫助你開發(fā)商業(yè)產(chǎn)品。同樣,這不是必須的,我們始終歡迎你們的來信。
O’Reilly Safari
Safari是企業(yè)、政府、教育工作者和個人的會員制培訓(xùn)平臺。該平臺的成員可以獲取上千種圖書、培訓(xùn)視頻、學(xué)習(xí)路線、交互教程以及來自超過250個出版商的播放列表,包括O’Reilly Media,Harvard Business Review,Prentice Hall Professional,Addison-Wesley Professional,Microsoft Press,Sams,Que,Peachpit Press,Adobe,F(xiàn)ocal Press,Cisco Press,John Wiley & Sons,Syngress,Morgan Kaufmann,IBM Redbooks,Packt,Adobe Press,F(xiàn)T Press,Apress,Manning,New Riders,McGraw-Hill,Jones & Bartlett,Course Technology以及其他一些出版商。
更多信息請訪問http://oreilly.com/safari。
聯(lián)系方式
請把你對本書的意見和疑問發(fā)給出版社:
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(北京)有限公司
我們還有一個服務(wù)于本書的網(wǎng)站。那里有示例的列表以及未來版本的計劃。點擊http://bit.ly/learningOpenCV3了解這些信息。
評論或是詢問這本書技術(shù)相關(guān)的問題,請發(fā)送郵件到bookquestions@oreilly.com。
關(guān)于本書、課程、會議以及新聞更多信息,請訪問我們的網(wǎng)站:http://www.oreilly.com在FaceBook上找到我們:http://facebook.com/oreilly在Twitter上關(guān)注我們:http://twitter.com/oreillymedia
在YouTube上觀看我們:http://www.youtube.com/oreillymedia
致謝
一個長期的開源項目通常經(jīng)歷很多人的加入和離開。每個人都從不同方面做出了貢獻。這個庫的貢獻列表已經(jīng)太長而不適合在這里展示,但是可以訪問與OpenCV綁定的文檔/opencv/docs/HTML/Contributors/doc_contributors.html,查看貢獻列表。
感謝對OpenCV的幫助
英特爾是OpenCV誕生的地方,感謝英特爾在這個庫發(fā)起和成長的過程中所做出的巨大支持。時光荏苒,英特爾始終在為OpenCV籌備競賽并做出貢獻。英特爾還捐贈了內(nèi)置的性能原語代碼,為英特爾的架構(gòu)提供了無縫加速。感謝英特爾所做的這一切。
谷歌一直是Op e nCV開發(fā)者的穩(wěn)定資助者,它為谷歌編程之夏(Go o g l e Summe r o f Code,GSoC)項目的Opencv實習(xí)生提供了贊助。這場活動貢獻了許多杰出的工作成果。柳樹車庫(Willow Garage)公司提供了資金,致力于將OpenCV 2.0版本提升到3.0版本成果。在這些日子里,計算機視覺公司Itseez(最近被英特爾收購)提供了大量的工程師支持并承擔(dān)了網(wǎng)站維護工作。英特爾已經(jīng)表示繼續(xù)支持維護網(wǎng)站(謝謝)。
在軟件層面,特別需要感謝一些機構(gòu)和個人,尤其是(英特爾)俄羅斯的軟件團隊。其中最主要的是俄羅斯首席程序員Vadim Pisarevsky(瓦迪姆 • 彼薩里夫斯)。他是這個庫最大的獨立貢獻者。Vadim還在項目引爆前的蕭條時期管理并且發(fā)展了OpenCV。如果要把有些人稱為OpenCV的英雄,那么一定非他莫屬。他的技術(shù)見解在我們寫書的時候也起到了巨大的幫助,在管理方面他也受到了Victor Eruhimov的支持,俄羅斯視覺公司Itseez的聯(lián)合創(chuàng)始人,現(xiàn)在是Itseez3D(已被英特爾收購)的CEO。
在每周會議上,有幾個人一直在幫助管理庫,他們是Grace Vesom,Vincent Rabaud,Stefano Fabri,當(dāng)然還有Vadim Pisarevsky。這些會議可以在https://github.com/opencv/opencv/wiki/Meeting_notes看到。
在此期間,許多人都為OpenCV庫做出了貢獻,最近一些貢獻者分別是Dinar Ahmatnurov,Pablo Alcantarilla,Alexander Alekhin,Daniel Angelov,Dmitriy Anisimov,Anatoly Baksheev,Cristian Balint,Alexandre Benoit,Laurent Berger,Leonid Beynenson,Alexander Bokov,Alexander Bovyrin,Hilton Bristow,Vladimir Bystritsky,Antonella
Cascitelli,Manuela Chessa,Eric Christiansen,F(xiàn)rederic Devernay,Maria Dimashova,Roman Donchenko,Vladimir Dudnik,Victor Eruhimov,Georgios Evangelidis,Stefano Fabri,Sergio Garrido,Harris Gasparakis,Yuri Gitman,Lluis Gomez,Yury Gorbachev,Elena Gvozdeva,Philipp Hasper,F(xiàn)ernando J. Iglesias Garcia,Alexander Kalistratov,Andrey Kamaev,Alexander Karsakov,Rahul Kavi,Pat O’Keefe,Siddharth Kherada,Eugene Khvedchenya,Anna Kogan,Marina Kolpakova,Kirill Kornyakov,Ivan Korolev,Maxim Kostin,Evgeniy Kozhinov,Ilya Krylov,Laksono Kurnianggoro,Baisheng Lai(賴百勝),Ilya Lavrenov,Alex Leontiev,Gil Levi,Bo Li(李波),Ilya Lysenkov,Vitaliy Lyudvichenko,Bence Magyar,Nikita Manovich,Juan Manuel Perez Rua,Konstantin Matskevich,Patrick Mihelich,Alexander Mordvintsev,F(xiàn)edor Morozov,Gregory Morse,Marius Muja,Mircea Paul Muresan,Sergei Nosov,Daniil Osokin,Seon-Wook Park,Andrey Pavlenko,Alexander Petrikov,Philip aka Dikay900,Prasanna,F(xiàn)rancesco Puja,Steven Puttemans,Vincent Rabaud,Edgar Riba,Cody Rigney,Pavel Rojtberg,Ethan Rublee,Alfonso Sanchez-Beato,Andrew Senin,Maksim Shabunin,Vlad Shakhuro,Adi Shavit,Alexander Shishkov,Sergey Sivolgin,
Marvin Smith,Alexander Smorkalov,F(xiàn)abio Solari,Adrian Stratulat,Evgeny Talanin,Manuele Tamburrano,Ozan Tonkal,Vladimir Tyan,Yannick Verdie,Pierre Emmanuel Viel,Vladislav Vinogradov,Pavel Vlasov,Philipp Wagner,Yida Wang(王一達),Jiaolong Xu(許驕龍),Marian Zajko和Zoran Zivkovic。
這里(https://github.com/opencv/opencv/wiki/ChangeLog)還列出了其他的貢獻者。最后,Arraiy現(xiàn)在也在協(xié)助維護OpenCV.org(免費開源的代碼庫)。
感謝對本書提供幫助的人
在準備這本書和這本書的前一個版本時,我們得到了《紐約時報》科技記者約翰 • 馬爾科夫(John Ma rkoff)譯注1的大力幫助,感謝他的鼓勵、不厭其煩的指導(dǎo)以及多年所累積的一線寫作經(jīng)驗。我們還要感謝O’Reilly(奧萊利)的許多編輯,特別是Dawn Schanafelt(道恩 • 施納菲爾特),在叛逆的作者準備創(chuàng)業(yè)的時候,他滿懷耐心地繼續(xù)跟進本書相關(guān)工作。這本書是一個由OpenCV 2.x到3.x到長期項目。非常感謝O’Reilly始終站在我們這一邊。
Adrian致謝
在第1版(Learning OpenCV)的寫作過程中,我邀請一些優(yōu)秀的教師來協(xié)助我,使得本書工作變成了可能。在這些年,從各位那里獲得的指導(dǎo)變得愈發(fā)珍貴。我對他們每個人都懷有誠摯的謝意。我還特別想在這份感謝名單上加上我的導(dǎo)師湯姆 • 湯貝雷諾,我欠他非常多,在他的記憶里,我會把我的貢獻獻給這本書。他是一個具有非凡智慧的人,我很驕傲自己有機會追隨他的足跡。最后,深深感謝OpenCV社區(qū),感謝你們對第1版的歡迎,感謝你們耐心等待,這一版歷經(jīng)波折總算最終完成。
這一版花了很長時間才完成,在這幾年里,我有幸與數(shù)十家不同的公司合作,擔(dān)任顧問并進行技術(shù)研發(fā),先后作為董事會的成員、顧問團的成員、技術(shù)總監(jiān)、研發(fā)人員以及始創(chuàng)人。我有幸看到并熱愛著研發(fā)的方方面面。我在Applied Minds公司很多年,在那里創(chuàng)建并且運行我們的機器人部門,更準確地說是Applied Minds子公司。我很欣慰地看到OpenCV是許多優(yōu)秀項目的核心,涉及領(lǐng)域包括醫(yī)療、農(nóng)業(yè)、航空、國防和國土安全。
我同樣高興地發(fā)現(xiàn)這本書的第1版已經(jīng)成為幾乎所有這些機構(gòu)中的案頭必備。Gary和我用來構(gòu)建斯坦利(Stanley)的技術(shù)已經(jīng)成為無數(shù)項目的一部分,其中至少包含許多正在研發(fā)的自動駕駛項目。它們其中的某一個,或許所有都是為了改變或改善無數(shù)人的日常生活而準備的,成為其中的一員是多么讓人開心啊!在這些年我遇到過無數(shù)驚人的故事——有關(guān)于第1版如何在人們所工作或教學(xué)的領(lǐng)域讓他們受益,幫助他們建立事業(yè),幫助他們完成巨大的成就——這些事情成為快樂和奇跡的源泉。我希望這本新書將繼續(xù)為你們所有人服務(wù),并激勵和支持新一代科學(xué)家、工程師和發(fā)明家前行。
在本書的最后一章,我們開始了在機器人、人工智能、視覺和其他領(lǐng)域工作的新篇章。就我個人而言,我深深地感激那些引領(lǐng)和激勵我的人:教師、導(dǎo)師以及相關(guān)書籍的作者。我希望我們這本書的新版本能夠讓人在他們自己的生活中邁出重要的一步,希望看到你們邁向成功!
Gary致謝
我在1999年創(chuàng)立了OpenCV項目,目的是能夠向所有人提供我當(dāng)時只有在頂級實驗室里才能見到的基礎(chǔ)框架,并借此來加速計算機視覺和人工智能技術(shù)的發(fā)展。盡管很少有目標能夠和預(yù)期一樣實現(xiàn),但我慶幸這一計劃在時隔17年后終于實現(xiàn)了。完成這一目標還得歸功于多方的幫助,有太多的朋友和貢獻者,我沒辦法在此一一感謝注1。但我還是希望在這里特別感謝我在英特爾開始工作時所在的俄羅斯研究團隊,它們造就了一個成功的計算機視覺公司(Itseez.com),并最終被英特爾收購。我們作為同事開始工作并建立了深厚的友誼。
由于家中有三個十幾歲的孩子,我的妻子Sonya Bradski(桑雅 • 布拉德斯基)做了更多的工作來支持我寫作本書,對于她,我的感謝與愛難以言表。我也一樣愛我的孩子,但要說他們加速了我這本書的出版,委實說不出口:)。
我從幫助建立Industrial Perception公司(2013年被谷歌收購)的時候就萌生了創(chuàng)作第2版的想法。從此以后,寫書的工作就不定期地在周末和深夜進行。不知不覺,現(xiàn)在已經(jīng)是2016年,真是時光飛逝如電啊!我在第23章結(jié)束時所做的一些思考,靈感來源于我親自參與過的機器人項目,一個由柳樹車庫制造的叫PR2的雙臂機器人以及斯坦福的斯坦利(Stanley)項目,這個機器人贏得了DARPA機器人挑戰(zhàn)賽200萬美元的大獎。
讀者朋友們,在我們結(jié)束本書創(chuàng)作之際,由衷地希望在創(chuàng)業(yè)公司、實驗室、學(xué)術(shù)網(wǎng)站、會議、車間、風(fēng)險投資以及正在研發(fā)的很酷的項目中看到你們的身影。然后輕松地互相致意,談一談你正在做的新東西。我發(fā)起了OpenCV,為了共同的利益來支持并加速計算機視覺以及人工智能技術(shù),接下來要看你們的了。我們生活在一個充滿創(chuàng)意的世界里,一個人可以創(chuàng)造一個罐子,下一個人就能把這個罐子變成一個鼓,如此等等,都是創(chuàng)造!用OpenCV來創(chuàng)造一些可以造福于人類的東西吧!
目錄
譯者序 xvii前言 xxi第1章 概述 1什么是OpenCV 1OpenCV怎么用 2什么是計算機視覺 3OpenCV的起源 6OpenCV的結(jié)構(gòu) 7使用IPP來加速OpenCV 8誰擁有OpenCV 9下載和安裝OpenCV 9安裝 9從Git獲取最新的OpenCV 12更多的OpenCV文檔 13提供的文檔 13在線文檔和維基資源 13OpenCV貢獻庫 15下載和編譯Contributed模塊 16可移植性 16小結(jié) 17練習(xí) 17第2章 OpenCV初探 19頭文件 19資源 20第一個程序:顯示圖片 21第二個程序:視頻 23跳轉(zhuǎn) 24簡單的變換 28不那么簡單的變換 30從攝像頭中讀取 32寫入AVI文件 33小結(jié) 34練習(xí) 35第3章 了解OpenCV的數(shù)據(jù)類型 37基礎(chǔ)知識 37OpenCV的數(shù)據(jù)類型 37基礎(chǔ)類型概述 38深入了解基礎(chǔ)類型 39輔助對象 46工具函數(shù) 53模板結(jié)構(gòu) 60小結(jié) 61練習(xí) 61第4章 圖像和大型數(shù)組類型 63動態(tài)可變的存儲 63cv::Mat類N維稠密數(shù)組 64創(chuàng)建一個數(shù)組 65獨立獲取數(shù)組元素 69數(shù)組迭代器NAryMatIterator 72通過塊訪問數(shù)組元素 74矩陣表達式:代數(shù)和cv::Mat 75飽和轉(zhuǎn)換 77數(shù)組還可以做很多事情 78稀疏數(shù)據(jù)類cv::SparesMat 79訪問稀疏數(shù)組中的元素 79稀疏數(shù)組中的特有函數(shù) 82為大型數(shù)組準備的模板結(jié)構(gòu) 83小結(jié) 85練習(xí) 86第5章 矩陣操作 87矩陣還可以做更多事情 87cv::abs() 90cv::add() 91cv::addWeighted() 92cv::bitwise_and() 94cv::bitwise_not() 94cv::bitwise_or() 94cv::bitwise_xor() 95cv::calcCovarMatrix() 95cv::cartToPolar() 97cv::checkRange() 97cv::compare() 98cv::completeSymm() 99cv::convertScaleAbs() 99cv::countNonZero() 100cv::Mat cv::cvarrToMat() 100cv::dct() 101cv::dft() 102cv::cvtColor() 103cv::determinant() 106cv::divide() 106cv::eigen() 106cv::exp() 107cv::extractImageCOI() 107cv::flip() 108cv::gemm() 108cv::getConvertElem()和cv::getConvertScaleElem() 109cv::idct() 110cv::inRange() 110cv::insertImageCOI() 111cv::invert() 111cv::log() 112cv::LUT() 112cv::Mahalanobis() 113cv::max() 114cv::mean() 115cv::meanStdDev() 116cv::merge() 116cv::min() 116cv::minMaxIdx() 117cv::minMaxLoc() 118cv::mixChannels() 119cv::mulSpectrums() 120cv::multiply() 121cv::mulTransposed() 121cv::norm() 122cv::normalize() 123cv::perspectiveTransform() 125cv::phase() 125cv::polarToCart() 126cv::pow() 126cv::randu() 127cv::randn() 127cv::repeat() 129cv::scaleAdd() 129cv::setIdentity() 130cv::solve() 130cv::solveCubic() 131cv::solvePoly() 132cv::sort() 132cv::sortIdx() 133cv::split() 133cv::sqrt() 134cv::subtract() 135cv::sum() 135cv::trace() 135cv::transform() 136cv::transpose() 136小結(jié) 137練習(xí) 137第6章 繪圖和注釋 139繪圖 139藝術(shù)線條和填充多邊形 140字體和文字 146小結(jié) 148練習(xí) 148第7章 OpenCV中的函數(shù)子 151操作對象 151主成分分析(cv::PCA) 151奇異值分解cv::SVD 154隨機數(shù)發(fā)生器cv::RNG 157小結(jié) 160練習(xí) 160第8章 圖像、視頻與數(shù)據(jù)文件 163HighGUI模塊:一個可移植的圖形工具包 163圖像文件的處理 164圖像的載入與保存 165關(guān)于codecs的一些注釋 167圖片的編碼與解碼 168視頻的處理 169使用cv::VideoCapture對象讀取視頻流 169使用cv::VideoWriter對象寫入視頻 175數(shù)據(jù)存儲 176cv::FileStorage的寫入 177使用cv::FileStorage讀取文件 179cv::FileNode 180小結(jié) 183練習(xí) 183第9章 跨平臺和Windows系統(tǒng) 187基于Windows開發(fā) 187HighGUI原生圖形用戶接口 188通過Qt后端工作 199綜合OpenCV和全功能GUI工具包 209小結(jié) 222練習(xí) 222第10章 濾波與卷積 225概覽 225預(yù)備知識 225濾波、核和卷積 225邊界外推和邊界處理 227閾值化操作 230Otsu算法 233自適應(yīng)閾值 233平滑 235簡單模糊和方框型濾波器 236中值濾波器 238高斯濾波器 239雙邊濾波器 240導(dǎo)數(shù)和梯度 242索貝爾導(dǎo)數(shù) 242Scharr濾波器 244拉普拉斯變換 245圖像形態(tài)學(xué) 246膨脹和腐蝕 247通用形態(tài)學(xué)函數(shù) 250開操作和閉操作 251形態(tài)學(xué)梯度 254頂帽和黑帽 256自定義核 258用任意線性濾波器做卷積 259用cv::filter2D()進行卷積 259通過cv::sepFilter2D使用可分核 260生成卷積核 260小結(jié) 262練習(xí) 262第11章 常見的圖像變換 267概覽 267拉伸、收縮、扭曲和旋轉(zhuǎn) 267均勻調(diào)整 268圖像金字塔 269不均勻映射 273仿射變換 274透視變換 279通用變換 282極坐標映射 282LogPolar 283任意映射 287圖像修復(fù) 287圖像修復(fù) 288去噪 289直方圖均衡化 292cv::equalizeHist()用于對比均衡 294小結(jié) 295練習(xí) 295第12章 圖像分析 297概覽 297離散傅里葉變換 297cv::dft()離散傅里葉變換 298cv::idft()用于離散傅里葉逆變換 300cv::mulSpectrums()頻譜乘法 300使用傅里葉變換進行卷積 301cv::dct()離散余弦變換 303cv::idct()離散余弦逆變換 304積分圖 304cv::integral()標準求和積分 306cv::integral()平方求和積分 306cv::integral()傾斜求和積分 307Canny邊緣檢測 307cv::Canny() 309Hough變換 309Hough線變換 309Hough圓變換 313距離變換 316cv::distanceTransform()無標記距離變換 317cv::distanceTransform()有標記距離變換 317分割 318漫水填充 318分水嶺算法 322Grabcuts算法 323Mean-Shift分割算法 325小結(jié) 326練習(xí) 326第13章 直方圖和模板 329OpenCV中直方圖的表示 331cv::calcHist():從數(shù)據(jù)創(chuàng)建直方圖 332基本直方圖操作 334直方圖歸一化 334直方圖二值化 335找出最顯著的區(qū)間 335比較兩個直方圖 337直方圖用法示例 339一些復(fù)雜的直方圖方法 342EMD距離 342反向投影 347模板匹配 350方差匹配方法(cv::TM_SQDIFF) 351歸一化方差匹配方法(cv::TM_SQDIFF_NORMED) 352相關(guān)性匹配方法(cv::TM_CCORR) 352歸一化的互相關(guān)匹配方法(cv::TM_CCORR_NORMED) 352相關(guān)系數(shù)匹配方法(cv::TM_CCOEFF) 352歸一化的相關(guān)系數(shù)匹配方法(cv::TM_CCOEFF_NORMED) 352小結(jié) 355練習(xí) 355第14章 輪廓 359輪廓查找 359輪廓層次 360繪制輪廓 364輪廓實例 365另一個輪廓實例 366快速連通區(qū)域分析 368深入分析輪廓 370多邊形逼近 370幾何及特性概括 372幾何學(xué)測試 377匹配輪廓與圖像 378矩 378再論矩 380使用Hu矩進行匹配 383利用形狀場景方法比較輪廓 384小結(jié) 388練習(xí) 389第15章 背景提取 391背景提取概述 391背景提取的缺點 392場景建模 392像素 393幀間差分 396平均背景法 397累計均值,方差和協(xié)方差 403更復(fù)雜的背景提取方法 410結(jié)構(gòu) 413進行背景學(xué)習(xí) 414存在移動的前景物體時進行背景學(xué)習(xí) 417背景差分:檢測前景物體 418使用碼書法的背景模型 419關(guān)于碼書法的其他想法 419使用連通分量進行前景清理 420小測試 423兩種背景方法的對比 425OpenCV中的背景提取方法的封裝 425cv::BackgroundSubstractor基類 426KB方法 427Zivkovic方法 428小結(jié) 431練習(xí) 431第16章 關(guān)鍵點和描述子 433關(guān)鍵點和跟蹤基礎(chǔ) 433角點檢測 434光流簡介 437Lucas-Kanade稀疏光流法 438廣義關(guān)鍵點和描述符 448光流,跟蹤和識別 450OpenCV一般如何處理關(guān)鍵點和描述符 451核心關(guān)鍵點檢測方法 461關(guān)鍵點過濾 497匹配方法 499結(jié)果顯示 505小結(jié) 508練習(xí) 508第17章 跟蹤 511跟蹤中的概念 511稠密光流 512Farneback多項式擴展算法 513Dual TV-L1模型 515簡單光流算法 519Mean-Shift算法和Camshift 追蹤 522Mean-Shift算法 522Camshift 526運動模板 526估計 533卡爾曼濾波器 534擴展卡爾曼濾波器簡述 549小結(jié) 551練習(xí) 551第18章 相機模型與標定 553相機模型 554射影幾何基礎(chǔ) 556Rodrigues變換 558透鏡畸變 559標定 562旋轉(zhuǎn)矩陣和平移向量 563標定板 566單應(yīng)性 572相機標定 576矯正 587矯正映射 587使用cv::convertMaps()在不同表示方式之間轉(zhuǎn)換矯正映射 588使用cv::initUndistortRectifyMap()計算矯正映射 589使用cv::remap()矯正圖像 591使用cv::undistort()進行矯正 591使用cv::undistortPoints()進行稀疏矯正 591與標定結(jié)合 592小結(jié) 595練習(xí) 596第19章 投影與三維視覺 599投影 600仿射變換與透視變換 601鳥瞰圖變換實例 602三維姿態(tài)估計 606單攝像機姿態(tài)估計 607立體成像 609三角測量 610對極幾何 613本征矩陣和基本矩陣 615計算極線 624立體校正 624立體校正 628立體匹配 638立體校正、標定和對應(yīng)的示例代碼 650來自三維重投影的深度映射 657來自運動的結(jié)構(gòu) 659二維與三維直線擬合 659小結(jié) 662練習(xí) 662第20章 機器學(xué)習(xí)基礎(chǔ) 665什么是機器學(xué)習(xí) 665訓(xùn)練集和測試集 666有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí) 667生成式模型和判別式模型 669OpenCV機器學(xué)習(xí)算法 669機器學(xué)習(xí)在視覺中的應(yīng)用 671變量的重要性 673診斷機器學(xué)習(xí)中的問題 674ML庫中遺留的機器學(xué)習(xí)算法 678K均值 679馬氏距離 684小結(jié) 687練習(xí) 687第21章 StatModel:OpenCV中的基準學(xué)習(xí)模型 689ML庫中的常見例程 689訓(xùn)練方法和cv::ml::TrainData的結(jié)構(gòu) 691預(yù)測 697使用cv::StatModel的機器學(xué)習(xí)算法 698樸素貝葉斯分類器 699二叉決策樹 703Boosting方法 716隨機森林 721期望最大化算法 725K近鄰算法 729多層感知機 731支持向量機 739小結(jié) 749練習(xí) 750第22章 目標檢測 753基于樹的目標檢測技術(shù) 753級聯(lián)分類器 754有監(jiān)督學(xué)習(xí)和boosting理論 756學(xué)習(xí)新目標 764使用支持向量機的目標識別 772Latent SVM用于目標識別 772Bag of Words算法與語義分類 775小結(jié) 780練習(xí) 780第23章 OpenCV的未來 783過去與未來 783OpenCV 3.x 784我們上一次預(yù)測怎么樣? 784未來應(yīng)用 785目前GSoC的進展 787社區(qū)貢獻 788OpenCV.org 789一些關(guān)于AI的猜測 790結(jié)語 793附錄A 平面劃分 795附錄B opencv_contrib模塊概述 809附錄C 標定圖案 813參考文獻 819