引言 本文采用ARM+DSP雙核架構的OMAP3530系列的處理器,道路圖像處理部分由支持浮點運算的DSP核來完成,圖像采集工作和系統的控制工作由ARM核來完成,這樣的作業分配提高了系統的實時性、集成性和可靠性。 車道線識別算法研究 本文提出的車道線識別算法的流程如下圖1所示,首先通過OV7670攝像頭捕獲道路圖像,然后按照流程圖中的步驟處理圖像,最后得到清晰的車道標志線,為以后智能車輛路徑規劃和避障提供支持。 道路圖像灰度化 圖像灰度變換是對圖像像素進行拉伸,從而擴大圖像的灰度級范圍,進一步擴展圖像的對比度、增加圖像的動態范圍、使圖像更加清晰、特征更加明顯,是圖像增強的有效手段。我們采集到的道路圖像是彩色圖像,顏色模型采用RGB模型。由于人眼對顏色的敏感度不同,等量的紅、藍、綠混合不能得到對應亮度相同的灰度值,大量的實驗數據表明,當使用0.3份紅色、0.59份綠色、0.11份藍色混合后可以得到最合理的灰度圖像,即如公式(1)所示: 灰度值=0.3R+0.59G+0.11B(1) 根據公式(1)就可以算出當前像素對應的灰度值,將其作為圖像中彩色像素對應的灰度值。 道路圖像濾波 原始圖像都或多或少的存在噪聲干擾,噪聲影響了后續圖像的分析。這就要求在分析圖像之前對圖像進行濾波,去除噪聲和假輪廓,圖像濾波的過程就是讓圖像的低頻成分通過,阻止屬于高頻部分中的噪聲信號,也就是平時所說的低通濾波。但是在圖像平滑過程中也阻止了高頻部分的圖像邊緣,使得圖像邊緣模糊化。所以應找到能消除噪聲,同時盡量保持圖像細節,邊緣輪廓的算法,又要保證智能車輛視覺導航系統對實時性的要求。中值濾波能夠在抑制高頻信號中的隨機噪聲的同時不使邊緣模糊,可以抑制隨機的點狀噪聲,抑制持續期小于1/2窗口的脈沖信號,但不影響斜坡信號和階躍信號,能夠削弱三角信號中的頂部峰值信號,因而受到歡迎,它屬于非線性濾波。 中值濾波是將鄰域中的像素按灰度級排序,取其中間值為輸出像素。中值計算過程中使用到的像素數和鄰域的空間范圍影響到中值濾波的效果。本文采用3×3方形中值濾波模板對圖像進行預處理既能取得較好的濾波效果,又能節省運算時間。 圖像邊緣增強 在車輛視覺導航系統中,道路邊緣信息可以提供路徑保持和路徑跟蹤的位置信息,是實現車輛自主導航功能不可或缺的。邊緣增強的目的在于突出道路的邊緣信息,以利于道路車道線的識別,有助于克服道路光照不均的影響。我們對濾波后的圖像從水平和垂直兩個方向進行邊緣增強,可以得到非常好的效果。 圖像邊緣檢測 在圖像的多目標檢測和識別技術中,邊緣檢測作為一種預處理算法在機器視覺技術中占有重要地位。邊緣檢測的算法很多,參考各種算法的優缺點,并結合道路檢測的復雜性,我們這里選用Sobel算子。 Sobel邊緣算子是一種一階差分算子。它可以有效地消除道路圖像中的大部分無用信息。它可以有效的抑制圖像中的噪聲,它的計算量比較小,容易實現,對于實時性要求比較高的系統,該算法有很大的優勢。 車道標志線提取 本文重點討論道路區域車道線的提取。日常生活中最常見的路面邊界是直線,車輛主要也是在直線路面上行駛的。平時見到的直線路面邊界是成一定角度的兩條直線,根據三維空間點投影到二維平面的特點,直線路面邊界在二維平面上形成兩條相交的直線,直線路面邊緣提取算法如下: (1)根據二維直線路面的實際情況,建立X-Y坐標系,并給出恰當的路面邊緣解析方程。 (2)根據圖像的特點,取一組合理的ρ、θ范圍和步長,設置累加器為零。將圖像的解析方程轉化成極坐標下的形式,即ρ=xcosθ+ysinθ,如圖2所示,ρ為原點到直線垂直距離,θ為X軸與垂線之間的夾角。 (3)對梯度圖上超過門限值的每個點作Hough變換,并對相應的累加器加1. (4)找出累加器A(ρ,θ)上的極大值ρM、θM.通過這兩個值可以找出圖像中極有可能的邊界。 (5)去除干擾。根據三維物體在攝像機上成像的特點,三維空間中平行的路面邊緣在二維平面形成兩條成一定角度的相交直線,如圖3中虛線所示。但由于路面噪聲的影響,在累加器A(ρ,θ)上的極大值ρM、θM周圍存在多個較大值,它們在X-Y軸上對應的直線如圖3中兩條實線所示,顯然這不是要求的邊緣,所以將累加器ρM、θM周圍點置0. (6)找出累加器A(ρ,θ)上次大值ρM、θM.A(ρ,θ)上的次大值對應圖像中路面的另一條邊界。 (7)得到相應的X-Y上對應直線方程。進一步可以得到:b=-ρ/sinθ,k=ctgθ通過這兩個方程式得到ρ、θ值之后,可以求得相應的k、b值。 由于圖像的連續性,圖像序列中車道線的位置不會發生突變,我們在識別一幀圖像的車道線時是以上一幀的識別結果為依據,動態地規劃搜索區域,動態地規劃Hough變化的ρ和θ值,這樣就減少了計算量,提高了算法的實時性,也可提高可靠性。 系統硬件設計 本文選取ICETEK-OMAP3530-Mini開發板為實驗平臺,該開發板是由北京瑞泰創新科技有限責任公司與美國德州儀器公司合作推出,是一個開放的OMAP3530的硬件平臺,它是以TI最新的、高性能的ARM CortexA8處理器OMAP3530為核心,以DSP64x+內核作為強勁的輔助圖像處理,優化硬件2D/3D加速器,形成一個精簡完備的計算機系統。 選用CMOS攝像頭OV7670.OV7670是Omnivision公司生產的一款30萬像素的彩色圖像傳感器芯片,體積小、工作電壓低,提供單片VGA攝像頭和影像處理器的所有功能。其特點有:靈敏度高,適合低亮度下使用;標準串行攝像頭控制總線(SCCB),兼容IIC接口;自動曝光控制;自動增益控制;自動白平衡;自動消除燈光條紋;自動黑電平校準;圖像格式可以是原始RGB、RGB(4:2:2)、RGB565/555/444、YUV(4:2:2)、YCbCr(4:2:2)。OV7670與ICETEK-OMAP3530-Mini板通過USB接口連接在一起。 系統軟件設計 OMAP3530是一款雙核微處理器,由ARM核和DSP核兩部分組成,二者之間軟件的編程和運行都是相互獨立的,通過DSP/BIOS Link完成雙核之間的通信。ARM端采用嵌入式Linux操作系統,動態創建、控制和刪除DSP節點,實現數據的高效傳輸。DSP端采用DSP/BIOS實時操作系統,支持eXPressDSP實時軟件技術,由DSP/BIOS實時內核、可重構的DSP算法和第三方軟件模塊組成。 由系統結構可見,軟件設計主要包括:ARM端引導程序和Linux系統的移植;捕獲道路圖像程序。 ARM端引導程序和Linux系統的移植 為便于項目的開發和調試,ICETEK-OMAP3530-Mini板采用SD卡啟動,本系統中使用的X-Loader的版本是x-loader1.4.2,U-boot的版本是Uboot-2009.01,Linux內核的版本是Linux-2.6.28,Busybox的版本是busybox-1.12.2,該過程的主要步驟如下: (1)在開發主機Linux PC里安裝交叉編譯工具; (2)交叉編譯X-Loader,生成鏡像文件x-load.bin.ift,然后轉化為SD卡啟動用程序MLO; (3)交叉編譯U-boot,生成u-boot.bin和mkimage工具; (4)驅動配置并交叉編譯內核,生成內核鏡像文件uImage; (5)利用Busybox制作文件系統; (6)將上述生成的二進制文件復制到SD. 捕獲道路圖像 Linux系統對視頻設備的操作提供了兩套API,分別是Video 4 Linux(簡稱V4L)和Video 4 Linux 2(簡稱V4L2)。早期開發的V4L存在很多缺陷,Bill Dirks等人對其進行了重新設計,更名為V4L2,相比于V4L有很好的擴展性和靈活性,并且支持更多的硬件設備。這兩套API不兼容,本文采用V4L2進行USB攝像頭視頻編程。 利用V4L2提供的接口,我們可以編寫出具有視頻采集功能的測試代碼。下面就主要的環節做一些說明。 (1)打開視頻設備 cameraFd=open(“/dev/video0”, O_RDWR, O); (2)查詢設備屬性 通過調用ioctl函數和接口命令VIDIOC_QUERYCAP,查詢攝像頭的信息,見程序段1. ——————————————————————— if (ioctl(fd, VIDIOC_QUERYCAP, == -1) { … } else {… if ((cap.capabilities V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_ CAPTURE) { …} if ((cap.capabilities V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING) { …} } while(ioctl(fd,VIDIOC_ENUM_FMT, {…} ——————————————————————— 程序段1查詢攝像頭屬性 (3)設置像素格式 一般的USB攝像頭都會支持YUV,可能還會支持其他更多的格式。通過上一步對攝像頭所支持像素格式的查詢,下面利用ioctl函數對格式進行設置,見程序段2.——————————————————————— fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.height = IMAGEHEIGHT; fmt.fmt.pix.width = IMAGEWIDTH; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; ioctl(fd, VIDIOC_S_FMT, ——————————————————————— 程序段2設置像素格式 (4)申請緩存區,并獲取每個緩存的信息 V4l2捕獲的數據,是存放在內核空間里的,用戶不能直接訪問該段內存,必須通過某些方法來轉換地址。這里我們采用mmap映射方式,相關代碼見程序段3. 圖1車道線識別算法流程圖 圖2路面邊緣示意圖 圖3干擾直線 ——————————————————————— req.count=4; req.type=V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory=V4L2_MEMORY_MMAP; ioctl(fd,VIDIOC_REQBUFS, ——————————————————————— 程序段3映射內核空間到用戶空間 (5)開始采集視頻 type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl (fd, VIDIOC_STREAMON, (6)取出緩沖區中已經采樣的緩存 ioctl(fd,VIDIOC_DQBUF, (7)停止采集和關閉設備 int close_v4l2(void) { ioctl(fd, VIDIOC_STREAMOFF, …} 實驗測試 本文設計的視頻圖像采集模塊及測試演示系統實物圖如圖4所示。 在學校外的新蘭路上采集到了回旋曲線、拋物線、直線三種結構化道路圖像,對采集到的三種道路圖像應用車道線識別算法處理,提取出車道標志線,效果圖如5所示。從效果圖中可以看出該算法基本上對由光照的強弱、對陰影區域和對道路的質量等造成的問題影響不大,表現出很好的識別效果。 圖4視頻圖像采集演示系統 圖5三種結構化道路車道線提取效果圖 (一)識別效果分析此分析的實驗是在MATLAB上進行的。測試評估是通過本文的識別算法的效果與人工掃描獲得的圖像真實值進行比較得出算法的各項指標。判斷識別正確與否的原則是: (1)當識別的結果與實際值誤差在0.5m之內,并且角度變化在8°之內的目標認為是正確識別,否則認為是誤識別。 (2)真實值中存在而系統沒有識別出來的認為是漏檢,誤檢和漏檢都認為是錯誤識別。 (3)真實值中沒有,但是系統識別出來的車道線算是誤識別。 根據本文提出的車道線識別算法,分別選取了上述三種結構化道路場景的500幀圖像進行測試,識別率對照表如下所示。 (二)響應速度分析 運行MATLAB軟件需要耗費很多的系統資源,使得算法在其下的運行速度比較慢,所以不適合用MATLAB進行算法的響應速度測試。本文提出的算法先用C語言實現,然后在Linux環境下使用gettimeofday()函數來計算運行時間。本文算法在Ubuntu Linux平臺上的處理時間平均約為27.8ms. 本文提出的車道線識別算法在識別能力和響應速度上都比以往的算法有所提高,能夠滿足實際應用的需要,但性能還需要進一步的優化。 結束語 基于達芬奇技術的OMAP3530實現了車道線識別檢測的功能。ARM核控制OV7670攝像頭捕獲到道路圖像,然后經由DSP/BIOS Link傳輸到DSP核,由DSP核完成車道線的識別檢測,最后提取到清晰的車道標志線。試驗結果表明,本算法可以保證車道線識別的準確性、實時性和魯棒性,能夠滿足實際需要。 表1兩種算法識別率對照表 |