本書分9章來介紹計算機視覺的重要概念,所有的概念都融入了一些很有趣的項目。本書首先詳細介紹了多個平臺下基于Python的OpenCV安裝,繼而介紹了計算機視覺應用的基本操作,包括圖像文件的讀取與顯示,圖像處理的基本操作(比如邊緣檢測等),深度估計與分割,人臉檢測與識別,圖像的檢索,目標的檢測與識別,目標跟蹤,神經網絡的手寫體識別。
OpenCV 3是一種*先進的計算機視覺庫,它提供了很多圖像和視頻處理操作,以及一些代表計算機視覺未來發展方向的功能,如人臉識別或目標跟蹤。學習計算機視覺算法、模型和OpenCV API的基本概念之后,可以開發各種現實生活中的應用程序(如安全和監控方面的應用程序)。
本書從圖像處理的基本操作出發,帶你開啟先進計算機視覺的探索之旅。計算機視覺是一個快速發展的學科,與其相關的現實應用也呈爆炸性增長,本書的目的就是幫助計算機視覺領域的新手和想要了解全新的OpenCV 3.0.0的計算機視覺專家快速掌握基于Python的OpenCV計算機視覺開發的實用方法、技巧和*佳實踐。
通過閱讀本書,你將學到:
安裝和熟練使用基于Python的OpenCV 3的API
掌握圖像處理和視頻分析的基礎知識
在圖像和視頻中檢測和識別目標
使用OpenCV檢測和識別人臉
訓練和使用自己的對象分類器
了解計算機視覺中的機器學習概念
使用OpenCV的人工神經網絡來解決實際問題
開發現實生活中的計算機視覺應用
Preface 前 言OpenCV 3是一種先進的計算機視覺庫,可以用于各種圖像和視頻處理操作,通過OpenCV 3 能很容易地實現一些有前景且功能先進的應用(比如:人臉識別或目標跟蹤等)。理解與計算機視覺相關的算法、模型以及OpenCV 3 API背后的基本概念,有助于開發現實世界中的各種應用程序(比如:安全和監視領域的工具)。
本書將從圖像處理的基本操作出發,帶你開啟先進計算機視覺概念的探索之旅。計算機視覺是一個快速發展的學科,在現實生活中,它的應用增長得非常快,因此寫作本書的目的是為了幫助計算機視覺領域的新手和想要了解全新的OpenCV 3.0.0的計算機視覺專家。
本書的主要內容第1章介紹如何在不同平臺下安裝基于Python的OpenCV,并給出一些常見問題的解決方法。
第2章介紹了OpenCV的I/O功能,并討論與項目相關的概念,以及如何針對該項目進行面向對象設計。
第3章介紹一些圖像變換方法,例如在圖像中檢測膚色、銳化圖像、標記主體輪廓,以及使用線段檢測器檢測人行橫道等。
第4章介紹如何利用深度攝像頭的數據來識別前景和背景區域,這樣就可以限制針對前景或背景的效果。
第5章介紹一些OpenCV的人臉檢測功能和相關的數據文件,這些文件定義了跟蹤目標的特定類型。
第6章介紹如何用OpenCV來檢測圖像特征,并利用這些特征來匹配和搜索圖像。
第7章介紹目標檢測和目標識別的概念,這是計算機視覺中最常見的問題之一。
第8章對目標跟蹤進行深入探討,目標跟蹤是對攝像機中的圖像或視頻中移動的物體進行定位的過程。
第9章介紹基于OpenCV的人工神經網絡,并介紹其在現實生活中的應用。
閱讀前的準備工作本書第1章會指導讀者安裝所有必要軟件,你只需準備一臺較新的計算機。另外,強烈推薦為計算機安裝攝像頭,但這并不是必備的。
本書的讀者對象本書針對具有一定Python工作經驗的程序員以及想要利用OpenCV庫研究計算機視覺課題的讀者。本書不要求讀者具有計算機視覺或OpenCV經驗,但要具有編程經驗。
本書體例本書有很多用來區分不同信息的文本格式,下面給出一些這類格式的樣例,并解釋它們的含義。
代碼塊的格式如下:
為了提醒讀者注意代碼塊中的特殊部分,會將相關行或相關項設置為粗體:
命令行的輸入或輸出的格式為:
注意:警告或重要注釋以這樣的形式出現。
提示:提示和技巧以這樣的形式出現。
下載示例代碼讀者可登錄華章網站(www.hzbook.com)本書頁面,下載本書示例代碼。
作者簡介 Abut the AuthorsJoe Minichino 是Hoolux Medical從事計算機視覺的工程師,他利用業余時間開發了NoSQL數據庫LokiJS。他也是重金屬歌手/作曲家。他是一個充滿激情的程序員,對編程語言和技術非常好奇,并一直在使用它們。在Hoolux,Joe領導了針對醫療行業的Android計算機視覺廣告平臺的開發。
他出生在意大利瓦雷澤市的Lombardy,并在那里長大,在米蘭Universitá Statale受過哲學教育,最近11年Joe在愛爾蘭的Cork度過,在這里他成為Cork技術研究所的一名計算機科學研究生。
我非常感謝我的合作伙伴Rowena,她總是鼓勵我,也感謝兩個小女兒給我靈感。非常感謝這本書的合作者和編輯,尤其是Joe Howse、Adrian Roesbrock、Brandon Castellano、OpenCV社區,以及Packt出版社中那些為本書付出勞動的人。
Joseph Howse 生活在加拿大。在冬天,他留著胡子,而他的四只貓留著厚皮毛。他喜歡每天給貓梳毛。有時貓還會抓他的胡子。
自2012年以來,他一直在為Packt出版社寫作,他的著作包括《OpenCV for Secret Agents》《OpenCV Blueprints》《Android Application Programming with OpenCV 3》《OpenCV Computer Vision with Python》以及《Python Game Programming by Example》。
當他不寫書或打理萌寵時,他會提供咨詢和培訓,并通過他的公司(Nummist Media公司(http://nummist.com))進行軟件開發服務。
Abut the Reviewers 審校者簡介Nandan Banerjee 擁有計算機科學學士學位和機器人工程碩士學位。他畢業后在三星電子工作。他在班加羅爾的研發中心工作了一年。為了參加DARPA機器人挑戰,他還曾在位于Atlas的Boston Dynamics機器人公司的WPI-CMU團隊工作過。目前他是iRobot公司的一名機器人軟件工程師。他是一名嵌入式系統和機器人愛好者,主要喜歡計算機視覺和運動規劃。他熟悉各種語言,包括C、C++、Python、Java和Delphi。他在工作中會用到ROS、OpenRAVE、OpenCV、PCL、OpenGL、CUDA和Android SDK。
我要感謝作者和出版商能出版這樣精彩的書。
Tian Cao 在美國教堂山的北卡羅來納州大學攻讀計算機科學博士學位,并參與圖像分析、計算機視覺和機器學習等項目。
我將這項工作獻給我的父母和女友。
Brandon Castellano 來自加拿大的學生,在加拿大倫敦市西安大略大學攻讀電氣工程碩士學位。在2012年,他獲得同專業的學士學位。他主要研究實時圖像處理算法的并行處理實現和GPGPU/FPGA優化。Brandon也在Eagle Vision Systems公司工作過,他在這家公司主要專注于機器人應用中的實時圖像處理。
雖然他使用OpenCV和C++超過5年了,但他在研究中一直提倡使用Python,因為Python開發速度快,可與復雜系統實現低級對接。他在GitHub上有開源項目,例如,PySceneDetect,這些項目大部分是用Python編寫的。除了圖像/視頻處理,他還致力于實現三維展示,并提供軟件工具來支持這樣的開發。
他除了在他的網站(http://www.bcastell.com)上張貼技術文章和教程外,還參與各種開源和不開源的項目,他在GitHub上的用戶名為Breakthrough(http://www.github.com/Breakthrough)。他是Super User和Stack Overflow社區的活躍成員(其名字仍是Breakthrough),可直接通過他的網站與他聯系。
我要感謝過去幾年所有的朋友和家人的耐心(尤其是我的父母Peter和Lori以及我的兄弟Mitchell),沒有他們持續的愛和支持,我不可能取得這一切成就。
我還要特別感謝所有致力開源軟件庫的開發者,特別是OpenCV,這有助于將前沿的軟件技術免費帶給世界各地的軟件開發者。也想感謝那些寫文檔、提交錯誤報告和寫教程/書籍(尤其是這本書的作者!)的人們,你們的貢獻對任何開源項目的成功至關重要,尤指像OpenCV這樣復雜龐大的開源軟件。
Haojian Jin 位于加拿大Sunnyvale雅虎實驗室的軟件工程師/研究員。他主要開發移動新設備上(或最少硬件更改)的新系統。為了創建當今不存在的事物,他花費了大量時間來研究信號處理、計算機視覺、機器學習和自然語言處理,并以有趣的方式來使用它們?稍趆ttp://shift-3.com/上找到更多關于他的信息。
Adrian Rosebrock 一位作家,也是http://www.pyimagesearch.com/的博主。他有馬里蘭大學計算機科學博士學位,側重于計算機視覺和機器學習的研究。
他曾在癌癥研究所從事通過乳腺圖像來自動預測乳腺癌的危險因素的研究。他還寫了《Practical Python and OpenCV》一書(http://pyimg.co/x7ed5),這本書介紹如何利用Python和OpenCV來構建現實世界中的計算機視覺應用。
About the Translators 譯者簡介劉波 博士,重慶工商大學計算機科學與信息工程學院教師,主要從事機器學習理論、計算機視覺和最優化技術研究,同時對Hadoop和Spark平臺上的大數據分析感興趣,也對Linux編程和Oracle數據庫感興趣。
苗貝貝 碩士,北京工商大學計算機與信息工程學院研究生,主要從事機器學習理論、時間序列動力學特征分析及應用的研究,對基于Python的計算機視覺分析有濃厚的興趣。
史斌 2015年本科畢業于電子科技大學計算機學院,目前就職于成都知數科技有限公司,主要從事數據爬取、數據處理、平臺運維等工作,熟悉Python、Linux shell,同時熱愛計算機視覺編程,熟悉Python下的OpenCV編程。
作者簡介
Joe Minichino Hoolux Medical計算機視覺工程師,NoSQL數據庫LokiJS的開發者。他是一個充滿激情的程序員,對編程語言和技術充滿好奇,并不斷嘗試。在Hoolux,Joe領導了針對醫療行業的Android計算機視覺廣告平臺的開發。
Joseph Howse Nummist Media公司總裁,自2012年起,出版了多部OpenCV方面的著作,包括《OpenCV for Secret Agents》《Android Application Programming with OpenCV 3》和《OpenCV Computer Vision with Python》等。
譯者簡介
劉波 博士,任教于重慶工商大學計算機科學與信息工程學院,主要從事機器學習理論、計算機視覺和*優化技術研究,同時對Hadoop和Spark平臺上的大數據分析感興趣,也對Linux平臺的編程和Oracle數據庫感興趣。
苗貝貝 碩士,北京工商大學計算機與信息工程學院研究生,主要從事機器學習理論、時間序列動力學特征分析及應用的研究,對基于Python的計算機視覺分析有濃厚的興趣。
史斌 畢業于電子科技大學計算機學院,目前就職于成都知數科技有限公司,主要從事數據爬取、數據處理、平臺運維等工作,熟悉Python、Linux shell,同時熱愛計算機視覺編程,熟悉Python下的OpenCV編程。
目 錄 Contents
譯者序
前言
作者簡介
審校者簡介
譯者簡介
第1章 安裝OpenCV 1
1.1 選擇和使用合適的安裝工具 2
1.1.1 在Windows上安裝 2
1.1.2 在OS X系統中安裝 6
1.1.3 在Ubuntu及其衍生版本中安裝 11
1.1.4 在其他類Unix系統中安裝 12
1.2 安裝Contrib模塊 13
1.3 運行示例 13
1.4 查找文檔、幫助及更新 14
1.5 總結 15
第2章 處理文件、攝像頭和圖形用戶界面 16
2.1 基本I/O腳本 16
2.1.1 讀/寫圖像文件 16
2.1.2 圖像與原始字節之間的轉換 19
2.1.3 使用numpy.array訪問圖像數據 20
2.1.4 視頻文件的讀/寫 22
2.1.5 捕獲攝像頭的幀 23
2.1.6 在窗口顯示圖像 24
2.1.7 在窗口顯示攝像頭幀 25
2.2 Cameo項目(人臉跟蹤和圖像處理) 26
2.3 Cameo—面向對象的設計 27
2.3.1 使用managers. CaptureManager提取視頻流 27
2.3.2 使用managers.WindowManager抽象窗口和鍵盤 32
2.3.3 cameo.Cameo的強大實現 33
2.4 總結 34
第3章 使用OpenCV 3處理圖像 36
3.1 不同色彩空間的轉換 36
3.2 傅里葉變換 37
3.2.1 高通濾波器 37
3.2.2 低通濾波器 39
3.3 創建模塊 39
3.4 邊緣檢測 40
3.5 用定制內核做卷積 41
3.6 修改應用 43
3.7 Canny邊緣檢測 44
3.8 輪廓檢測 45
3.9 邊界框、最小矩形區域和最小閉圓的輪廓 46
3.10 凸輪廓與Douglas-Peucker算法 48
3.11 直線和圓檢測 50
3.11.1 直線檢測 50
3.11.2 圓檢測 51
3.12 檢測其他形狀 52
3.13 總結 52
第4章 深度估計與分割 53
4.1 創建模塊 53
4.2 捕獲深度攝像頭的幀 54
4.3 從視差圖得到掩模 56
4.4 對復制操作執行掩模 57
4.5 使用普通攝像頭進行深度估計 59
4.6 使用分水嶺和GrabCut算法進行物體分割 63
4.6.1 用GrabCut進行前景檢測的例子 64
4.6.2 使用分水嶺算法進行圖像分割 66
4.7 總結 69
第5章 人臉檢測和識別 70
5.1 Haar級聯的概念 70
5.2 獲取Haar級聯數據 71
5.3 使用OpenCV進行人臉檢測 72
5.3.1 靜態圖像中的人臉檢測 72
5.3.2 視頻中的人臉檢測 74
5.3.3 人臉識別 76
5.4 總結 82
第6章 圖像檢索以及基于圖像描述符的搜索 83
6.1 特征檢測算法 83
6.1.1 特征定義 84
6.1.2 使用DoG和SIFT進行特征提取與描述 86
6.1.3 使用快速Hessian算法和SURF來提取和檢測特征 89
6.1.4 基于ORB的特征檢測和特征匹配 91
6.1.5 ORB特征匹配 93
6.1.6 K-最近鄰匹配 95
6.1.7 FLANN匹配 96
6.1.8 FLANN的單應性匹配 99
6.1.9 基于文身取證的應用程序示例 102
6.2 總結 105
第7章 目標檢測與識別 106
7.1 目標檢測與識別技術 106
7.1.1 HOG描述符 107
7.1.2 檢測人 112
7.1.3 創建和訓練目標檢測器 113
7.2 汽車檢測 116
7.2.1 代碼的功能 118
7.2.2 SVM和滑動窗口 122
7.3 總結 134
第8章 目標跟蹤 135
8.1 檢測移動的目標 135
8.2 背景分割器:KNN、MOG2和GMG 138
8.2.1 均值漂移和CAMShift 142
8.2.2 彩色直方圖 144
8.2.3 返回代碼 146
8.3 CAMShift 147
8.4 卡爾曼濾波器 149
8.4.1 預測和更新 149
8.4.2 范例 150
8.4.3 一個基于行人跟蹤的例子 153
8.4.4 Pedestrian類 154
8.4.5 主程序 157
8.5 總結 159
第9章 基于OpenCV的神經網絡簡介 160
9.1 人工神經網絡 160
9.2 人工神經網絡的結構 161
9.2.1 網絡層級示例 162
9.2.2 學習算法 163
9.3 OpenCV中的ANN 164
9.3.1 基于ANN的動物分類 166
9.3.2 訓練周期 169
9.4 用人工神經網絡進行手寫數字識別 170
9.4.1 MNIST—手寫數字數據庫 170
9.4.2 定制訓練數據 170
9.4.3 初始參數 171
9.4.4 迭代次數 171
9.4.5 其他參數 171
9.4.6 迷你庫 172
9.4.7 主文件 175
9.5 可能的改進和潛在的應用 180
9.5.1 改進 180
9.5.2 應用 181
9.6 總結 181