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