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