OpenCV OpenCV是一個(gè)很流行的圖像處理庫(kù),它為圖像處理算法研究提供了很好的平臺(tái),甚至很多產(chǎn)品在OpenCV的基礎(chǔ)上稍作修改就可以達(dá)到目標(biāo)。有關(guān)OpenCV的介紹,abruzzi有一篇不錯(cuò)的介紹帖子(
http://www.javaeye.com/topic/463668),所以這里就不再做詳細(xì)介紹。
Why OpenCV + Ruby ? 學(xué)院派的圖像處理研究者喜歡用MATLAB,而實(shí)際產(chǎn)品開發(fā),則用C/C++居多,特別是嵌入式系統(tǒng),最終都要用C/C++重新實(shí)現(xiàn)算法甚至要用匯編優(yōu)化部分代碼。
當(dāng)然,很多公司是學(xué)院派和工程派兼之。
用MATLAB的好處是可以快速實(shí)現(xiàn)算法,缺點(diǎn)是當(dāng)你想把算法變成產(chǎn)品的時(shí)候,要經(jīng)過一個(gè)比較長(zhǎng)的過程,要把算法用C/C++再實(shí)現(xiàn)一遍。
OpenCV本身就是用C++寫的,而且很多算法已經(jīng)經(jīng)過了優(yōu)化,性能不錯(cuò)。因此如果直接基于OpenCV開發(fā)算法,在最終轉(zhuǎn)化為產(chǎn)品的時(shí)候就很方便。
直接基于OpenCV開展算法研究的一個(gè)最大問題是缺乏快速驗(yàn)證的平臺(tái)。雖然OpenCV提供了highgui用于簡(jiǎn)單的結(jié)果展示,但是離“方便”還是缺很遠(yuǎn)。我過去是用VC/MFC構(gòu)建開發(fā)平臺(tái),提供了很多方便的功能輔助算法研究,但是平臺(tái)的構(gòu)建和維護(hù),以及功能的增加都要花費(fèi)巨大的努力,算法研究人員要為維護(hù)平臺(tái)而煞費(fèi)苦心。
一個(gè)通用的,易于維護(hù),可擴(kuò)展的平臺(tái)對(duì)圖像處理算法研究非常有幫助。
Ruby語言擁有容易學(xué)習(xí),語法優(yōu)雅,表達(dá)能力強(qiáng)的特點(diǎn),而且加上RubyGnome2 GUI庫(kù),可以很方便地實(shí)現(xiàn)理想中的圖像處理算法研究平臺(tái)。
另外,還有其他幾個(gè)因素使得Ruby適合做這樣的平臺(tái):
1. RubyInline可以讓你在ruby程序中嵌入C代碼,這對(duì)于嘗試一些貼近底層的算法調(diào)整非常方便。
2. Ruby的C擴(kuò)展還算比較容易編寫。
3. Ruby是動(dòng)態(tài)語言,可以方便地為平臺(tái)增添插件功能,或者提供一個(gè)腳本控制臺(tái)。
在這里不能不提到Python,Python是一門優(yōu)秀的腳步語言,也有很多庫(kù)支持,特別是OpenCV官方就提供了Python的綁定。用Ruby或是Python只是個(gè)人喜好的問題。
Tui Image Studio 這是一個(gè)用Ruby寫的,支持OpenCV的跨平臺(tái)圖像算法研究平臺(tái)軟件。它為圖像處理研究提供了許多基本設(shè)施,例如直方圖查看,區(qū)域分割與選擇,攝像頭連接等,而更多的圖像處理算法則通過插件的形式來提供。
當(dāng)你想嘗試一個(gè)新的算法的時(shí)候,如果現(xiàn)有的插件中不能實(shí)現(xiàn),就可以新寫一個(gè)插件。多個(gè)插件可以以鏈接的方式協(xié)同工作,當(dāng)然插件也可以暴露供外部調(diào)用的接口。
插件的界面和流程控制用ruby編寫。當(dāng)需要用C的時(shí)候,你可以編寫C擴(kuò)展或者直接在插件的ruby代碼中嵌入C代碼,Tui平臺(tái)會(huì)通過RubyInline自動(dòng)為你編譯。
通常情況下,為OpenCV本身提供的功能編寫插件,包括UI代碼都在100行以內(nèi)。
在Tui中算法驗(yàn)證通過以后,把這個(gè)算法在實(shí)際產(chǎn)品中實(shí)現(xiàn)則相對(duì)簡(jiǎn)單:因?yàn)槎际腔贠penCV,增加的算法代碼也都是用C寫的。
你編寫的插件越多,積累的算法也就越多,下一步算法研究也就越容易。
另外,Tui平臺(tái)還提供分布式處理工具:有些算法需要巨大的運(yùn)算量,要對(duì)一個(gè)數(shù)萬張圖片的圖庫(kù)驗(yàn)證一個(gè)算法需要很長(zhǎng)的時(shí)間,這個(gè)時(shí)候你就需要幾臺(tái)或數(shù)十臺(tái)PC來進(jìn)行并行運(yùn)算。Tui為你提供了這樣的便捷工具,你可以發(fā)布你的插件到所有安裝了Tui的機(jī)器并分配驗(yàn)證任務(wù),最后收集結(jié)果報(bào)告。
Tui Image Studio截圖:
圖中演示了Canny邊緣檢測(cè),直方圖,高通濾波,以及一個(gè)從攝像頭獲取實(shí)時(shí)視頻并做人臉檢測(cè)的插件。
Conclusion OpenCV+Ruby為圖像處理研究提供了一個(gè)利器,可以快速驗(yàn)證算法并平滑過渡到最終產(chǎn)品。Ruby用作GUI程序開發(fā)已不僅僅是玩具而已,RubyGnome2可以用于開發(fā)復(fù)雜的,嚴(yán)肅的桌面應(yīng)用程序。