使用OpenCV,你幾乎可以完成你能想到的每種計算機視覺任務(wù)。現(xiàn)實生活中的問題要求同時使用許多計算機視覺算法和模塊來獲得所需的結(jié)果。因此,你只需了解要用哪些OpenCV模塊和函數(shù)來獲得你想要的東西。
讓我們來看看OpenCV中可以開箱即用的功能。
1 內(nèi)置數(shù)據(jù)結(jié)構(gòu)和輸入/輸出
OpenCV的最大優(yōu)點之一是它提供了許多內(nèi)置基元來處理與圖像處理和計算機視覺相關(guān)的操作。如果你必須從零開始編程,就必須定義Image、Point、Rectangle等。這些幾乎是任何計算機視覺算法的基礎(chǔ)。
OpenCV自帶所有這些基本結(jié)構(gòu),它們包含在核心模塊中。另一個優(yōu)點是這些結(jié)構(gòu)已經(jīng)針對速度和內(nèi)存進行了優(yōu)化,因此你不必擔(dān)心其實現(xiàn)細節(jié)。
imgcodecs模塊可以處理圖像文件的讀取和寫入。當(dāng)你對輸入圖像進行操作并創(chuàng)建輸出圖像時,可以使用簡單的命令將其另存為.jpg或.png文件。
使用攝像機時,你將會處理大量的視頻文件。videoio模塊可以處理與視頻文件的輸入和輸出相關(guān)的所有操作。你可以輕松地從網(wǎng)絡(luò)攝像頭捕獲視頻,或以多種不同格式讀取視頻文件。你甚至可以通過設(shè)置諸如每秒幀數(shù)、幀大小等屬性來將很多幀保存為視頻文件。
2 圖像處理操作
在編寫計算機視覺算法時,會有很多基本的圖像處理操作,你將反復(fù)使用它們。大多數(shù)這些函數(shù)都在imgproc模塊中。你可以執(zhí)行諸如圖像過濾、形態(tài)學(xué)操作、幾何變換、顏色轉(zhuǎn)換、圖像繪制、直方圖、形狀分析、運動分析、特征檢測等操作。
讓我們來看看圖1-3。
右圖是左側(cè)圖像的旋轉(zhuǎn)版本,我們在OpenCV中用一行代碼就可以實現(xiàn)這種轉(zhuǎn)換。
還有另一個名為ximgproc的模塊,它包含高級圖像處理算法,可以用于諸如結(jié)構(gòu)化森林的邊緣檢測、域變換濾波器、自適應(yīng)流形濾波器等處理。
3 GUI
OpenCV提供了一個名為highgui的模塊,可用于處理所有高級用戶界面操作。假設(shè)你正在解決一個問題,并且想要在繼續(xù)下一步之前檢查圖像的外觀,則可利用該模塊具有的創(chuàng)建窗口以顯示圖像和視頻的功能。
它有一個等待功能,可以等你按下鍵盤上的一個鍵才進入下一步。還有一個可以檢測鼠標事件的功能,在開發(fā)交互式應(yīng)用程序時非常有用。
使用這些功能,你可以在那些輸入窗口上繪制矩形,然后根據(jù)所選區(qū)域進行處理,以圖1-4為例。
如你所見,我們在窗口上畫了一個綠色矩形。一旦得到這個矩形的坐標,就可以單獨操作該區(qū)域。
4 視頻分析
視頻分析包括諸如分析視頻中連續(xù)幀之間的運動、跟蹤視頻中的不同目標、創(chuàng)建視頻監(jiān)控模型等任務(wù)。OpenCV提供了一個名為video的模塊,可以處理所有這些任務(wù)。
還有一個名為videostab的模塊,用來處理視頻穩(wěn)定的問題。視頻穩(wěn)定非常重要,因為當(dāng)你通過手持攝像機拍攝視頻時,通常會有很多抖動需要糾正。所有的現(xiàn)代設(shè)備都會使用視頻穩(wěn)定功能,以便在將視頻呈現(xiàn)給最終用戶之前對其進行處理。
5 3D重建
3D重建是計算機視覺中的一個重要課題。給定一組2D圖像,我們可以使用相關(guān)算法重建3D場景。在calib3d模塊中,OpenCV提供的算法可以找到這些2D圖像中各種對象之間的關(guān)系,并計算其3D位置。
該模塊還可以處理攝像機校準,這對于估計攝像機的參數(shù)至關(guān)重要。這些參數(shù)定義了攝像機如何看到它前面的場景。我們需要知道這些參數(shù)來設(shè)計算法,否則我們可能會得到意想不到的結(jié)果。
請看圖1-5。
正如我們在這里看到的,相同的對象從多個位置被捕獲。我們的工作是使用這些2D圖像重建原始對象。
.6 特征提取
正如我們前面所討論的,人類視覺系統(tǒng)傾向于從給定場景中提取主要特征,然后記住它,這樣便于后續(xù)的檢索。為了模仿這一點,人們開始設(shè)計各種特征提取器,用于從給定的圖像中提取出這些特征點。流行的算法包括尺度不變特征變換(Scale Invariant Feature Transform,簡稱SIFT)、加速魯棒特征(Speeded Up Robust Features,簡稱SURF)和加速分段測試特征(Features From Accelerated Segment Test,簡稱FAST)。
名為features2d的OpenCV模塊提供了檢測和提取所有這些特征的功能。另一個名為xfeatures2d的模塊提供了更多的特征提取器,其中一些仍處于實驗階段。如果有機會,你可以嘗試使用它們。
還有一個名為bioinspired的模塊,可以為受到生物學(xué)啟發(fā)的計算機視覺模型提供算法。
7 對象檢測
對象檢測是指檢測給定圖像中對象的位置。此過程與對象類型無關(guān)。如果你設(shè)計一個椅子檢測器,它不會告訴你給定圖像中的椅子是高靠背紅色的,還是藍色低靠背的,它只會告訴你椅子的位置。
檢測對象的位置是許多計算機視覺系統(tǒng)中的關(guān)鍵步驟。
以圖1-6為例。
如果你在這幅圖像上運行一個椅子檢測器,它會在所有椅子的周圍放置一個綠色框,但它不會告訴你椅子是什么樣的。
由于在各種尺度下執(zhí)行檢測所需的計算次數(shù)不同,對象檢測曾經(jīng)是計算密集型任務(wù)。為了解決這個問題,Paul Viola和Michael Jones在2001年的開創(chuàng)性論文中提出了一個很好的算法(https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf ),其中提出了一種為任何對象快速設(shè)計對象檢測器的方法。
OpenCV自帶名為objdetect和xobjdetect的模塊,它們提供了設(shè)計對象檢測器的框架,你可以使用它們來開發(fā)任何對象的探測器,比如太陽鏡、靴子等。
8 機器學(xué)習(xí)
機器學(xué)習(xí)算法被廣泛用于構(gòu)建實現(xiàn)目標識別、圖像分類、面部檢測、視覺搜索等功能的計算機視覺系統(tǒng)。
OpenCV提供了一個名為ml的模塊,該模塊捆綁了許多機器學(xué)習(xí)算法,包括貝葉斯分類器(Bayes classifier)、k近鄰(k-nearest neighbor,簡稱KNN),支持向量機(support vector machine,簡稱SVM)、決策樹(decision tree)、神經(jīng)網(wǎng)絡(luò)(neural network)等。
它還有一個名為快速近似最近鄰搜索庫(Fast Approximate Nearest Neighbor Search Library,簡稱FLANN)的模塊,其中包含用于在大型數(shù)據(jù)集中進行快速最近鄰搜索的算法。
9 計算攝影
計算攝影是指使用先進的圖像處理技術(shù)來改善相機捕獲的圖像。計算攝影并不專注于光學(xué)過程和圖像捕捉方法,而是使用軟件來操縱視覺數(shù)據(jù)。其應(yīng)用領(lǐng)域包括高動態(tài)范圍成像,全景圖像、圖像補光和光場相機等。
以圖1-7為例。
看看這些生動的色彩!這是高動態(tài)范圍圖像的例子,使用傳統(tǒng)的圖像捕獲技術(shù)無法實現(xiàn)這種效果。必須在多次曝光中捕獲相同的場景,相互寄存這些圖像,然后將它們很好地混合,之后才能創(chuàng)建出這個圖像。
photo和xphoto模塊包含各種算法,提供與計算攝影有關(guān)的算法。還有一個稱為stitching的模塊,它提供創(chuàng)建全景圖像的算法。
10 形狀分析
形狀的概念在計算機視覺中至關(guān)重要。我們通過識別圖像中各種不同的形狀來分析視覺數(shù)據(jù)。實際上,這是許多算法中的重要步驟。
假設(shè)你正在嘗試識別圖像中的特定徽標。你知道它可以按各種形狀、方向和大小呈現(xiàn)。作為起步的一個好方法是量化對象的形狀特征。
shape模塊為提取不同形狀、測量它們之間的相似性、轉(zhuǎn)換對象形狀等操作提供了所有算法。
11 光流算法
光流算法用于在視頻中跟蹤連續(xù)幀中的特征。假設(shè)你要跟蹤視頻中的特定對象。在每一幀上運行一個特征提取器是非常耗費計算資源的,這個過程會很慢。因此,你只需從當(dāng)前幀中提取出要素,然后在連續(xù)幀中跟蹤這些要素。
光流算法在基于視頻的計算機視覺應(yīng)用中被大量使用。optflow模塊包含了執(zhí)行光流操作所需的所有算法。還有一個稱為tracking的模塊,其中包含可用于跟蹤特征的更多算法。
12 人臉和對象識別
人臉識別是指識別給定圖像中的人物。這與人臉檢測不同,在人臉檢測中,只需要識別給定圖像中人臉的位置。
如果你想建立一個可以識別相機前面的人的實用的生物識別系統(tǒng),首先需要運行一個人臉檢測器來識別人臉的位置,然后運行一個單獨的人臉識別器來識別該人是誰。有一個名為face的OpenCV模塊用于處理人臉識別。
正如我們之前討論的那樣,計算機視覺試圖按照人類感知視覺數(shù)據(jù)的方式對算法進行建模。因此,在圖像中找到顯著的區(qū)域和對象將是有幫助的,這可以幫助我們處理不同的應(yīng)用,例如目標識別、目標檢測和跟蹤等。一個名為saliency的模塊是專門為此目的而設(shè)計的。它提供的算法可以檢測靜態(tài)圖像和視頻中的顯著區(qū)域。
13 表面匹配
有越來越多的設(shè)備能夠捕獲我們周圍對象的3D結(jié)構(gòu),這些設(shè)備能夠捕獲深度信息以及常規(guī)的2D彩色圖像。因此,構(gòu)建可以理解和處理3D對象的算法對我們來說非常重要。
Kinect是捕獲深度信息和視覺數(shù)據(jù)的一個很好的設(shè)備例子,它現(xiàn)在能夠識別輸入的3D對象,并將其與數(shù)據(jù)庫中的模型匹配。如果我們有一個可以識別和定位對象的系統(tǒng),那么它就可以用于許多不同的應(yīng)用程序。
一個名為surface_matching的模塊包含用于3D對象識別的算法,以及使用3D特征的姿勢估計算法。
14 文本檢測和識別
識別給定場景中的文本并識別其內(nèi)容變得越來越重要,其應(yīng)用包括車牌識別、識別用于自動駕駛汽車的道路標志、將內(nèi)容數(shù)字化的書籍掃描等。
一個名為text的模塊包含處理文本檢測和識別的各種算法。
15 深度學(xué)習(xí)
深度學(xué)習(xí)對計算機視覺和圖像識別有很大影響,并且比其他機器學(xué)習(xí)和人工智能算法具有更高的準確度。深度學(xué)習(xí)不是一個新概念;它在1986年左右被提出,但在2012年左右有了革命性進步,當(dāng)時新的GPU硬件針對并行計算和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,簡稱CNN)實現(xiàn)進行了優(yōu)化,加上其他技術(shù),使得在合理的時間內(nèi)訓(xùn)練復(fù)雜的神經(jīng)網(wǎng)絡(luò)架構(gòu)成為可能。
深度學(xué)習(xí)可以應(yīng)用于多種用例,例如圖像識別、目標檢測、語音識別和自然語言處理。從版本3.4開始,OpenCV一直在實現(xiàn)深度學(xué)習(xí)算法,在最新版本中,添加了諸如TensorFlow和Caffe等多個重要框架的導(dǎo)入器。