黃 凱,余學才,丁建平,李亞南,唐 飛
(電子科技大學光電信息學院,四川成都610054)
列車提速,行車密度增大使得鐵路運輸的安全越來越受到人們關注。在鐵路運輸環境中,鐵路導軌線路上的路障一直成為主要的安全隱患,而鐵路導軌的準確識別是檢測和定位路障的基礎工作[1],因此如何高效且精確地識別出導軌位置對減少鐵路運輸事故的發生,提高鐵路行車安全有著很重要的實際意義。
近些年,大部分提出的很多基于視覺的鐵路導軌識別方法,在實時性和精確性方面不能得到同時滿足,特別是在復雜的自然環境下,當光線和天氣的情況發生變化時,鐵路導軌的識別就會變得比較復雜。目前,常用的導軌識別方法有基于邊緣檢測[2-3],直方圖均衡化和全局最優閾值分割[4]等。
文獻[5]在對道路標識線識別的研究中提出了基于方向和長度上的線段判別算法[5]。本文在此基礎上,利用OpenCV圖像處理函數庫,通過對其算法進行相關優化改進,并采用安裝在列車頭部上方的紅外熱像儀來得到紅外視頻圖像,減少外界復雜環境的變化對導軌圖像處理的影響[6],以實現快速準確地自動識別出鐵路導軌。
OpenCV包含有基于C/C++語言的開源圖像處理函數庫,實現了數字圖像處理和計算機視覺方面的很多算法,涵蓋了如醫學成像,信息安全,用戶界面,攝像機標定,立體視覺和機器人等計算機視覺的許多應用領域。OpenCV的設計目標是執行速度盡量快,主要關注實時應用,采用優化C代碼編寫,能夠充分利用多核處理器的優勢,可以運行在Linux/Windows/Mac等操作系統上[7]。在VC++環境下使用時,可以方便地調用OpenCV相關庫函數,使得VC在數字圖像處理方面的功能得到了極大地擴充,優化了相關代碼的編寫,降低了VC的開發難度,使得相關程序的開發周期縮短。
基于OpenCV平臺的導軌自動識別系統設計流程圖如圖1所示。

圖1 導軌識別系統設計流程
當紅外熱像儀作為輸入設備時,OpenCV中HighGUI工具包提供了一種簡單的方式來處理從中實時讀入的視頻流,即函數cvCreateCameraCapture(),函數參數為攝像設備的ID,返回值為CvCapture*指針。之后的處理同視頻文件類似,之后可以使用cvQueryFrame()函數來獲取視頻中的圖像序列幀,其函數參數為CvCapture結構的指針,用來將下一幀視頻文件載入內存,返回一個對應當前幀的指針。圖2為從視頻流中提取出的一幀圖像。

圖2 視頻提取出的直道導軌圖像
為了使方案滿足實時性的要求,提高圖像處理速度,對其預處理的第一步是灰度化處理,使之成為8位的灰度圖像,以此來減少處理導軌圖像的數據量。OpenCV在向灰度轉換時,灰度值的計算使用加權平均值法:R=G=B=(0.299)R+(0.587)G+(0.114)B。
由于相關儀器設備的自身及外界環境的限制,還有圖像在形成和處理時不可避免的存在著一些干擾信息,使得紅外圖像存在一定的噪聲,噪聲的存在使圖像質量變差,掩蓋目標特征,給后續的圖像分析處理帶來不便。因此,需要去除參雜的噪聲來改善導軌圖像的質量。本文采用的圖像平滑處理方式為高斯濾波,它采用卷積核來與輸入圖像的每一個點進行卷積,將最終的計算結果之和作為輸出圖像的像素值。處理結果如圖3所示。

