?????OpenCV是一個由Interl公司支持的開源機器視覺庫,關于它的介紹,網上隨便一搜就車載斗量。這里我不談OpenCV的主要內容,而是將這段時間來對它的使用心得作個簡單介紹,以啟發打算用這個庫的朋友的思路,與大家一起來分享。
???? 我在學校的時候,雖然是圖像處理研究方向,但真正具體的應用到圖像的很多東西,還是在參加工作以后的事。以前在處理圖像的時候,我們從不擔心速度的問題,以為計算機硬件發展到今天,無所不能的了,雙核乃至四核的處理速度簡直要趕上宇宙飛船了。但用在機器視覺上,那又是另外一碼事。通常而言,機器視覺要求對圖像的處理速度都是以毫秒(ms)為單位,具體而言是幾點幾個毫秒,硬件再硬,如果算法不好,速度就永遠提不上去,所以速度還是至關重要的東西,并不是所謂由硬件技術就決定了的。
??? ?速度是一個方面,精度又是另一個重要方面了。視覺中對精度的要求,通常是以亞像素標準來衡量的。所以對圖像處理的算法,不是一般的算法來解決,往往都得使用子像元算法,這樣才能達到亞像素標準。通常我們對一幅圖像的像素坐標都是用整數計算,但在機器視覺中普遍采用亞像素標準,都是浮點數來計算的。但有的雖然寫出來的是浮點數,未必就是用的子像元算法,它的結果根本就不是亞像素。視覺中精度的要求,也是要求極高,一般以微米(um)為計量單位,像幾點幾個微米,而只有使用子像元算法才能真正達到這個要求。
??? 總的說來,目前國內還沒有一個真正意義上的成功的機器視覺開發包,國內的機器視覺方面的大公司基本上還是以代理國外的軟件為主。一方面固然是國內的起步晚,但我覺得更多原因還是國內在這方面沒有下功夫去做一些基礎性的研究工作,總是靠代理別人的東西來實現一個視覺系統的開發。而OpenCV就是一個在機器視覺方面基礎工作做得最好的。
??? 總的說來,OpenCV提供的函數庫涉及的方面很廣,圖像處理功能強大,但它僅僅是供研究的一個基礎的東西,并不是一計膏藥,往哪一貼哪就好使。我們只有在借助它提供的一些基礎功能上進行深入研究,才能開發出屬于自己的產品來。
???? OpenCV作為一個開源的函數庫,為我們提供了很多方便,看它的源代碼,確實有很多值得學習的獨到地方。但作為開源的,局限也就在此。它的很多東西并不是最優的,如果真要那樣,直接就可以拿來在商業上運用了。所以,我們只有不斷的對它進行改造,才能更貼近我們的應用,這里結合我在使用的幾處加以說明。
???? 首先是圖像的定位。OpenCV也提供了一個圖像匹配的函數,這個函數還是寫的不錯的,但要直接用到商業上就不行了。因為它的處理速度很慢,精度也不是亞像素的,而且沒有旋轉。它僅僅是一個單純的灰度定位。要怎么用好這個函數呢,在使用這個函數的時候,我還是下了很多功夫的,對此做了一些改進,讓它真正的實現了商業價值。如今我用OpenCV編寫的定位軟件,其速度和精度絲毫不比國外的那些名牌軟件差多少,像halcon和sapera這樣的軟件巨頭,我用OpenCV做出來的定位效果,比如一幅分辨率為1280*1024的圖像,它們的速度是幾個毫秒,而我做出來的也最多多3至4個毫秒,精度也差不多,但由于OpenCV本身不是亞像素的局限所在,所以精度通常在一個像素左右。???
??? 再說說幾何定位,halcon是采用基于幾何形狀的算法來進行定位的,可以說做得非常的好,好就好在它的模版圖像形狀可以任意選取,任意旋轉。而Sapera的基于邊緣輪廓的定位還要上一個層次,關于它的算法,目前還沒有人了解,至今還是個謎。在很多機器圖像定位上,幾何定位效果更好,更準確。灰度定位在一些圖像區域直方圖相近似的情況下,往往很難找準目標區域。而幾何定位,根據區域的幾何特征來做出判斷,不單準確,而且執行起來效率更高。目前我用OpenCV做的幾何定位總體上說效果還不錯,但精度還趕不上,在圖像邊緣的離合上還不那樣準確,不過在后續的研究中,還是會趕上的。
???? 一般而言,對于圖像的目標區域都是有形狀的,但在實際運用中,我遇到一個客戶只要求定位直線的,由于直線不屬于一個有形狀的區域,它的特征很難描述,所以看似最簡單的卻最難辦。OpenCV采用Hough變換來檢測直線和圓,效果也并不好。因為Hough變換的實質也就是兩種不同空間的映射,它在噪聲大的圖像中,檢測出來的結果千奇百怪。所以要準確的找到邊,必然得對圖像做好預處理,讓處理后的邊緣很明顯表現出來,再進行Hough檢測就容易多了。
??? 在機器視覺中,Blob分析是要經常遇見的,OpenCV也有Blob跟蹤的實例,但我沒去認真用過,而是自己做了個算法采用它也實現了,且效果也不錯。我在做一個啤酒瓶磨具號碼檢測的項目里,就調用了自己設計的Blob分析算法,效果都還不錯。在具體使用中,往往要用到我們自己定義的圖像類型,于是我又把OpenCV里的IplImage結構進行了改造,然后定義了屬于自己的圖像類,可以隨意讀取,這樣方便了很多。其實OPenCV里面對文件的操作寫得相當好,非常方便。
??? 總的來說,OpenCV是一個非常不錯的開源項目,有很多東西需要我們去學習。但它的源代碼,要讀明白也非易事。因為它涉及到大量的宏定義,很多函數語句都是些宏定義在里面,還互相嵌套,看起來相當的困難。而且本人接觸它的時間也不過兩三個月,所以理解得也不透徹。還得一邊用一邊學,在實踐中摸索和消化。在此只為提示一個思路而言,個中算法不便言明,否則老板看見,定然要批評了。商場如戰場,一切都要做好保密工作,哈哈!