認識opencv

OpenCV是一個用於圖像處理、分析、機器視覺方面的開源函數庫. 
      無論你是做科學研究,還是商業應用,opencv都可以作爲你理想的工具庫,因爲,對於這兩者,它完全是免費的。
該庫採用C及C++語言編寫,可以在windows, linux, mac OSX系統上面運行。該庫的所有代碼都經過優化,計算效率很高,因爲,它更專注於設計成爲一種用於實時系統的開源庫。opencv採用C語言進行優化,而且,在多核機器上面,其運行速度會更快。它的一個目標是提供友好的機器視覺接口函數,從而使得複雜的機器視覺產品可以加速面世。該庫包含了橫跨工業產品檢測、醫學圖像處理、安防、用戶界面、攝像頭標定、三維成像、機器視覺等領域的超過500個接口函數。
      同時,由於計算機視覺與機器學習密不可分,該庫也包含了比較常用的一些機器學習算法。或許,很多人知道,圖像識別、機器視覺在安防領域有所應用。但,很少有人知道,在航拍圖片、街道圖片(例如google street view)中,要嚴重依賴於機器視覺的攝像頭標定、圖像融合等技術。
      近年來,在入侵檢測、特定目標跟蹤、目標檢測、人臉檢測、人臉識別、人臉跟蹤等領域,opencv可謂大顯身手,而這些,僅僅是其應用的冰山一角。
      如今,來自世界各地的各大公司、科研機構的研究人員,共同維護支持着opencv的開源庫開發。這些公司和機構包括:微軟,IBM,索尼、西門子、google、intel、斯坦福、MIT、CMU、劍橋。。。。 
          儘管之前寫過一篇關於OpenCV的介紹(http://blog.csdn.net/carson2005/article/details/5822149),但依然有朋友對其不甚瞭解。所以,經常能碰到有人問我諸如以下一些問題: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函數,也就是這麼來的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章