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