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