《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 人工智能 > 業(yè)界動(dòng)態(tài) > 一文解析OpenCV與機(jī)器視覺基本理論

一文解析OpenCV與機(jī)器視覺基本理論

2023-02-26
來源:CSDN博主
關(guān)鍵詞: opencv 機(jī)器視覺

  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è)處理,比如變成灰度圖像或二值化圖像,。

  效果如下:

 104.JPG

  一般灰度圖像是對(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è)線。如下圖,。

 103.JPG

  這里選取的檢測(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ì)車流量,,最后加起來算總和,。偽碼如下:

102.JPG

  最后我們通過這種方法得到的結(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)確,效果小,。

 101.JPG

  我們就只考察一個(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)榇耍於宋以趫D像處理和學(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串口通信,,示意圖如下,。

100.JPG

  現(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ì)信息中可廣泛看到,。

 99.JPG

  自適應(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ì)減少,,也就是圖像的腐蝕,,如下圖所示的示意圖。

 98.JPG

  如果對(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ū)域的分析可很好得用于文本分割或分析,如下圖所示,。

 97.JPG

  最后輪廓提取與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ū)域,比如下圖,。

96.JPG

  2.2.3 圖像濾波與變換

  圖像濾波主要為了去除圖像里面的噪聲,,是圖像預(yù)處理很重要的一環(huán)。具體處理方法是使用一個(gè)小型濾波器(比如3x3),,輸出中心點(diǎn)的像素值由周圍8個(gè)決定,,如下圖所示。

 95.JPG

  如果輸出像素依賴的是輸入像素的線性組合,,則稱為線性濾波器,;如果輸入輸出是非線性的,則稱為非線性濾波器,。

  通過濾波器的方法對(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像的邊緣走向,。

 94.JPG

  卷積核除了可以用作濾波,還能對(duì)圖像進(jìn)行梯度操作,。比如圖像從左向右看,,像素值不斷增大;或者從上到下看,,像素值不斷增大,,這些都能反映出圖像的梯度變化。

  計(jì)算圖像的X,,Y方向上的梯度采用如下算子(這里又叫算子這個(gè)概念了),,也稱作Prewitt 算子,是一種一階算子,。

  93.JPG

  為了更好的降低噪聲影響,,同時(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)。變換的基本操作可表述為如下:

  92.JPG

  其中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匹配,,示例如下,。

 91.JPG

  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)景就是如下:

  90.JPG

  然后我們?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)這一功能,如下圖所示,。

 89.JPG

  在線學(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”,。

 88.JPG

  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)景中,看看效果如何,。

 87.JPG

  場(chǎng)景一

86.JPG

  場(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è)三維模型,,如下圖所示。

 85.JPG

  同一靜態(tài)圖從不同的光照角度去拍攝

 84.JPG

  Face recognition and verification using photometric stereo

83.JPG

  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)度,。

  82.JPG

  此外,我們還可以做一些二維碼識(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)期積累的過程)

 81.JPG

  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ì)著我們不斷努力去探索和攻克……



更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<

mmexport1621241704608.jpg

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。