當(dāng)下人工智能的發(fā)展是前所未有的迅猛,而計(jì)算機(jī)視覺(Computer Vision)無疑是人工智能一個(gè)非常重要的分支,計(jì)算機(jī)視覺的發(fā)展也成為了很多科研人員和業(yè)界開發(fā)人員聚焦的熱點(diǎn)。我們常說的無人駕駛、智能安防、人臉識(shí)別、文字識(shí)別、以圖搜圖、VR/AR、3D重構(gòu)等等都是以計(jì)算機(jī)視覺做為技術(shù)基礎(chǔ)的應(yīng)用實(shí)踐。
在計(jì)算機(jī)視覺項(xiàng)目的開發(fā)中,OpenCV作為最大眾的開源庫,擁有了豐富的常用圖像處理函數(shù)庫,采用C/C++語言編寫,可以運(yùn)行在Linux/Windows/Mac等操作系統(tǒng)上,能夠快速的實(shí)現(xiàn)一些圖像處理和識(shí)別的任務(wù)。此外,OpenCV還提供了java、python、cuda等的使用接口、機(jī)器學(xué)習(xí)的基礎(chǔ)算法調(diào)用,從而使得圖像處理和圖像分析變得更加易于上手,讓開發(fā)人員更多的精力花在算法的設(shè)計(jì)上。
本文主要介紹OpenCV開發(fā)的一些基礎(chǔ)知識(shí)以及入門上手的方法。
1、OpenCV的起源背景
OpenCV誕生于Intel研究中心,其目的是為了促進(jìn)CPU密集型應(yīng)用。為了達(dá)到這一目的,Intel啟動(dòng)了多個(gè)項(xiàng)目,包括實(shí)時(shí)光線追蹤和三維顯示墻。一個(gè)在Intel工作的OpenCV作者在訪問一些大學(xué)時(shí),注意到許多頂尖大學(xué)中的研究組(如MIT媒體實(shí)驗(yàn)室)擁有很好的內(nèi)部使用的開放計(jì)算機(jī)視覺庫(在學(xué)生們間互相傳播的代碼),這會(huì)幫助一個(gè)新生從一個(gè)很高的起點(diǎn)開始ta的計(jì)算機(jī)視覺研究。這樣一個(gè)新生可以在以前的基礎(chǔ)上繼續(xù)開始研究,而不用去從底層編寫基本函數(shù)。
因此,OpenCV的目的是開發(fā)一個(gè)普遍可用的計(jì)算機(jī)視覺庫。在Intel的性能庫團(tuán)隊(duì)的幫助下,OpenCV實(shí)現(xiàn)了一些核心代碼以及算法,并發(fā)給Intel俄羅斯的庫團(tuán)隊(duì)。這就是OpenCV的誕生之地:在與軟件性能庫團(tuán)隊(duì)的合作下,它開始于Intel的研究中心,并在俄羅斯得到實(shí)現(xiàn)和優(yōu)化(這再一次驗(yàn)證了俄羅斯程序員的卓越之處?。?/p>
俄羅斯團(tuán)隊(duì)的主要負(fù)責(zé)人是俄羅斯人Vadim Pisarevsky,他負(fù)責(zé)管理項(xiàng)目、寫代碼并優(yōu)化OpenCV的大部分代碼,在OpenCV中很大一部分功勞都屬于他。跟他一起,Victor Eruhimov幫助開發(fā)了早期的架構(gòu),Valery Kuriakin管理俄羅斯實(shí)驗(yàn)室并提供了很大的支持。在開始時(shí),OpenCV就定下了以下三大目標(biāo):
(1)為基本的視覺應(yīng)用提供開放且優(yōu)化的源代碼,以促進(jìn)視覺研究的發(fā)展。能有效地避免“閉門造車”。
(2)通過提供一個(gè)通用的架構(gòu)來傳播視覺知識(shí),開發(fā)者可以在這個(gè)架構(gòu)上繼續(xù)開展工作,所以代碼應(yīng)該是非常易讀的且可改寫。
(3)本庫采用的協(xié)議不要求商業(yè)產(chǎn)品繼續(xù)開放代碼,這使得可移植的、性能被優(yōu)化的代碼可以自由獲取,可以促進(jìn)基于視覺的商業(yè)應(yīng)用的發(fā)展。
這些目標(biāo)說明了OpenCV的緣起。計(jì)算機(jī)視覺應(yīng)用的發(fā)展會(huì)增加對(duì)快速處理器的需求。與單獨(dú)銷售軟件相比,促進(jìn)處理器的升級(jí)會(huì)為Intel帶來更多收入。這也許是為什么這個(gè)開放且免費(fèi)的庫出現(xiàn)在一家硬件生產(chǎn)企業(yè)中,而不是在一家軟件公司中。從某種程度上說,在一家硬件公司里,在軟件方面會(huì)有更多創(chuàng)新的空間。就像華為這樣的網(wǎng)絡(luò)通訊設(shè)備公司,與硬件相配套的軟件也是非常的強(qiáng)大!
2、OpenCV簡(jiǎn)介
OpenCV的全稱是:Open Source Computer Vision Library。OpenCV是一個(gè)基于BSD許可(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫,可以運(yùn)行在Linux、Windows、Android和Mac OS操作系統(tǒng)上。它是輕量級(jí)的,而且是高效的,由一系列C函數(shù)和少量C++類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。
OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python、Java and MATLAB/OCTAVE的接口。這些語言的API接口函數(shù)可以通過在線文檔獲得。如今也提供對(duì)于C#、Ruby等的支持。
OpenCV是一個(gè)用于圖像處理、分析、機(jī)器視覺方面的開源函數(shù)庫。無論你是做科學(xué)研究,還是商業(yè)應(yīng)用,OpenCV都可以作為你理想的工具庫,因?yàn)閷?duì)于這兩者,它完全是免費(fèi)的。
同時(shí),由于計(jì)算機(jī)視覺與機(jī)器學(xué)習(xí)密不可分,該庫也包含了比較常用的一些機(jī)器學(xué)習(xí)算法,比如圖像識(shí)別、機(jī)器視覺在安防領(lǐng)域有廣泛的應(yīng)用。但很少有人知道,在航拍圖片、街道圖片(例如google street view)中,要嚴(yán)重依賴于機(jī)器視覺的攝像頭標(biāo)定、圖像融合等技術(shù)。
近年來,在入侵檢測(cè)、特定目標(biāo)跟蹤、目標(biāo)檢測(cè)、人臉檢測(cè)、人臉識(shí)別、人臉跟蹤等領(lǐng)域,OpenCV可謂大顯身手,而這些,僅僅是其應(yīng)用的冰山一角。
如今,來自世界各地的各大公司、科研機(jī)構(gòu)的研究人員,共同維護(hù)支持著OpenCV的開源庫開發(fā)。這些公司和機(jī)構(gòu)包括:微軟,IBM,索尼、西門子、google、intel、斯坦福、MIT、CMU、劍橋。
計(jì)算機(jī)視覺市場(chǎng)巨大而且持續(xù)增長(zhǎng),且這方面沒有標(biāo)準(zhǔn)API,如今的計(jì)算機(jī)視覺軟件大概有以下三種:
(1)研究代碼(慢,不穩(wěn)定,獨(dú)立并與其他庫不兼容)
(2)耗費(fèi)很高的商業(yè)化工具(比如Halcon, MATLAB+Simulink)
(3)依賴硬件的一些特別的解決方案(比如視頻監(jiān)控,制造控制系統(tǒng),醫(yī)療設(shè)備)這是如今的現(xiàn)狀。
如果能有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)API,將簡(jiǎn)化計(jì)算機(jī)視覺程序和解決方案的開發(fā),而OpenCV致力于成為這樣的標(biāo)準(zhǔn)API。
OpenCV致力于真實(shí)世界的實(shí)時(shí)應(yīng)用,通過優(yōu)化的C代碼的編寫對(duì)其執(zhí)行速度帶來了可觀的提升,并且可以通過購(gòu)買Intel的IPP高性能多媒體函數(shù)庫(Integrated Performance Primitives)得到更快的處理速度(注:OpenCV 2.0版的代碼已顯著優(yōu)化,無需IPP來提升性能,故2.0版不再提供IPP接口)。下圖為OpenCV與當(dāng)前其他主流視覺函數(shù)庫的性能比較。
3、OpenCV內(nèi)部構(gòu)成
OpenCV主體分為五個(gè)模塊,其中四個(gè)模塊如下所示:
OpenCV的CV模塊包含基本的圖像處理函數(shù)和高級(jí)的計(jì)算機(jī)視覺算法。ML是機(jī)器學(xué)習(xí)庫,包含一些基于統(tǒng)計(jì)的分類和聚類工具。HighGUI包含圖像和視頻輸入/輸出的函數(shù)。CXCore包含OpenCV的一些基本數(shù)據(jù)結(jié)構(gòu)和相關(guān)函數(shù)。
目前,OpenCV的最高版本為OpenCV4.3.0。其中OpenCV3.0和OpenCV2.0的版本相比,改動(dòng)比較大,主要改動(dòng)如下:
(1)大體上保留了OpenCV 2經(jīng)典的C++和Python編程接口風(fēng)格。其中,Python接口大大增強(qiáng),也加入了Python 3.x的支持。一般來說,以前版本的程序只要做少數(shù)修改,就可以使用OpenCV 3了。另外還改善了Java接口,并且加入了MATLAB支持。
(2)架構(gòu)調(diào)整。圖片、視頻編解碼從highgui模塊分離出來,組成了imgcodecs和videoio。原先的OpenCL模塊ocl事實(shí)上與其 它模塊融為一體,而CUDA加速模塊gpu分解成了數(shù)個(gè)以cuda開頭的模塊。此外,除了官方支持的OpenCV代碼,還有一些自發(fā)貢獻(xiàn)的內(nèi)容、不穩(wěn)定的 內(nèi)容,或者版權(quán)尚存爭(zhēng)議的內(nèi)容,都放到了新的倉庫opencv_contrib中。
(3)更多新算法。新版本包括了TLD、魚眼鏡頭模型等全新算法,還包括了一些更高層次可以直接拿來用的高級(jí)封裝,比如汽車檢測(cè)等。
(4)引入T-API,使OpenCL加速更容易。目前可以參考OpenCV源代碼中T-API的范例。可以發(fā)現(xiàn),開啟和關(guān)閉OpenCL加速,只需要一個(gè)語句就夠了。這也就是為什么ocl模塊會(huì)消失了吧。
(5)更多指令集優(yōu)化。除了之前為Intel CPU做的優(yōu)化以外,OpenCV 3還容納了ARM平臺(tái)NEON指令集的支持。通過英特爾的幫助,OpenCV 3對(duì)x86和x64平臺(tái)默認(rèn)使用IPP。下圖是OpenCV3.0中部分函數(shù)得到加速的示意圖。
下面主要介紹OpenCV3.0版本的東西。
OpenCV3.0的sources文件結(jié)構(gòu):
(1)3rdparty/,包含第三方的庫,比如視頻解碼用的 ffmpeg,jpg、png、tiff等圖片的開源解碼庫。
(2)apps/,包含進(jìn)行 haar 分類器訓(xùn)練的工具,opencv 進(jìn)行人臉檢測(cè)便是基于 haar 分類器。如果你想檢測(cè)人臉以外的圖片,千萬不要錯(cuò)過這幾個(gè)工具。
(3)cmake/,包含生成工程項(xiàng)目時(shí) cmake 的依賴文件,用于智能搜索第三方庫,普通開發(fā)者不需要關(guān)心這個(gè)文件夾的內(nèi)容。
(4)data/,包含 opencv 庫以及范例中用到的資源文件,haar 物體檢測(cè)的分類器位于haarcascades子文件中。
(5)doc/,包含生成文檔所需的源文件以及輔助腳本。
(6)include/,包含入口頭文件。opencv 子文件夾中是 C 語言風(fēng)格的API,也就是《Learning OpenCV (第一版)》中描述的API函數(shù),官方將逐漸淘汰 C 風(fēng)格函數(shù),因此我不推薦大家使用該文件夾中的頭文件。opencv2 子文件中只有一個(gè) opencv.hpp 文件,這是 cv2 以及 cv3 推薦使用的頭文件。
(7)modules/,包含核心代碼,opencv 真正的代碼都在這個(gè)文件夾中。opencv 從2.0開始以模塊的方式組織各種功能,近兩年模塊的數(shù)量增長(zhǎng)得很快,后面我會(huì)依次介紹每個(gè)模塊的作用。
(8)platforms/,包含交叉編譯所需的工具鏈以及額外的代碼,交叉編譯指的是在一個(gè)操作系統(tǒng)中編譯供另一個(gè)系統(tǒng)使用的文件。
(9)samples/,范例文件夾。
常用模塊介紹:
(1)androidcamera/,僅用于android平臺(tái),使得可以通過與其他平臺(tái)相同的接口來控制android設(shè)備的相機(jī)。
(2)core/,核心功能模塊,定義了基本的數(shù)據(jù)結(jié)構(gòu),包括最重要的 Mat 類、XML 讀寫、opengl三維渲染等。
(3)imgproc/,全稱為 image processing,即圖像處理。包括圖像濾波、集合圖像變換、直方圖計(jì)算、形狀描述子等。圖像處理是計(jì)算機(jī)視覺的重要工具。
(4)imgcodec/,負(fù)責(zé)各種格式的圖片的讀寫,這個(gè)模塊是從以前的 highgui 中剝離的。
(5)highgui/,高級(jí)圖形界面及與 QT 框架的整合。
(6)video/,視頻分析模塊。包括背景提取、光流跟蹤、卡爾曼濾波等,做視頻監(jiān)控的讀者會(huì)經(jīng)常使用這個(gè)模塊。
(7)videoio/,負(fù)責(zé)視頻文件的讀寫,也包括攝像頭、Kinect 等的輸入。
(8)calib3d/,相機(jī)標(biāo)定以及三維重建。相機(jī)標(biāo)定用于去除相機(jī)自身缺陷導(dǎo)致的畫面形變,還原真實(shí)的場(chǎng)景,確保計(jì)算的準(zhǔn)確性。三維重建通常用在雙目視覺(立體視覺),即兩個(gè)標(biāo)定后的攝像頭觀察同一個(gè)場(chǎng)景,通過計(jì)算兩幅畫面中的相關(guān)性來估算像素的深度。
(9)features2d/,包含 2D 特征值檢測(cè)的框架。包含各種特征值檢測(cè)器及描述子,例如 FAST、MSER、OBRB、BRISK等。各類特征值擁有統(tǒng)一的算法接口,因此在不影響程序邏輯的情況下可以進(jìn)行替換。
(10)objdetect/,物體檢測(cè)模塊。包括haar分類器、SVM檢測(cè)器及文字檢測(cè)。
(11)ml/,全稱為 Machine Learning,即機(jī)器學(xué)習(xí)。包括統(tǒng)計(jì)模型、K最近鄰、支持向量機(jī)、決策樹、神經(jīng)網(wǎng)絡(luò)等經(jīng)典的機(jī)器學(xué)習(xí)算法。
(12)flann/,用于在多維空間內(nèi)聚類及搜索的近似算法,做圖像檢索的讀者對(duì)它不會(huì)陌生。
(13)photo/,計(jì)算攝影學(xué)。包括圖像修補(bǔ)、去噪、HDR成像、非真實(shí)感渲染等。如果讀者想實(shí)現(xiàn)Photoshop的高級(jí)功能,那么這個(gè)模塊必不可少。
(14)stitching/,圖像拼接,可用于制作全景圖。
(15)nonfree/,受專利保護(hù)的算法。包含SIFT和SURF,從功能上來說這兩個(gè)算法屬于features2d模塊的,但由于它們都是受專利保護(hù)的,想在項(xiàng)目中可能需要專利方的許可。
(16)shape/,形狀匹配算法模塊。用于描述形狀、比較形狀。
(17)softcascade/,另一種物體檢測(cè)算法,Soft Cascade 分類器。包含檢測(cè)模塊和訓(xùn)練模塊。
(18)superres/,全稱為 Super Resolution,用于增強(qiáng)圖像的分辨率。
(19)videostab/,全稱為 Video Stabilization,用于解決相機(jī)移動(dòng)時(shí)拍攝的視頻不夠穩(wěn)定的問題。
(20)viz/,三維可視化模塊。可以認(rèn)為這個(gè)模塊實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的三維可視化引擎,有各種UI控件和鍵盤、鼠標(biāo)交互方式。底層實(shí)現(xiàn)基于 VTK 這個(gè)第三方庫。
Cuda加速模塊,cuda 是顯卡制造商 NVIDIA 推出的通用計(jì)算語言,在cv3中有大量的模塊已經(jīng)被移植到了cuda 語言。
(1)cuda/,CUDA-加速的計(jì)算機(jī)視覺算法,包括數(shù)據(jù)結(jié)構(gòu) cuda::GpuMat、 基于cuda的相機(jī)標(biāo)定及三維重建等。
(2)cudaarithm/,CUDA-加速的矩陣運(yùn)算模塊。
(3)cudabgsegm/,CUDA-加速的背景分割模塊,通常用于視頻監(jiān)控。
(4)cudacodec/,CUDA-加速的視頻編碼與解碼。
(5)cudafeatures2d/,CUDA-加速的特征檢測(cè)與描述模塊,與features2d/模塊功能類似。
(6)cudafilters/,CUDA-加速的圖像濾波。
(7)cudaimgproc/,CUDA-加速的圖像處理算法,包含直方圖計(jì)算、霍夫變換等。
(8)cudaoptflow/,CUDA-加速的光流檢測(cè)算法。
(9)cudastereo/,CUDA-加速的立體視覺匹配算法。
(10)cudawarping/,實(shí)現(xiàn)了 CUDA-加速的快速圖像變換,包括透視變換、旋轉(zhuǎn)、改變尺寸等。
(11)cudaev/,實(shí)現(xiàn) CUDA 版本的核心功能,類似 core/ 模塊中的基礎(chǔ)算法。
4、在VS2013中配置使用OpenCV
了解了OpenCV 的數(shù)據(jù)結(jié)構(gòu)和功能后,下面介紹OpenCV 的配置,Win7 64 + VSW2013 + OpenCV3.0步驟。
(1)下載安裝OpenCV 3.0。下載地址:https://opencv.org/releases/。
(2)配置環(huán)境變量:計(jì)算機(jī)屬性->高級(jí)系統(tǒng)設(shè)置->環(huán)境變量->Path->變量值。
(3)配置VS2013。首先打開VS2013建立一個(gè)Win32控制臺(tái)項(xiàng)目。然后,在“項(xiàng)目->工程屬性->vc++目錄”中,加入包含目錄
..opencvuildinclude; ..opencvuildincludeopencv;
..opencvuildincludeopencv2。(..代表opencv安裝的文件夾目錄)
加入庫目錄..opencvuildx64vc12lib。
“項(xiàng)目->工程屬性->鏈接器->輸入->附加依賴”中添加附加依賴項(xiàng)。
opencv_ts300d.lib;opencv_world300d.lib
配置完成后,就可以在VS2013中使用OpenCV3.0中的函數(shù)了。
5、在VS2013中簡(jiǎn)單的調(diào)用OpenCV
經(jīng)過以上的基礎(chǔ)知識(shí)介紹后,就可以進(jìn)行入門的實(shí)踐了。在上面配置完成的工程中,來顯示一幅幅圖片,驗(yàn)證一下是否成功。
在解決方案資源管理器中,打開源文件main.cpp(沒有可以自己創(chuàng)建),添加以下代碼
#include
using namespace cv;
int main(){
Mat src = imread("lena.jpg"); //圖片必須添加到工程目錄下
imshow("src ", src);
waitKey();
}
然后點(diǎn)擊本地Windows調(diào)試器,或者按F5運(yùn)行程序,程序啟動(dòng)后就可以顯示這張圖像了,如下:
6、總結(jié)
本文簡(jiǎn)單的介紹了OpenCV的起源和應(yīng)用領(lǐng)域,以及基本數(shù)據(jù)結(jié)構(gòu)和組成,可以作為OpenCV開發(fā)的一般入門指導(dǎo)。希望能對(duì)大家有所幫助。
-
人工智能
+關(guān)注
關(guān)注
1791文章
46671瀏覽量
237115 -
計(jì)算機(jī)視覺
+關(guān)注
關(guān)注
8文章
1694瀏覽量
45901 -
OpenCV
+關(guān)注
關(guān)注
29文章
625瀏覽量
41215
原文標(biāo)題:計(jì)算機(jī)視覺軟件庫OpenCV的開發(fā)基礎(chǔ)介紹
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論