1.1?視頻中的車流量統(tǒng)計(jì)
最開始接觸圖像處理應(yīng)該是在2011年的華中地區(qū)大學(xué)生數(shù)學(xué)建模上。當(dāng)時(shí)有道題很有意思,給了一段約5分鐘的道路交通視頻,然后要求我們用數(shù)學(xué)模型統(tǒng)計(jì)視頻中的車流量。
說高大上一點(diǎn)就是用數(shù)據(jù)通訊傳輸技術(shù)、電子控制技術(shù)、計(jì)算機(jī)處理技術(shù)等方法實(shí)現(xiàn)對(duì)視頻的分析與處理,提取關(guān)鍵信息,便于報(bào)警、記錄、分析等,只是這個(gè)題目是統(tǒng)計(jì)視頻中的車輛總數(shù)。于是查了下資料發(fā)現(xiàn)MATLAB提供了視頻提取和圖像處理包,而且數(shù)字圖像在電腦上就是M*N*P的矩陣,其中P是通道數(shù),比如RGB圖像通道數(shù)就是3,灰度圖像通道數(shù)單一就是1。
MATLAB在矩陣處理方面具有很好地優(yōu)勢(shì),又剛好學(xué)過MATLAB的課程,所以就選用MATLAB進(jìn)行模型的建立。
這里有個(gè)小細(xì)節(jié),用MATLAB加載視頻的時(shí)候始終失敗,需要安裝xvid解碼器,這樣MATLAB就可以加載視頻文件了。MATLAB可以獲取的視頻文件的基本信息有,文件名、文件大小、時(shí)間、幀率FPS、總幀數(shù)等。
對(duì)于每一幀圖像,我們可以得到信息是,它是一個(gè)288(height)*352(width)*3(RGB)的三維像素矩陣,每個(gè)數(shù)據(jù)的范圍都在0~255,也就是用無符號(hào)8位數(shù)來表示顏色值,比如在點(diǎn)(50,50)處的像素值是(0,0,0)就代表那個(gè)點(diǎn)是黑色,如果是(255,255,255)就是白色,(255,0,0)則是紅色。
即每個(gè)點(diǎn)的顏色是通過R,G,B紅綠藍(lán)這三種按照不同比例混合而成的??紤]三維矩陣的處理比較麻煩,數(shù)據(jù)量大,就先對(duì)圖像進(jìn)行一個(gè)處理,比如變成灰度圖像或二值化圖像。
效果如下:
一般灰度圖像是對(duì)于某個(gè)的像素值RGB進(jìn)行一個(gè)算術(shù)平均或者其他權(quán)重進(jìn)行處理,這樣圖像的通道數(shù)就由3變?yōu)榱?,可以大大減少計(jì)算量。
而二值化圖像又是灰度圖像進(jìn)行再處理,高于某個(gè)閾值的全是1,低于某個(gè)閾值是全0,這樣的圖像矩陣?yán)锩婢椭挥?和1了,非黑即白。
很明顯轉(zhuǎn)換成灰度后的圖像更清楚,而二值化處理后的圖像顏色比較深的車易被忽略掉。
因此,我們采取了對(duì)每一幀圖像進(jìn)行灰度處理。對(duì)于車流量的統(tǒng)計(jì),常用的算法有背景差分法、幀差法、邊緣檢測(cè)法、灰度比較法等,其中
幀差法是將相鄰的兩幀圖片相減,按車道開固定窗口對(duì)保留的運(yùn)動(dòng)車輛信息進(jìn)行檢測(cè),環(huán)境光線的變化對(duì)其影響不大,但該方法常因車輛換道或相鄰車道的車輛部分覆蓋了被檢測(cè)車道檢測(cè)窗而引起誤檢。
邊緣檢測(cè)法能夠在不同的光線條件下檢測(cè)到車輛的邊緣。然而,當(dāng)車輛色彩較暗或位于陰影中,使車輛邊緣模糊,則可能引起漏檢。
灰度比較法常用于對(duì)路面和車輛的灰度值進(jìn)行比較來檢測(cè)是否有車,其算法簡(jiǎn)單,計(jì)算量小,易于實(shí)現(xiàn),盡管該方法受光線影響較大。
不過對(duì)于這些方法當(dāng)時(shí)也沒時(shí)間去仔細(xì)研究和實(shí)踐,就想了一個(gè)簡(jiǎn)單粗暴的方法。
我們仔細(xì)研究了每一幀圖像,因?yàn)榕臄z角度是固定的,圖像大小固定,車道在圖像也是固定的,只是車在不斷變化。圖像中的車道寬度大概在30個(gè)像素,而車寬肯定小于每個(gè)車道的寬度,所以決定在每個(gè)車道畫出一條黑色實(shí)線,我們稱之為虛擬檢測(cè)線。如下圖。
這里選取的檢測(cè)線還是有講究的,基本在靠近攝像頭的位置,距離太遠(yuǎn)車道和車輛比較模糊,其次每個(gè)車道的檢測(cè)線沒有在同一條線上,但也不能相隔太遠(yuǎn)防止車輛變道。
然后不斷for循環(huán)遍歷當(dāng)前幀與前一幀在這個(gè)檢測(cè)線上的像素值是否有變化,有變化則說明有車輛經(jīng)過,但不是說有變化就統(tǒng)計(jì)加1。因?yàn)閷?shí)際車輛經(jīng)過檢測(cè)線這個(gè)過程中,圖像像素也會(huì)產(chǎn)生微小變化,比如車窗顏色和車頭或車位的差異。
所以還要考慮車輛完全通過后前后兩幀的圖像像素沒有變化。因此,具體如何判別車輛完全經(jīng)過圖像,我們需要考慮一個(gè)累計(jì)值。
當(dāng)?shù)谝淮纬霈F(xiàn)變化時(shí)便設(shè)置一個(gè)標(biāo)識(shí)符,簡(jiǎn)單說就是一個(gè)flag,然后連續(xù)往后考察很多幀的值是否有變化,并且是按每條車道去單獨(dú)統(tǒng)計(jì)車流量,最后加起來算總和。偽碼如下:
temp ? ? ? ? ? ?虛擬檢測(cè)線上灰度值的基準(zhǔn)值 temp(i) ? ? ? ? 第i幀圖片虛擬檢測(cè)線上的灰度值 sum ? ? ? ? ? ? 統(tǒng)計(jì)的車輛數(shù) T ? ? ? ? ? ? ? 閥值 for ?i=1:n ? ? ? ? ? ? ? ? ? ? ? ? ? 一幀一幀的比較 ? ? if ?|temp-temp(i)| > T ? ? ? ? 判斷是否達(dá)到閥值 ? ? ? sum + = 1; ? ? ? ? ? ? ? ? 滿足條件,計(jì)數(shù) end
最后我們通過這種方法得到的結(jié)果是這段視頻的車輛總數(shù)是261,與標(biāo)準(zhǔn)的272相比,誤差為4.04%。
分析主要原因是視頻中某些車的顏色和路面相近或者光照影響,又經(jīng)過灰度處理后導(dǎo)致模型計(jì)算時(shí)并沒有把車輛統(tǒng)計(jì)進(jìn)去,當(dāng)然也有車輛變道同時(shí)占據(jù)兩個(gè)車道被統(tǒng)計(jì)了兩次的情況。
于是就很自然的想用雙線檢測(cè)線會(huì)不會(huì)準(zhǔn)確,效果小。
我們就只考察一個(gè)車道,看準(zhǔn)確率是否會(huì)提高,雙線畫線的邏輯顯然跟單線的不一致,具體如下:
1.上下兩條檢測(cè)線記為a,b。車先經(jīng)過a,然后再經(jīng)過b。
2.兩條采樣線的長(zhǎng)度均為30個(gè)像素,相距為5個(gè)像素。
3.對(duì)于第n幀圖,只在一條線上檢測(cè)到差值變化信號(hào)不能直接斷定有車。僅當(dāng)a,b同時(shí)出現(xiàn)較大差值的變化時(shí),可以認(rèn)定當(dāng)前確實(shí)有一輛車經(jīng)過。
4.同理,在一定范圍內(nèi)增加更多的檢測(cè)線可以更好的提高檢測(cè)精度,但必須保證兩端最外邊線的間距小于一般的車長(zhǎng)。
5.具體實(shí)現(xiàn)采用兩個(gè)數(shù)組standard1(1:30)和standard2(1:30)來實(shí)現(xiàn),分別記錄兩條標(biāo)準(zhǔn)線上的各點(diǎn)灰度值。
而且我們發(fā)現(xiàn)這樣的雙線檢測(cè)的方法還能粗略計(jì)算一下車速用于判斷是否超速,方法如下:
1.在上采樣線檢測(cè)到差值差值信號(hào)瞬間時(shí),記錄下此時(shí)的幀數(shù)n,隨后下采樣線檢測(cè)到差值信號(hào)的瞬間,再記錄下那個(gè)時(shí)刻的幀數(shù)m。
2.每一秒含有25幀圖像。即相鄰兩幀時(shí)差為0.04秒。
3.實(shí)際中的上下采樣線的距離可以測(cè)量。我們?cè)O(shè)為D。
4.則汽車通過的速度為V=D/[(m-n)/25],即V=25×D/(m-n)。
此外,關(guān)于閾值的計(jì)算,顯然由于每一個(gè)車道的光照不同,視角不同,選用一個(gè)差值作為一個(gè)統(tǒng)一的標(biāo)準(zhǔn)顯然是不可靠的。所以需要根據(jù)不同的車道,需要賦予了個(gè)適當(dāng)?shù)拈y值。
為了計(jì)算每個(gè)車道的最大閥值,我們采用的是靜態(tài)取點(diǎn),即在車道附近一定范圍內(nèi)取一些不受車影響的而且有代表的點(diǎn)。計(jì)算整個(gè)過程中那些靜態(tài)點(diǎn)差值的變化,以變化的最大值作為該車道的閥值,最后得出來是50。
不過由于比賽時(shí)間有限(僅三天),而且知識(shí)面有限,很多想法也不知道怎么實(shí)現(xiàn),很多圖像處理的方法也不了解。最后就草草收?qǐng)隽耍迷谶€拿了一個(gè)小獎(jiǎng)。
1.2 賽后小感
過了這么多年回過頭再看這次比賽,還是覺得挺不容易的。畢竟當(dāng)時(shí)不懂的東西太多,還不到大三,很多知識(shí)都是現(xiàn)學(xué)的,對(duì)于模型完全是自創(chuàng)的一個(gè)新方法。
雖然僅限這道題、這個(gè)特定環(huán)境下的模型,也沒什么擴(kuò)展性、計(jì)算實(shí)時(shí)性、誤差來源分析、不同方法比較等,主要都沒怎么參考論文啥的,也不知道如何查閱論文。
比賽期間除了技術(shù)實(shí)現(xiàn),還要寫類似“八股文”一樣?xùn)|西,比如為什么選用這個(gè)模型/方法,做這個(gè)模型有什么假設(shè)或前提,模型的優(yōu)缺點(diǎn),模型的改進(jìn)等等,都快趕上寫學(xué)術(shù)研究論文了,時(shí)間太緊張。
不過也正因?yàn)榇?,奠定了我在圖像處理和學(xué)術(shù)研究的基礎(chǔ),而且感覺圖像處理還挺容易上手的,尤其是在計(jì)算機(jī)中,我們把它看成一個(gè)數(shù)字矩陣,圖像處理的基本所有方法都可以看作是對(duì)這個(gè)數(shù)字矩陣做各種變換,從而可以得到不同效果,還挺有意思的。
2 機(jī)器人的視覺研究
2.1 研究背景
2013年的時(shí)候加入智能體研究基地團(tuán)隊(duì)(Base of Intelligent Agent Research),實(shí)驗(yàn)室有一個(gè)雙輪差動(dòng)的輪式移動(dòng)機(jī)器人,移動(dòng)平臺(tái)是英集斯自動(dòng)化公司提供的。其中運(yùn)動(dòng)電機(jī)為24V/70W 高性能空心杯MAXON電機(jī),配有減速比為33:1的減速箱,同軸安裝有500 線的光電編碼器以確保電機(jī)控制的精度。
上位機(jī)可通過向DSP(TMS320LF2407)運(yùn)動(dòng)控制卡發(fā)送控制命令,驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng)實(shí)現(xiàn)機(jī)器人的移動(dòng)。上位機(jī)和下位機(jī)通過RS232串口通信,示意圖如下。
現(xiàn)在的機(jī)器人硬件系統(tǒng)應(yīng)該都是這么搭建的吧(大同小異),當(dāng)然這篇文章不是討論機(jī)器人,而是討論視覺在機(jī)器人上的應(yīng)用,對(duì)研究機(jī)器人感興趣可移步至《ROS與機(jī)器人》。
機(jī)器人的下位機(jī)接口已被廠商開發(fā)好了,對(duì)于上位機(jī),其實(shí)也就是一臺(tái)T2350/1.86GHz/0.99GB的WinXP工控機(jī),只需調(diào)用運(yùn)動(dòng)控制接口,下發(fā)速度指令即可。從上面的系統(tǒng)框圖可以看出,有了這個(gè)機(jī)器人平臺(tái)可以做很多方面的研究,比如激光SLAM導(dǎo)航,語音識(shí)別,機(jī)器人視覺等。
因?yàn)橹坝羞^比賽的經(jīng)驗(yàn),個(gè)人覺得有在圖像處理方面有一點(diǎn)基礎(chǔ),而且當(dāng)時(shí)有個(gè)博士師兄正好在研究人臉識(shí)別,對(duì)OpenCV及其環(huán)境的搭建很熟,所以我決定嘗試研究下機(jī)器人視覺。
首先是使用kinect一代的深度相機(jī),安裝kinect SDK后里面就自帶一些教程,可以看到RGB圖像和深度圖像,也有骨骼識(shí)別、手勢(shì)識(shí)別等例程。
kinect一代底座有個(gè)馬達(dá)可以調(diào)節(jié)鏡頭的視角,有點(diǎn)像一根連桿支撐上面的鏡頭,因此當(dāng)移動(dòng)機(jī)器人的時(shí)候,很明顯感覺畫面在晃動(dòng),而且畫面有幾百毫秒的延時(shí),圖像質(zhì)量也不是太好。
于是果斷換Logitech的USB攝像頭,并開始看《OpenCV(中文版)》,O'Reilly出版社,也是于仕琪團(tuán)隊(duì)翻譯的。當(dāng)時(shí)書里面還是講的OpenCV1.0的語法,還是用的IplIMage方法去操作圖像,我用的版本是2.4.4,好在差別不算太大。
2.2 OpenCV基礎(chǔ)知識(shí)
這里簡(jiǎn)單介紹下圖像處理的常用方法,無論是Windows還是Ubuntu下安裝OpenCV網(wǎng)上都有太多教程,版本越新越好,功能越強(qiáng)大。
安裝OpenCV的時(shí)候可以留一下它又所依賴的庫,比如與硬件通訊相關(guān),圖像壓縮與解碼等,這也是調(diào)用OpenCV中的API便可以加載圖片或攝像頭或視頻的原因。
2.2.1 圖像/視頻的基本操作
正如1.2節(jié)所說,圖像在計(jì)算機(jī)中是以數(shù)字矩陣的方式呈現(xiàn),所以對(duì)于圖像的操作就是對(duì)矩陣的操作。矩陣的常用操作無非是創(chuàng)建一個(gè)新矩陣,相加,相減,左乘,右乘,復(fù)制,取塊矩陣等。
尤其是取圖像中某一塊矩陣,還取了一個(gè)很好聽的名字,叫感興趣區(qū)域(ROI,region of interest),比如選取一塊矩形、橢圓區(qū)域等,將其填充為黑色或白色等。
因此,對(duì)于矩陣運(yùn)算,除了Eigen庫外,OpenCV偶爾也可派上用場(chǎng)。
雖然OpenCV還是沒能像MATLAB操作矩陣那么方便,但我發(fā)現(xiàn)越往后API封裝得簡(jiǎn)直越來越好,Mat類、imshow、imwrite、subplot等等這些都跟MATLAB的語法一樣或類似了。
這里需要注意的有兩點(diǎn),OpenCV里面儲(chǔ)存彩色圖像的順序是BGR;再就是圖像的元素類型,一般是8U(即 8 位無符號(hào)整數(shù),范圍0~255),也可以是16S、32F等,對(duì)應(yīng)C/C++中 uchar 、 short 、 float 等基本數(shù)據(jù)類型。
在做圖像變換時(shí),尤其要注意圖像的類型,防止計(jì)算時(shí)超出范圍而造成程序運(yùn)行崩潰。
其次,OpenCV提供了一些簡(jiǎn)單的回調(diào)函數(shù)進(jìn)行交互,如鍵盤響應(yīng)事件,鼠標(biāo)響應(yīng)事件和滾動(dòng)條控制器等。不過真正要開發(fā)GUI的話,這幾個(gè)事件響應(yīng)應(yīng)該是不夠的。
最后補(bǔ)充一點(diǎn),彩色圖像用RGB去表示是因?yàn)榧t綠藍(lán)是最基本的三原色光,它們按不同比例相加可以得到其他任何顏色。這種加色法廣泛應(yīng)用于電子系統(tǒng)中,也是最常見的和比較容易理解的。
除了RGB顏色模型外,還有其他的方法表征顏色,比如HSV模型(Hue表示顏色,Saturation表示飽和度,Value表示亮度)。
OpenCV還提供了API用于不同顏色模型的轉(zhuǎn)換,對(duì)于圖像的增強(qiáng)和色調(diào)濾鏡,使用HSV空間去分析就具有很好的效果。
2.2.2 閾值分割與形態(tài)學(xué)
對(duì)灰度圖像完成的閾值化操作稱為灰度圖像二值化,簡(jiǎn)稱圖像二值化。
我一般喜歡稱之為閾值分割,這是一個(gè)很常用的處理方式,大致思路是比如8U類型的圖像,大于某個(gè)閾值T我就設(shè)定為0,小于T的保持不變,這樣很亮的地方就被黑色遮蓋住了,稍微灰暗的地方就會(huì)凸顯出來,所以對(duì)于圖像的二值化處理可以不僅限于單通道的灰度圖像,多通道的圖像也同樣可以,得到的效果也顯然不一樣。
閾值分割又可細(xì)分為5類:二值化,二值化反,閾值截?cái)啵撝等×愫烷撝等×惴?,看字面意思也基本能看出這幾種方法的差異,就是對(duì)于給定的閾值進(jìn)行不同的邏輯操作。
但絕大多數(shù)情況下,我們很難人為的找準(zhǔn)閾值,于是便有了自適應(yīng)閾值方法。
這里得先引入一個(gè)概念就是圖像直方圖,比如8U的圖像,矩陣中所有值的范圍都在[0,255],然后將0~255當(dāng)作X軸,0~255這256個(gè)值分別有多少個(gè)顯示在Y軸上,這樣的圖便稱為圖像直方圖,如下。實(shí)際上這樣的圖在手機(jī)拍照的詳細(xì)信息中可廣泛看到。
自適應(yīng)閾值方法中OTSU和Triangle 都是基于直方圖分布實(shí)現(xiàn)的全局閾值計(jì)算的方法,其中OTSU的是通過計(jì)算類間最大方差來確定分割閾值的閾值選擇算法,而Triangle三角法基于直方圖的單峰與斜邊的最大距離確定閾值。
因此,OTSU 算法對(duì)直方圖有兩個(gè)峰,中間有明顯波谷的直方圖對(duì)應(yīng)圖像二值化效果比較好;Triangle三角法對(duì)直方圖單峰分布的圖像效果比較好,主要用于凸顯最明顯的那塊區(qū)域,比如細(xì)胞壁檢測(cè)。
圖像形態(tài)學(xué)的操作有一個(gè)結(jié)構(gòu)元素,或者叫滑動(dòng)窗口。結(jié)構(gòu)元素不是一個(gè)像素,而且一個(gè)幾何形狀的像素塊,比如矩形 、十字交叉 、圓形等。
這個(gè)結(jié)構(gòu)元素從左至右、從上到下遍歷整個(gè)矩陣,并按照一定規(guī)則處理結(jié)構(gòu)元素對(duì)應(yīng)矩陣塊里的數(shù)值。
比如當(dāng)矩陣塊里的數(shù)值與結(jié)構(gòu)元素的一致時(shí),不進(jìn)行處理;有不一致全部按0處理,這樣白色區(qū)域變會(huì)減少,也就是圖像的腐蝕,如下圖所示的示意圖。
如果對(duì)于上述描述的過程進(jìn)行相反操作,那么圖像的白色區(qū)域變會(huì)擴(kuò)大,這就是膨脹。
腐蝕和膨脹還可以組合起來對(duì)圖像進(jìn)行操作,比如開運(yùn)算是對(duì)輸入圖像執(zhí)行先腐蝕后膨脹操作,而閉運(yùn)算是對(duì)圖像執(zhí)行先膨脹后腐蝕操作。
腐蝕可對(duì)圖像進(jìn)行局部縮小,碰撞可對(duì)圖像進(jìn)行局部放大,因此開運(yùn)算可有效清除二值圖像中小的白色噪聲像素塊凸顯高亮區(qū)域,閉運(yùn)算則能填充二值圖像中小的黑色像素凸顯灰暗區(qū)域。個(gè)人覺得這些概念沒必要特意去記住,具體情形具體分析即可。
其次連通區(qū)域分析,它主要通過掃描圖像中的每個(gè)像素點(diǎn),對(duì)像素值相同且相互連通像素點(diǎn)標(biāo)記為相同的標(biāo)簽,最終將像素點(diǎn)相同的區(qū)域連成一個(gè)閉合回路。掃描的方式可以是從上到下,從左到右,也可以是基于每個(gè)像素單位。
常用的掃描方法是兩步法,具體過程是首先檢查是否有鄰域被標(biāo)記像素點(diǎn),如果有一個(gè)或者多個(gè)鄰域像素點(diǎn)被標(biāo)記,則選擇最小的標(biāo)記作為當(dāng)前前景像素點(diǎn)的標(biāo)記。合并過程通過檢查連通等價(jià),對(duì)連通區(qū)域替換最小等價(jià)標(biāo)記,最終得到輸出。
連通區(qū)域的分析可很好得用于文本分割或分析,如下圖所示。
最后輪廓提取與Blob檢測(cè),尋找輪廓就是提取二值化圖像中的邊緣點(diǎn)集或?qū)?yīng)的層次信息,然后沿著邊緣連續(xù)的像素點(diǎn)繪制成輪廓,也是基于連通區(qū)域分析
輪廓提取在圖像幾何分析、對(duì)象檢測(cè)與識(shí)別中都非常有用。Blob檢測(cè)就是對(duì)于圖像中一組相互連通的像素點(diǎn),它們具有一些共通的屬性,要把這些區(qū)域都找出來并標(biāo)記。
Blod檢測(cè)也會(huì)調(diào)用輪廓檢測(cè)的方法,差別在于Blob檢測(cè)方法更高級(jí)一點(diǎn),更適合檢測(cè)不規(guī)則的斑點(diǎn)或比較復(fù)雜的連通區(qū)域,比如下圖。
2.2.3?圖像濾波與變換
圖像濾波主要為了去除圖像里面的噪聲,是圖像預(yù)處理很重要的一環(huán)。具體處理方法是使用一個(gè)小型濾波器(比如3x3),輸出中心點(diǎn)的像素值由周圍8個(gè)決定,如下圖所示。
如果輸出像素依賴的是輸入像素的線性組合,則稱為線性濾波器;如果輸入輸出是非線性的,則稱為非線性濾波器。
通過濾波器的方法對(duì)圖像進(jìn)行的操作稱之為卷積,而濾波器則稱為卷積核,真是一個(gè)高大上的名字,其實(shí)完全可以看作是一個(gè)滑動(dòng)的窗口遍歷圖像,在每個(gè)小窗口進(jìn)行運(yùn)算。
因此從這也可看出,圖像的卷積和泛函分析中定義的卷積略有差別(泛函分析中卷積概念,通過兩個(gè)函數(shù)f 和g 生成第三個(gè)函數(shù)的一種數(shù)學(xué)算子,即F[g(x)*f(x)] = F[g(x)]F[f(x)])。
在進(jìn)行濾波的過程需要注意的就是圖像的邊界處,也就是矩陣的四個(gè)邊。通常有以下幾種方法計(jì)算或者處理邊界像素卷積:零值填充,再造邊界和反射邊界。
圖像濾波可細(xì)分為方形/均值濾波(卷積核所有像素的對(duì)中心像素的貢獻(xiàn)相等),高斯濾波(鄰域像素根據(jù)到中心像素距離不同有著不同的權(quán)重),中值濾波(基于排序統(tǒng)計(jì)理論的一種能有效抑制噪聲的非線性濾波)和雙邊濾波(一種非線性、邊緣保留、有效去噪聲的濾波方法)。它們的區(qū)別如下:
均值濾波可對(duì)圖像進(jìn)行快速、簡(jiǎn)單的平滑處理,對(duì)于噪聲的處理很差。
高斯濾波是一種比均值濾波稍微好一點(diǎn)的線性濾波,也不會(huì)改變?cè)瓐D像的邊緣走向。
卷積核除了可以用作濾波,還能對(duì)圖像進(jìn)行梯度操作。比如圖像從左向右看,像素值不斷增大;或者從上到下看,像素值不斷增大,這些都能反映出圖像的梯度變化。
計(jì)算圖像的X,Y方向上的梯度采用如下算子(這里又叫算子這個(gè)概念了),也稱作Prewitt 算子,是一種一階算子。
為了更好的降低噪聲影響,同時(shí)提升梯度計(jì)算的穩(wěn)定性,可以首先進(jìn)行高斯模糊,然后再進(jìn)行梯度計(jì)算。而高斯模糊也是卷積操作,先進(jìn)行高斯模糊再進(jìn)行梯度計(jì)算是兩步卷積操作。
把這兩步卷積整合為一步卷積操作就是Soble算子,它隱含一個(gè)高斯模糊操作。經(jīng)過這些梯度運(yùn)算或者另外一種形式的濾波,我們可以把圖像中的輪廓信息凸顯出來。此外還有拉普拉斯算子,是一種二階導(dǎo)數(shù)濾波,能更好地提取邊緣信息。
圖像都具有求導(dǎo)的性質(zhì),是不是覺得挺難以理解,其實(shí)跟微積分里面所說的梯度含義一樣(公式也一樣),所以我們不能太死摳概念或公式,得看到它的本質(zhì)和用途,多總結(jié)、類比,活學(xué)活用。
最后一個(gè)很有名的檢測(cè)就是Canny算法,分三個(gè)步驟:1.梯度計(jì)算;2.非極大值抑制;3.雙閾值和邊緣連接。
說完濾波,接下來就是圖像的幾何變換。幾何變換一類稱為仿射變換(Affine Transform),另外一類稱為單應(yīng)性變換(Homography)。變換的基本操作可表述為如下:
其中A表示變換矩陣,B為平移系數(shù),因此圖像幾何變換也可以看錯(cuò)是坐標(biāo)旋轉(zhuǎn)、映射等,最終結(jié)果就是圖像放大、縮小、平移、旋轉(zhuǎn)等。在OpenCV中我們需給定這個(gè)變換矩陣,再使用warpAffine函數(shù)。
但通常情況下,我們是不知道變換矩陣的,這時(shí)就需要用到單應(yīng)性變換。
OpenCV有一個(gè)很穩(wěn)定的估算方法擬合所有的相關(guān)點(diǎn),findHomography函數(shù)。圖像的幾何變換對(duì)于圖像全景拼接和特征點(diǎn)匹配具有最大意義。
2.2.4 圖像的特征提取
圖像的特征提取是圖像處理的關(guān)鍵也是難點(diǎn),圖像的特征包含特征點(diǎn)及其所對(duì)應(yīng)的描述子,這些可看作是圖像的DNA。也就是描述一幅圖像最基本的單元,圖像如何進(jìn)行什么變換,圖像的特征點(diǎn)不會(huì)變化。
常見的圖像特征提取方法有SIFT、SUFR、ORB等。其中SIFT特征提取方法同時(shí)具備遷移、尺度、旋轉(zhuǎn)不變性,但是速度慢;SIFT特征提取方法比SURF計(jì)算要快;ORB主要是在快速關(guān)鍵點(diǎn)檢測(cè)算法跟BRIEF描述子算法上改進(jìn)而成的,它的關(guān)鍵點(diǎn)檢測(cè)通過FAST算法發(fā)現(xiàn)關(guān)鍵點(diǎn),然后通過Harris角點(diǎn)檢測(cè)與金字塔提取多尺度特征。
對(duì)于特征描述子,ORB使用BRIEF描述子,但是BRIEF描述子在匹配時(shí)候本身不具備旋轉(zhuǎn)不變性,穩(wěn)定性不高,因此ORB通過改進(jìn)BRIEF描述子對(duì)點(diǎn)對(duì)旋轉(zhuǎn)生成多個(gè)查找表實(shí)現(xiàn)對(duì)特征描述子的計(jì)算。
當(dāng)提取到特征點(diǎn)后,我們?cè)偻ㄟ^特征匹配來尋找不同圖像中的相同部分,并標(biāo)記出來。匹配方法有兩種,一種是暴力匹配,一種是FLANN匹配,示例如下。
2.2.1~2.2.4節(jié)所描述的一些基本理論和算法大多是20世紀(jì)八九十年代甚至更早就提出來的,非常成熟穩(wěn)定,也是目前應(yīng)用最廣的。
總結(jié)一下,數(shù)字圖像處理可看作是對(duì)于矩陣的操作。比如閾值分割用去除高像素值的部分或者低像素值的部分;形態(tài)學(xué)操作主要是通過一個(gè)小窗口去遍歷圖像,對(duì)圖像輪廓進(jìn)行提取
濾波處理主要用于圖像平滑和降噪;幾何變換和特征提取則是至少兩幅圖像的操作和比較了,不得不佩服前人們的智慧以及數(shù)學(xué)之美。發(fā)展這么多年,在網(wǎng)絡(luò)上應(yīng)該無論什么語言都能找到相應(yīng)的實(shí)現(xiàn)例子。
有了這些基礎(chǔ)知識(shí)和實(shí)踐,在很多做圖像處理或美顏的公司工作應(yīng)該不成問題。
2.3 OpenCV與機(jī)器人控制結(jié)合
學(xué)習(xí)2.2節(jié)講了圖像處理的一些常規(guī)方法,現(xiàn)在要應(yīng)用到機(jī)器人中,還存在很多其他方面的問題有待解決。
對(duì)于機(jī)器人來說,圖像就是它的眼睛,可做的研究有物體跟蹤、物體識(shí)別導(dǎo)航及路徑規(guī)劃等。
物體跟蹤:物體可以是特定形狀或者特定顏色的,輪廓提取并計(jì)算出輪闊半徑/直徑OpenCV都提供有API,然后把直徑作為反饋,讓機(jī)器人保持與特定物體一定距離實(shí)現(xiàn)跟蹤。
而且前面有師兄們做出過demo,但是這種場(chǎng)景單一,識(shí)別也僅限特別物體,可擴(kuò)展性不強(qiáng),也不是當(dāng)時(shí)的研究熱點(diǎn)。
物體識(shí)別:要解決的關(guān)鍵問題在于分類和識(shí)別,也就是機(jī)器人對(duì)于采集到的圖片能篩選出有用信息,并作出相應(yīng)反應(yīng),比如抓取、語音播報(bào)、輔助定位等。
而機(jī)器人具有甄別能力的前提有是離線訓(xùn)練好很多不同模型的物體并導(dǎo)入到機(jī)器人,很多機(jī)器學(xué)習(xí)或深度學(xué)習(xí)的方法用上,那時(shí)深度學(xué)習(xí)還不火。
而純粹的圖像分類進(jìn)行正樣本訓(xùn)練和負(fù)樣本訓(xùn)練又感覺跟機(jī)器人沒太大關(guān)系。抓取又不是實(shí)驗(yàn)室現(xiàn)有平臺(tái)的強(qiáng)項(xiàng),對(duì)于機(jī)械臂的研究又得深入很久。因此,在這個(gè)方向沒有繼續(xù)展開。
導(dǎo)航:導(dǎo)航對(duì)于機(jī)器人來說一直是個(gè)熱點(diǎn)話題。有地圖才能定位才能規(guī)劃,而地圖需要人為去建。一般是激光slam建圖和導(dǎo)航,視覺再文章很難(當(dāng)時(shí)VSLAM也沒那么發(fā)達(dá))。
還有一種機(jī)制就是學(xué)習(xí),讓機(jī)器人采集周圍場(chǎng)景信息,然后能夠根據(jù)場(chǎng)景輸出運(yùn)動(dòng)信息(比如速度,位置等)。這種方法不僅用到了圖像處理的方法,也得結(jié)合機(jī)器學(xué)習(xí),最后還應(yīng)用到了機(jī)器人中,是一個(gè)不錯(cuò)的方向。
我們知道圖像的數(shù)據(jù)量一般很大,比如640*480的彩色圖像,每一幀圖像所包含的像素點(diǎn)就有921,600個(gè)。因此降維很關(guān)鍵,而且降維后的關(guān)鍵信息還能保留。
很容易想到的有灰度、濾波去除噪點(diǎn)、壓縮、PCA、特征提取等。因此對(duì)于運(yùn)動(dòng)中的機(jī)器人,它看到的場(chǎng)景就是如下:
然后我們?cè)賹⒉杉降膱D像和機(jī)器人運(yùn)動(dòng)信息放入到一種機(jī)器學(xué)習(xí)算法IHDR中,它能夠生成一種樹形結(jié)構(gòu)的數(shù)據(jù)庫。
機(jī)器人再次在場(chǎng)景中時(shí),通過當(dāng)前場(chǎng)景去檢索已建立好的數(shù)據(jù)庫從而輸出運(yùn)動(dòng)信息,這樣便完成了機(jī)器人的學(xué)習(xí)。一般來說機(jī)器學(xué)習(xí)方法是一種離線的形式,也就是預(yù)先用大量樣本學(xué)習(xí)一個(gè)知識(shí)庫后,在線運(yùn)行時(shí)直接使用。
與之相對(duì)應(yīng)的在線學(xué)習(xí)是指不必離線學(xué)習(xí)獲得知識(shí)庫,直接運(yùn)行時(shí)知識(shí)庫是從零起步,逐漸豐富,因此它是一種增量式的學(xué)習(xí)。
而IHDR算法就具有這種增量式的學(xué)習(xí)效果,這樣機(jī)器人就能夠進(jìn)行在線的自主學(xué)習(xí)。后來我們一起做了一個(gè)上位機(jī)來實(shí)現(xiàn)這一功能,如下圖所示。
在線學(xué)習(xí)時(shí),即便邊采集圖像和運(yùn)動(dòng)信息邊訓(xùn)練,耗時(shí)也很短。不過IHDR不足處在于輸入的維數(shù)必須是統(tǒng)一的,而實(shí)際情況是場(chǎng)景中可能沒有足夠多的特征點(diǎn)可供提取。
此外,當(dāng)樣本足夠大的時(shí)候,IHDR的存儲(chǔ)和檢索會(huì)收到影響。后來師兄又將其應(yīng)用在多人臉識(shí)別上,直接在線采集,采集完了之后馬上就能識(shí)別出對(duì)應(yīng)的人臉,如下圖所示。
我還取了一個(gè)很復(fù)雜的名字“a coarse real-time online tracking system on face detection and recognition from cluttered scenes”。
3 顯著性檢測(cè)和Photometric Stereo
3.1 顯著性檢測(cè)
對(duì)于圖像處理中使用的各種方法,我們可以再上升到一個(gè)更高層次的理論體系——顯著性檢測(cè)。這是一種受生物啟發(fā)而得到的概念,又可細(xì)分為自下而上的目標(biāo)驅(qū)動(dòng)模型和自上而下的任務(wù)驅(qū)動(dòng)模型。
自上而下的模型是針對(duì)訓(xùn)練樣本中有代表性的特征,能夠檢測(cè)某些固定大小以及類別的目標(biāo)。而自下而上的方法通過基于底層視覺信息,能有效檢測(cè)細(xì)節(jié)信息,而不是全局形狀信息,且計(jì)算復(fù)雜度也通常低于自上而下模型。
再說高大上一點(diǎn)就是生命體視覺分為兩個(gè)階段,一些基本的特征提取會(huì)在第一階段完成,即自下而上的注意。
而第二階段的選擇由主觀信息實(shí)現(xiàn),即自上而下的注意(源于1980年Triesman等人提出的注意力特征綜合理論)。
歸納一下就是,自上而下的注意是一個(gè)認(rèn)知過程,由人的心理狀態(tài)和認(rèn)知因素決定的,比如知識(shí)、當(dāng)前的或者預(yù)期的目標(biāo);而自下而上的注意是一個(gè)感知過程,通常是基于底層的視覺信息,只是單純地從場(chǎng)景中提取出顯著的區(qū)域,一般具有強(qiáng)烈對(duì)比度的區(qū)域或與周圍有明顯不同的區(qū)域能吸引人們的注意力。
實(shí)際上,仔細(xì)想想便可看出自上而下的研究是基于機(jī)器學(xué)習(xí)或深度學(xué)習(xí),需要有大量的樣本作為支撐,而自下而上的研究是基于圖像中本身的信息尤其是細(xì)節(jié),也就是傳統(tǒng)的圖像處理方法。
顯著性檢測(cè)對(duì)于計(jì)算機(jī)視覺中的預(yù)處理和降低計(jì)算復(fù)雜度具有重要意義,因?yàn)樯婕暗降膱D像處理基礎(chǔ)和數(shù)學(xué)知識(shí)非常多,有特別多大牛在這方面做工作,具體可參見《圖像顯著性檢測(cè)總結(jié)》。
這里給一個(gè)例子,同一個(gè)檢測(cè)方法在不同場(chǎng)景中,看看效果如何。
場(chǎng)景一?
場(chǎng)景二
顯然可以看出,在不同場(chǎng)景下,提取到的顯著性目標(biāo)完全不同。這就是由圖像本身的差異或細(xì)節(jié)或“DNA”決定的。
3.2 Photometric Stereo技術(shù)
前面介紹的圖像處理方法都是針對(duì)單一圖像,所有可獲取到的信息都只能這個(gè)數(shù)字矩陣中,因此無論怎么復(fù)雜高級(jí)的變換我們可提取到的信息還是有限。
然而我們還可以再加入一些其他輔助信息,比如兩個(gè)攝像頭,并知道攝像頭的距離及其視角,這樣就類似于人的雙眼,同一時(shí)間兩個(gè)攝像頭看到的圖片信息肯定不一樣,從而我們依據(jù)一些算法可實(shí)現(xiàn)雙目測(cè)距;
比如加入紅外測(cè)距儀我們可以測(cè)出場(chǎng)景中任意點(diǎn)到攝像頭中心的距離(當(dāng)然測(cè)距范圍有限),這也是Kinect、Xtion、RelSense等傳感器的簡(jiǎn)單原理。
有了深度信息我們就能得到點(diǎn)云,捕獲更豐富的信息。Photometric Stereo技術(shù)是2015年去英國(guó)西英格蘭大學(xué)訪學(xué),在Centre for Machine Vision(CMV)實(shí)驗(yàn)室了解到的。
從名字就可大致看出photometric,通過照片或者光度使得到的圖像信息不僅限于平面,還可以包含平面的法向量,從而建立一個(gè)三維模型,如下圖所示。
同一靜態(tài)圖從不同的光照角度去拍攝?
Face recognition and verification using photometric stereo
4 ROS+機(jī)器視覺
ROS是加入HANS后才真正用上,關(guān)于ROS的使用這里不加以闡述。在ROS中通過cv_bridge包實(shí)現(xiàn)ros圖像和opencv圖像的轉(zhuǎn)換,然后通過image_transport包訂閱和發(fā)布圖像數(shù)據(jù)。
因此,ROS和OpenCV的結(jié)合主要在于解決環(huán)境配置問題,然后圖像轉(zhuǎn)換問題,最后所發(fā)布的信息或者接口可以被其他ROS節(jié)點(diǎn)調(diào)用。
4.1 簡(jiǎn)單demo
當(dāng)時(shí)因?yàn)樵谘芯緼GV,主要了激光導(dǎo)航、磁帶導(dǎo)航,就有人提出能不能再加上視覺進(jìn)行輔助定位,比如識(shí)別特定軌跡。
我于是就做了一個(gè)簡(jiǎn)答的demo,具體流程是:由于黑色像素較為明顯,因此先對(duì)圖像進(jìn)行灰度處理變成單通道的,再進(jìn)行Ostu閾值分割(大津法),得到二值化的圖像就只有0和1了,其中為0的部分為黑色,最終我們提取黑色部分,并計(jì)算其長(zhǎng)度。
此外,我們還可以做一些二維碼識(shí)別、定位的工作。尤其是二維碼識(shí)別,現(xiàn)在OpenCV的版本已經(jīng)支持識(shí)別和解析了。
4.2 再引入PCL
PCL(point cloud library)點(diǎn)云庫就更深一層了,通常是結(jié)合深度相機(jī)比如kinect、realsense等,其VSLAM、精準(zhǔn)識(shí)別也在不斷的研究中。
這里我們使用點(diǎn)云僅僅是為了探測(cè)地面的平整度,首先我們得找一個(gè)標(biāo)準(zhǔn)的、平整的地面運(yùn)用RANSC方法,并根據(jù)投影到地面的點(diǎn)云計(jì)算出地面的平面方程(三維的,且這個(gè)坐標(biāo)系是基數(shù)AGV車體中心),如下圖所示。
然后AGV繼續(xù)行駛時(shí)再實(shí)現(xiàn)刷新當(dāng)前地面的平面方差。當(dāng)前面出現(xiàn)凸起物或者凹陷物時(shí),顯然計(jì)算的平面方差會(huì)與之前標(biāo)定的有偏差,且點(diǎn)云會(huì)有凸起或者凹陷的部分,我們需要將其識(shí)別出來用于標(biāo)識(shí)障礙物并加入到局部路徑規(guī)劃中。不過這個(gè)想法或者實(shí)驗(yàn)并沒有能真正的做好和用好。
沒有考慮到地面本身有坡度的情形。
可能數(shù)據(jù)量太大,或者深度相機(jī)本身有測(cè)量誤差,有些孤立點(diǎn)沒有很好的過濾造成計(jì)算偏差。(研究點(diǎn)云庫也是一個(gè)需要長(zhǎng)期積累的過程)
5 總結(jié)與展望
以上便是機(jī)器視覺的一些基本理論,以及本人在這方面工作的一些所見所聞所感。這是一個(gè)很好的研究方向,希望有更多的人能投入到實(shí)際產(chǎn)品的應(yīng)用中,而不僅僅將這些看起來、聽起來高大上的算法只在實(shí)驗(yàn)室中得以論證。
在實(shí)際工業(yè)產(chǎn)品中,Halcon是運(yùn)用最廣的商業(yè)機(jī)器視覺庫,德國(guó)MVtec公司開發(fā)的一套完善的標(biāo)準(zhǔn)的機(jī)器視覺算法包。
基解決問題最多、最基本的便是模板匹配,雖然網(wǎng)上受OpenCV關(guān)于模板匹配的應(yīng)用多如牛毛,但工業(yè)產(chǎn)品中為什么還以Halcon為主呢?
因?yàn)楣I(yè)產(chǎn)品要求太苛刻,哪怕1%的誤差也是不允許的,一定要很強(qiáng)的魯棒性。所以圖像處理很有意思、OpenCV很好用,但能真正帶著問題和做產(chǎn)品的思維去用,就會(huì)發(fā)現(xiàn)有太多有待解決的問題等在面前,激勵(lì)著我們不斷努力去探索和攻克。。。
編輯:黃飛
評(píng)論
查看更多