圖3 經預處理得到的直道導軌圖像
在導軌識別過程中,圖像的邊緣提取至關重要。在灰度圖像中,所謂邊緣就是圖像中局部區域灰度值變化顯著的部分,它集中了目標的重要特征信息。邊緣的準確提取對于后續導軌的自動識別至關重要。
Canny方法使用拉普拉斯算子,在灰度圖像的處理中有著廣泛的應用,無論在邊緣定位精度還是抗噪的能力上都有著明顯優勢,與其他邊緣檢測方法的不同之處在于,首先采用高斯濾波器來對圖像進行平滑,并用高斯算子的一階微分來計算像素點的梯度幅值以及方向,對所得梯度幅值進行非極大值抑制,來確定邊緣的像素點。最后它使用雙閾值方法分別檢測圖像的強邊緣和弱邊緣,并且僅當弱邊緣與強邊緣相連時才將弱邊緣包含在輸出圖像中[8]。經邊緣提取后導軌圖像如圖4所示。
2.3.1 鏈碼跟蹤提取線段
目前常用的直線段提取方法有Hough變換,Hough變換實質為把圖像空間中每一個像素點映射為參數平面內對應的直線,最后通過統計特性來解決問題,但是由于這種空間映射關系使得計算復雜度增大,實時性不高,且這種方式不能用來獲得線段的端點以及長度信息。另一種廣泛使用的是鏈碼跟蹤算法,通過鏈碼表的使用,來提取線段信息,不僅方法簡單,且能獲得線段的長度,方向信息,非常適合對線段進行后續的判別處理[9]。

圖4 Canny邊緣提取直道導軌結果
鏈碼是圖像處理中出現較早的概念,根據中心像素指向它的領域八個鄰點的方向來定義的,取值為0~7。本文選用OpenCV中如圖5所示的鏈碼表,當鏈碼值加1,所指方向順時針旋轉45°。由圖5可知,可以根據鏈碼表的特點用來計算跟蹤到的線段長度,當出現偶數號鏈碼值時,表示連接的兩像素距離為1,出現奇數號鏈碼值時表示連接的兩像素距離為√2。

圖5 Freeman鏈碼對應的8個方向
本方案采用由文獻 [10]孫涵等人在新的基于鏈碼的快速直線檢測算法中提出的直線近似度公式[10]:設鏈碼串的實際長度Len(ps,pe),兩個端點ps,pe之間的理想直線距離 ps-pe,則該段鏈碼串的直線近似度表示為 S=可知,當S值越大時,代表該段鏈碼串越接近理想直線。由于實際中鐵路導軌線的形狀并不可能有較大的彎曲,所以在此基礎上,本方案預設的閾值ST較小,這樣可同時確保遇到彎道導軌時候也能準確檢測到曲線信息。在利用鏈碼跟蹤線段過程采用按“向右看“準則進行,通常將鏈碼信息保存在一維數組中,如整型數組code[],它的前兩個元素存放鏈碼串中首位像素的起始位置坐標(x,y),第三元素存放鏈碼串中總的像素個數,從第四位元素開始存放鏈碼序列。
2.3.2 長度及直線近似度的判斷
從圖像左下開始逐點向右逐行向上進行掃描,為避免像素重復檢測,提高跟蹤時的速度,除了對掃描過的像素進行標記,可根據上次鏈碼值來計算下次的檢測起點,結合OpenCV鏈碼對應方向,當進入鏈碼為奇數時,待測始點的鏈碼為前者減2加8,為偶數時則減1加8,這里加8是為確保鏈碼值保持在0~7之間。對鏈碼跟蹤線段形成的鏈碼串進行分析處理,計算鏈碼串跟蹤到的線段的實際長度和理想長度,其中實際長度由鏈碼表中鏈碼值計算得出,而理想長度則由該線段的終點和起點坐標計算求出。將實際長度Len(ps,pe)與所設閾值LT相比,如果小于閾值,則表示線段長度過短,對識別導軌作用不大,或是雜而亂的干擾線段可直接去除。反之,繼續計算出直線段近似度,并與所設閾值ST相比,如小于閾值ST,則進一步過濾掉不符合要求的線段[11-12]。
2.3.3 利用統計鏈碼值次數判別線段
考慮到紅外熱像儀位于列車頭部正上方,所以列車行駛方向應與鐵路導軌線方向基本保持相同,或者兩者之間的夾角在一很小范圍之內。結合鏈碼跟蹤線段時的優勢,提出在上一步鏈碼跟蹤線段得到鏈碼串的同時,利用統計所有鏈碼值出現的次數,并進行比較,得到的最大值可以代表線段的主要方向,來進行方向上判斷,具體算法步驟如下:
步驟1 建立一個一維數組a[8]并初始化為0,數組八個元素分別用來存放鏈碼串中鏈碼值出現的次數,如a[i]=Ni,Ni為i出現的次數,i為0~7的鏈碼值,即圖5中的對應的八個方向。
步驟2 由于當前鏈碼串信息存放于code[]中,所以從第四個元素開始計數,鏈碼值i出現一次,相對應數組元素a[i]加1。
步驟3 新建一整形變量Max,并賦初值為a[0]。
步驟4 將Max分別與a[1]至a[7]進行大小比較,若Max小于后者,則將后者值賦予Max。
步驟5 經過步驟4之后,此時a[0]至a[7]中最大值已賦予Max,結合實際鐵路導軌線總體方向可以由0或1或7來表示,來判斷最終賦予Max最大值的是否為a[0],a[1],a[7]三者之一,否的話則表示此線段方向不對,不是正常的鐵路導軌線,則應消除此線段。效果如圖6所示。
2.3.4 斷線的連接
經過以上方法對導軌圖像處理之后,可以得到主要以鐵路導軌線為主的輪廓線,但是由于噪聲的干擾和前期進行的處理常常會出現線段輕微斷線的現象,即一條線段中會有少許的像素缺失。針對這種斷線情況提出了在斷線連接前后,統計線段鏈碼值出現次數,利用最大值的改變來衡量斷線連接是否合理、準確。經斷線連接后的效果如圖7所示。

