Opencv概述
opencv是什么
OpenCV是一個(gè)用于圖像處理、分析、機(jī)器視覺方面的開源函數(shù)庫.?
????? 無論你是做科學(xué)研究,還是商業(yè)應(yīng)用,opencv都可以作為你理想的工具庫,因?yàn)?#xff0c;對(duì)于這兩者,它完全是免費(fèi)的。該庫采用C及C++語言編寫,可以在windows, linux, mac OSX系統(tǒng)上面運(yùn)行。該庫的所有代碼都經(jīng)過優(yōu)化,計(jì)算效率很高,因?yàn)?#xff0c;它更專注于設(shè)計(jì)成為一種用于實(shí)時(shí)系統(tǒng)的開源庫。opencv采用C語言進(jìn)行優(yōu)化,而且,在多核機(jī)器上面,其運(yùn)行速度會(huì)更快。它的一個(gè)目標(biāo)是提供友好的機(jī)器視覺接口函數(shù),從而使得復(fù)雜的機(jī)器視覺產(chǎn)品可以加速面世。該庫包含了橫跨工業(yè)產(chǎn)品檢測、醫(yī)學(xué)圖像處理、安防、用戶界面、攝像頭標(biāo)定、三維成像、機(jī)器視覺等領(lǐng)域的超過500個(gè)接口函數(shù)。
????? 同時(shí),由于計(jì)算機(jī)視覺與機(jī)器學(xué)習(xí)密不可分,該庫也包含了比較常用的一些機(jī)器學(xué)習(xí)算法。或許,很多人知道,圖像識(shí)別、機(jī)器視覺在安防領(lǐng)域有所應(yīng)用。但,很少有人知道,在航拍圖片、街道圖片(例如google street view)中,要嚴(yán)重依賴于機(jī)器視覺的攝像頭標(biāo)定、圖像融合等技術(shù)。
????? 近年來,在入侵檢測、特定目標(biāo)跟蹤、目標(biāo)檢測、人臉檢測、人臉識(shí)別、人臉跟蹤等領(lǐng)域,opencv可謂大顯身手,而這些,僅僅是其應(yīng)用的冰山一角。
????? 如今,來自世界各地的各大公司、科研機(jī)構(gòu)的研究人員,共同維護(hù)支持著opencv的開源庫開發(fā)。這些公司和機(jī)構(gòu)包括:微軟,IBM,索尼、西門子、google、intel、斯坦福、MIT、CMU、劍橋。。。
OpenCV的全稱,是Open source Computer Vision Library,開放源代碼計(jì)算機(jī)視覺庫。也就是說,它是一套關(guān)于計(jì)算機(jī)視覺的開放源代碼的API函數(shù)庫。這也就意味著,(1)不管是科學(xué)研究,還是商業(yè)應(yīng)用,都可以利用它來作開發(fā);(2)所有API函數(shù)的源代碼都是公開的,你可以看到其內(nèi)部實(shí)現(xiàn)的程序步驟;(3)你可以修改OpenCV的源代碼,編譯生成你需要的特定API函數(shù)。但是,作為一個(gè)庫,它所提供的,僅僅是一些常用的,經(jīng)典的,大眾化的算法的API。一個(gè)典型的計(jì)算機(jī)視覺算法,應(yīng)該包含以下一些步驟:(1)數(shù)據(jù)獲取(對(duì)OpenCV來說,就是圖片);(2)預(yù)處理;(3)特征提取;(4)特征選擇;(5)分類器設(shè)計(jì)與訓(xùn)練;(6)分類判別;而OpenCV對(duì)這六個(gè)部分,分別(記住這個(gè)詞)提供了API。下面我分別就這六個(gè)部分對(duì)一些常見問題進(jìn)行必要的解釋。
??????? 對(duì)于數(shù)據(jù)獲取,計(jì)算機(jī)視覺領(lǐng)域的數(shù)據(jù),無非就是圖片和視頻兩種。圖片,有bmp,jpg,png,tiff....各種壓縮和非壓縮格式。所以,對(duì)壓縮格式的圖片而言,OpenCV內(nèi)部必然包含了對(duì)應(yīng)的圖片解壓縮函數(shù)(一般都是包含了開源的圖片解壓函數(shù)庫,例如,對(duì)于jpg壓縮格式而言,就包含了libjpg開源庫)。而對(duì)于視頻而言,常見的有.rmvb,.avi,.asf等格式,不同的格式,代表著不同的視頻壓縮算法(對(duì)于AVI格式,盡管都是avi格式,但內(nèi)部的壓縮算法仍然不相同。具體原因請(qǐng)參考我的另一篇博客:http://blog.csdn.net/carson2005/article/details/6314089),也就需要對(duì)應(yīng)的解壓算法來解壓。盡管OpenCV提供了一些讀寫視頻文件的API,但是,它也僅僅是一個(gè)接口而已,其內(nèi)部,依然需要調(diào)用相應(yīng)的視頻編解碼器的API來進(jìn)行解碼。常用的視頻編解碼器有:xvid,ffmpeg等。也就是說,如果你想利用OpenCV來進(jìn)行視頻讀寫之類的操作,是需要安裝此類視頻編解碼器的。安裝了相應(yīng)的視頻解碼器之后,你就可以調(diào)用OpenCV的視頻相關(guān)API來進(jìn)行視頻文件的讀取操作了,當(dāng)然,視頻文件被解碼之后,變成了一張一張的圖片,然后才能被OpenCV所處理。另外,還有一種情況,就是數(shù)據(jù)來自于相機(jī),包括數(shù)字相機(jī)和模擬相機(jī)。不管是哪種相機(jī),你都要想辦法獲取到相機(jī)發(fā)送給PC的圖片數(shù)據(jù)(PC在內(nèi)存里面接收到的來自相機(jī)的數(shù)據(jù)可能是jpg格式,也可能是bmp格式)。如果,你在PC內(nèi)存中接收到的是相機(jī)發(fā)送過來的jpg壓縮格式,還需要進(jìn)行圖片數(shù)據(jù)的內(nèi)存解壓。關(guān)于相機(jī)和OpenCV的這部分內(nèi)容,請(qǐng)見我另一篇博客:
http://blog.csdn.net/carson2005/article/details/6243476
??????? 對(duì)于預(yù)處理,一般就是去除或者降低噪聲,光照歸一化,亮度歸一化,模糊化,銳化,膨脹,腐蝕、開閉等這些操作(詳見,岡薩雷斯,《數(shù)字圖像處理》一書)。而對(duì)于這些操作,OpenCV分別(又提到這個(gè)詞了)提供了相應(yīng)API函數(shù)。而光照的預(yù)處理,OpenCV提供了一個(gè)直方圖均衡化的API,后續(xù)可能會(huì)提供一些gammar矯正之類的函數(shù)。
??????? 對(duì)于特征提取,個(gè)人認(rèn)為,可以算是整個(gè)計(jì)算機(jī)視覺系統(tǒng)中最為復(fù)雜也最難的部分(純屬個(gè)人意見,如有異議,請(qǐng)保留),到底什么是特征,該如何來理解這個(gè)看似簡單卻又包羅萬象的名詞呢?其實(shí),要想仔細(xì)解釋,還真的花費(fèi)很多時(shí)間(有興趣的可以看看,Richard O.Duda(著),李宏東(譯),《模式識(shí)別》,機(jī)械工業(yè)出版社)。簡單點(diǎn)說,特征,就是一個(gè)可以將若干個(gè)類別可以盡量分開的一種描述。舉例來說,如果你要進(jìn)行男人和女人的分類,顯然,用“身高和體重”這一描述來衡量,是可以的,但是,這兩個(gè)描述沒有“胸部大小”這一描述更加準(zhǔn)確,而“胸部大小”這一描述,又沒有“喉結(jié)的有無”這一描述更準(zhǔn)確。很顯然,“身高和體重”,“胸部大小”,“喉結(jié)的有無”,這三種描述,都可以用來進(jìn)行男人和女人的分類,只不過,它們對(duì)事物的描述的準(zhǔn)確(或者說全面)程度是不同的,而諸如此類的描述,有一個(gè)更加專業(yè)的稱謂,叫做“特征”。OpenCV里面,提供了一些特征描述的API,比如,對(duì)于人臉檢測而言,它提供了haar特征的API,行人檢測,提供了hog特征的API,甚至,它提供了LBP紋理特征的API。但是,這些還遠(yuǎn)遠(yuǎn)不夠。例如,如果你要進(jìn)行字符識(shí)別,OpenCV并沒有提供字符識(shí)別所對(duì)應(yīng)的特征。這個(gè)時(shí)候,就需要你自己來編程實(shí)現(xiàn)了。當(dāng)然,該選擇什么特征來描述字符呢?哪些特征更好呢?對(duì)于這些問題,我建議你去閱讀相應(yīng)的會(huì)議,期刊,雜志,碩士、博士畢業(yè)論文(畢竟碩士、博士研究生本就該從事“研究”工作),看看別人寫的文章,自然就知道了。
??????? 對(duì)于特征選擇,OpenCV并沒有提供特定的函數(shù)來進(jìn)行衡量。而特征的分類能力的高低評(píng)價(jià),有很多種分析方法,有興趣的朋友,可以閱讀"《機(jī)器學(xué)習(xí)》Tom. Mitchell(著),曾華軍(譯),機(jī)械工業(yè)出版社"這本書;
??????? 對(duì)于分類器部分,OpenCV提供了SVM,CART,boost,bayes,bdt,ANN,這幾種常用的算法。而這些基本已經(jīng)覆蓋了常用的分類器。所以,你需要做的,就是知道怎么調(diào)用其接口,各種分類器的優(yōu)點(diǎn)和缺點(diǎn)(該部分,建議閱讀“機(jī)器學(xué)習(xí)”這本書)。
??????? 通過以上的分析,你或許已經(jīng)發(fā)現(xiàn),OpenCV不過是一個(gè)工具而已。或者,你可以將它理解為幼兒園小朋友過家家玩的積木,而OpenCV中的函數(shù),則可以理解為一個(gè)一個(gè)的積木塊,利用所有或者部分積木塊,你可以快速的搭建起來具體的計(jì)算機(jī)視覺方面的應(yīng)用(比如,字符識(shí)別,車牌識(shí)別,遺留物檢測)。想必你也已經(jīng)發(fā)現(xiàn),在利用OpenCV這個(gè)積木來搭建具體的計(jì)算機(jī)視覺應(yīng)用的時(shí)候,真正核心的,應(yīng)該是這些積木塊,如果你明白了積木塊的工作原理,那么,是不是就可以不用這些積木塊了呢?完全正確!不過,一般部分情況下,我們不需要這么做,因?yàn)?#xff0c;OpenCV已經(jīng)幫你做好了一些工作(已經(jīng)幫你做好了一些積木塊,直接拿來用就是了)。但是,諸如前面提到的特征提取模塊,很多情況下,OpenCV就無能為力了。這個(gè)時(shí)候,你就需要翻閱計(jì)算機(jī)視覺、模式識(shí)別、機(jī)器學(xué)習(xí)領(lǐng)域頂級(jí)會(huì)議、期刊、雜志上面發(fā)表的文章了。然后,根據(jù)這些文章中闡述的原理和方法,來編程實(shí)現(xiàn)你要的東西。實(shí)際上,也就等于搭建一個(gè)屬于你私有的積木塊。其實(shí),OpenCV中的每一個(gè)API函數(shù),也就是這么來的。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)