具體的算法表示如下:
步驟1 從左下逐點向右逐行向上掃描全圖,對得到的當前鏈碼串進行判斷。
步驟2 對當前鏈碼串中所有鏈碼值出現的次數進行統計,通過比較得到的最大值來確定線段的主要方向。并取得當前線段的終點像素坐標,以此坐標為中心在一定范圍內查找此線段外未標記的像素點,這里采用6×6的矩形范圍。
步驟3 若存在這樣的一個像素點,保存其坐標值,并利用OpenCV的畫線函數連接這兩點。
步驟4 對斷點連接后,所形成的新線段進行鏈碼跟蹤,統計鏈碼串中鏈碼值出現的次數,得到最大值,從而獲得新線段的主要方向。
步驟5 比較前后方向上的改變,求出差的絕對值若小于2,則表示方向接近,此次斷線連接合理。否則,刪除由畫線函數連接兩點之間的線段。繼續尋找下一像素點,若存在則進入步驟3,不存在則進入步驟1繼續循環,直到圖像被全部掃描完畢。
經過以上步驟處理過的鐵路導軌線在圖中應為最長線段,所以最后一步再去除相對較短的線條。在原圖中用加粗的實線顯示出標識的鐵路導軌線如圖8所示。

圖8 直道導軌原圖中所標識出的鐵路導軌線
對彎道導軌的情況,采用本文圖像處理方法,實驗結果如圖9彎道導軌檢測效果所示。
(1)圖像的灰度化,cvCvtColor(src,dst,CV_BGR2GRAY);將原始圖像幀轉為8位灰度圖。
(2)平滑濾波,cvSmooth(src,dst,CV_GAUSSIAN,3,3,0,0);對圖像高斯濾波。
(3)Canny算 子 邊 緣 提 取 cvCanny(src,dst,lowThresh,highThresh,3);參數 lowThresh,highThresh分別為低,高閾值,通常高低閾值之比在2倍到3倍之間。
(4)輪廓提取 cvFindContours(dst,storage,&contours,sizeof(CvChain),CV_RETR_LIST,CV_CHAIN_CODE);對斷線連接后的導軌進行輪廓提取。
(5)畫輪廓線 cvDrawContours(src,contours,CV_RGB(255,0,0),CV_RGB(255,0,0),100,3,8);在原圖中用指定類型的實線標識出導軌輪廓線。
本文利用圖像處理相關知識,對鐵路導軌的自動識別進行了詳細的研究。因基于OpenCV平臺下,采用OpenCV函數庫中的優化函數,使得本方案在實時應用性方面表現出色,采用鏈碼跟蹤線段時,利用統計鏈碼值出現次數來完成了在方向上對線段的判斷和斷線的連接,最終實現了在原圖中準確標識出導軌輪廓線,為后續鐵路導軌線路上路障檢測和定位工作的開展奠定了基礎。

圖9 彎道導軌檢測效果
[1]REN Zhong.Railway recognition based on prior knowledge[D].Wuhan:Wuhan University of Technology,2007(in Chinese).[任重.基于先驗知識的鐵軌識別 [D].武漢:武漢理工大學,2007.]
[2]CHAI Shihong.Railway recognition based on edge detection [J].Railway Computer Application,2008,18(4):1-3(in Chinese).[柴世紅.基于邊緣檢測的鐵軌識別 [J].鐵路計算機應用,2008,18(4):1-3.]
[3]LOU Ruixia.Study on video surveillance technology for railway roadblock[D].Chengdu:Southwest Jiaotong University,2006(in Chinese).[樓瑞霞.鐵路路障視頻監測技術[D].成都:西南交通大學,2006.]
[4]GUAN Peng,GU Xiaodong,ZHANG Liming.Automatic railroad detection approach based on image processing[J].Computer Engineering,2007,33(19):207-212(in Chinese).[關鵬,顧曉東,張立明.一種基于圖像處理的鐵軌自動檢測方法 [J].計算機工程,2007,33(19):207-212.]
[5]WU Zhe,SUN Han.Lane mark identification algorithm based on fast line detection [J].Computer Technology And Development,2009,19(5):48-51(in Chinese).[吳哲,孫涵.基于快速直線段提取的道路標識線識別算法[J].計算機技術與發展,2009,19(5):48-51.]
[6]SUN Tongyi,LI Lin.Realization of moving targets detecting algorithm in infrared video images based on OpenCV [J].Informatization Research,2010,36(11):12-13(in Chinese).[孫統義,李林.基于OpenCV的紅外運動目標檢測方法及實現[J].信息化研究,2010,36(11):12-13.]
[7]YU Shiqi,LIU Ruizhen.Learning OpenCV(Chinese version)[M].Beijing:Tsinghua University Press,2009(in Chinese).[于仕琪,劉瑞禎.學習OpenCV(中文版)[M].北京:清華大學出版社,2009.]
[8]ZHOU Changfa,Image processing programming with VC++[M].3rd ed.Beijing:Publishing House of Electronics Industry,2006(in Chinese).[周長發,精通Visual C++圖像處理編程[M].3版.北京:電子工業出版社,2006.]
[9]Rafael C Gonzalez,Richard E Woods.Digital image processing[M].3rd ed.Science Press,2011.
[10]SUN Han,RENMingwu,YANGJingyu,A fast and practical algorithm for line detection [J].Application Research of Computers,2006,23(2):256-260(in Chinese).[孫涵,任明武,楊靜宇.一種快速實用的直線檢測算法[J].計算機應用研究,2006,23(2):256-260.]
[11]WANG Songbo.A method of traffic lane detection and tracking[J].Computer Engineering and Applications,2011,47(3):244-248(in Chinese).[王松波.一種車道線檢測與跟蹤方法[J].計算機工程與應用,2011,47(3):244-248.]
[12]LU Guangquan,XU Hongguo,LI Yibing.Line segment detection based on chain code detection [J].Computer Engineering,2006,32(14):1-3(in Chinese).[魯光泉,許洪國,李一兵.基于鏈碼檢瀏的直線段檢瀏方法 [J].計算機工程,2006,32(14):1-3.]