韓立立, 劉曉然, 劉文杰, 肖保鑫, 尹教建
(中國石油大學(華東), a. 理學院, b. 石大山能新能源學院, c. 計算機科學與技術學院, d. 機電工程學院, 山東, 青島 266580)
隨著社會經濟的發展、人民生活質量的提高,我國機動車保有量已達3.9億輛(根據公安部2021年10月最新統計數據),道路交通壓力愈發顯著。實地考察發現,大部分十字路口在不同方向上車流量并不均等,而普通交通信號燈系統、各方向的通行時間是固定的,這樣經常會出現某一方向綠燈卻無車,另一方向有車卻是紅燈的情況,導致路口通行效率不高。在國外智能交通系統(ITS)相關研究中,圖像視頻處理技術得到廣泛應用[1],實現了交通燈實時自適應控制。
基于以上現狀,本文在實驗室環境下以1∶40比例模擬設計了一種基于流量檢測的智能交通燈控制系統,通過OpenMV機器視覺進行車距和車流輛檢測,根據車流量動態設置交通燈通行時間。系統以Arduino UNO單片機為核心處理器,控制交通信號燈顯示;用超聲波傳感器探測道路有無機動車駛入;如有車輛駛入,利用OpenMV機器視覺模塊檢測車距和車流量,根據車流量大小,控制交通燈的顯示,智能分配通行時間,從而實現提高道路通行效率的目的。
系統總體結構設計如圖1所示,主要包括信號燈主控制器、數據處理與顯示主控制器、超聲波車輛檢測電路、LCD液晶顯示模塊、OpenMV視覺傳輸模塊、I/O接口擴展電路、數碼管顯示電路和紅綠燈顯示電路。主控制器選用Arduino UNO單片機,是整個電路的核心。數據處理與顯示主控制器用于處理OpenMV機器視覺模塊送來的數據,并顯示在LCD液晶顯示模塊上;信號燈主控制器用于處理超聲波車輛檢測電路送來的信號、控制紅綠燈顯示、控制各通行方向上的數碼管顯示計時信息。超聲波車輛檢測電路設有2個超聲波傳感器,用于檢測通行方向內有無機動車駛入,當檢測到車輛時,啟動OpenMV進行車距檢測和車牌識別,識別到1個車牌,流量計數加1。I/O接口擴展電路用于擴展Arduino UNO單片機的I/O接口,以連接所需數量的數碼管和紅綠燈。數碼管顯示電路設有4組數碼管,每組數碼管能夠顯示2位十進制數,用于顯示通行方向上紅燈、綠燈和黃燈的剩余時間。紅綠燈顯示電路由4組紅綠燈組成,每組紅綠燈設有紅燈、綠燈和黃燈各1個,分別設置在4個通行方向上。

圖1 智能交通燈系統結構圖
智能交通燈系統電路設計,如圖2所示。系統硬件包含2個Arduino UNO單片機、2個超聲波傳感器HC-SR04、2個I/O擴展芯片74HC595D、2個數碼管顯示譯碼器74LS48芯片、2個OpenMV機器視覺模塊、4組數碼顯示管、4組紅綠燈以及1個LCD1602液晶屏。其中:第一個單片機用來控制紅綠燈、數碼管以及超聲波傳感器,并發送開始工作信號給第二個單片機;第二個單片機用途是處理OpenMV發送來的車距、車牌等數據,并將數據顯示在LCD屏幕上。

圖2 智能交通燈系統電路圖

圖3 數碼管驅動電路圖
對于智能交通燈控制系統,選用Arduino UNO單片機[2]作為核心控制器。Arduino UNO是一塊單片機開發板,其核心是ATmega328 MCU控制器,集成了最小系統、閃存存儲器、I/O接口、電源電路、在線編程電路等硬件。通過1條USB數據線連接電腦,就可以實現供電和程序燒錄,具備數字輸入/輸出接口、PWM輸出接口和模擬輸入接口均可以通過杜邦線引出,電路搭接方便。利用Arduino IDE編程環境編寫系統控制程序,通過數據線傳送到Arduino UNO開發板,控制外部電路工作。
為了解決Arduino UNO單片機數字端口較少的問題,本系統采用1塊74HC595D集成芯片來進行端口擴展[3]。74HC595D是八位串行輸入/并行輸出移位寄存器,具有三態輸出和輸出鎖存功能。在數據移位的過程中,74HC595D的數據輸出寄存器可以保證輸出數據保持不變,從而避免數碼管和紅綠燈出現閃爍現象。將Arduino UNO開發板的3個數字端口分別連接至74HC595D芯片的14腳DS數據引腳data、12腳ST_CP鎖存線LATCH 和11腳SH_CP時鐘線引腳clock,即可將單片機的3個端口擴展為8個端口,十分便捷且功能穩定,編程較為方便。
系統需要4組數碼管顯示電路,2組用于顯示東西雙向通行計時,2組用于顯示南北雙向通行計時。因為相對方向始終同時放行或禁行,所以東西向2組數碼管顯示計數值相同,南北向2組數碼管顯示計數值相同。因此,東西向2組數碼管連接在同一組驅動接口上,南北向2組數碼管連接在另一組驅動接口上即可。74LS48芯片是共陰極LED七段顯示數碼管顯示譯碼器,用于將8421BCD碼轉換為數碼管顯示相應十進制數字的段碼[4]。本系統采用2個74LS48芯片作為單片機和數碼管連接的橋梁,既方便編寫相應程序,又減少了單片機I/O接口的使用數量。由于本系統使用雙位數碼管,所以采用動態掃描方法,即讓每位數碼管輪流顯示,設置間隔時間極短,利用視覺暫留現象,可以同時看到2位數碼管顯示的數字。
OpenMV以串口通信的方式將識別到的圖像及其處理結果發送至Arduino UNO主控板,其連接方式為共地后將OpenMV的發送端TXD(P4)連接到主控板的接收端RXD(D0)。將OpenMV的接收端RXD(P5)連接到主控板的發送端TXD(D1),從而實現同波特率條件下的串口通信,依靠此種方式可以發送多種字符串。
當超聲波傳感器檢測到有車輛駛入時,發送信號至Arduino UNO主控板,主控板啟動OpenMV機器視覺模塊[5]進行車距和車牌識別,通過車牌識別累加計算車流量。
用一個帶有小孔的板遮擋在墻體與物之間,墻體上就會形成物的倒影,這一現象,叫小孔成像。當焦距不變時,物距越近像越大且亮度變亮,物距越遠像越小且亮度變暗。基于上述原理,將對車距這一物理量測量轉化為對車輛像素點數量的捕獲。利用OpenMV機器視覺模塊測量車距的原理如圖4所示。

圖4 OpenMV機器視覺模塊測距原理
根據圖4,由左邊攝像頭里的幾何關系可得:
(1)
由右邊道路環境里的幾何關系得知:
(2)
由式(1)、式(2)可得:
Lm*Bpix=2L′*Rm
(3)
式(3)中,等號左邊的Lm是車距,Bpix是攝像頭中車輛所占的像素。等號右邊的Rm是出現在攝像頭視野范圍內識別到的車輛高的一半,L′是焦距。推導出的式(3)說明,車距和攝像頭里的像素成反比,也就是說車距=常數/像素,即:車輛距離越遠,攝像頭識別到的像素點越少;車輛距離越近,攝像頭識別的像素點越多。
首先,根據攝像頭焦距數據以及實驗室可測量距離數據對計算常數進行逼近,經過大量的實驗與計算后,當常數設定在范圍1.1~2.3時,攝像頭的測距結果較為穩定。同時,在此范圍內再次進行精確篩選,當常數設定為1.6時,攝像頭測距結果更為穩定且誤差較小。當設定程序中參數為1.6時,部分實驗數據見表1。

表1 實驗室環境下測距表現與誤差分析
由表1可知,當常數為1.6時,相對誤差較小,但仍不是理想狀態。在對硬件設備以及控制代碼的檢查調試中發現,攝像頭成像存在畸變問題,即物體在鏡頭中的像素值有誤差,此時通過使用sensor.set_windowing成像框設定函數使鏡頭中心放大,使用image.lens_corr函數對鏡頭所造成的桶形畸變[6]進行消除,從而得到無畸變且更為平整的識別圖像。基于此調試,再次在設定范圍內對常數大量測試,最終得到的常數典型值為1.5,在此值下相對誤差控制在2%以內。
在機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規則多邊形等方式勾勒出需要處理的區域,稱為感興趣區(ROI),并進行圖像的下一步處理。ROI的作用便是在攝像頭視野內選取特定的一片范圍,并只對此范圍內的圖像進行識別運算等操作。車牌識別的算法基于OpenMV的模板匹配算法Ncc[7],首先需要創建或導入1個車牌模板,這個車牌模板必須為PGM格式,而且大小不能超過OpenMV的像素大小。多車牌識別的情況下需要往SD卡中導入多個車牌模板,從而實現多車牌識別。
3.2.1 程序算法簡述
在本文設計的控制系統中,設定靠近超聲波傳感器檢測范圍的視野區域為感興趣區,可以讓路口范圍的車輛駛入使檢測更為精準,避免行人、動物等擾動因素帶來的主控程序誤差,同時感興趣區的設定較為簡單,且與全視野內的車流量檢測不沖突。Ncc模板匹配算法可將OpenMV視野內的所有符合SD卡中儲存模板的圖像以矩形框圖圈出來,并讀取到每個圖像中心點的坐標。當OpenMV機器視覺模塊啟動后,通過程序調用,對視野內所有圖像進行遍歷,識別成功1個車牌,車流量計數加1。
3.2.2 核心程序
(1) 車牌識別與車流量統計
templates = ["License plate1.pgm", "License plate2.pgm", "License plate3.pgm", "License plate4.pgm","License plate5.pgm","License plate6.pgm","License plate7.pgm","License plate8.pgm","License plate12.pgm","License plate11.pgm","License plate10.pgm","License plate9.pgm","License plate13.pgm","License plate17.pgm","License plate21.pgm","License plate25.pgm""License plate14.pgm","License plate18.pgm","License plate22.pgm","License plate26.pgm","License plate15.pgm","License plate19.pgm","License plate23.pgm","License plate27.pgm","License plate16.pgm","License plate20.pgm","License plate24.pgm","License plate28.pgm",]
clock = time.clock()
while (True):
clock.tick()
img = sensor.snapshot()
i=0
for t in templates:
template = image.Image(t)
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX)
if r:
img.draw_rectangle(r)
print(t)
i++
else:
i=0
if i>20:
print("車流為大")
else:
print("車流量為小")
(2) 感興趣區內車牌檢測
license = image.Image("/license1.pgm")
clock = time.clock()
while (True):
clock.tick()
img = sensor.snapshot()
i = img.find_template(license, 0.70, roi=[0,0,160,120],step=4, search=SEARCH_EX)
roi可根據需求進行定義,同時應注意模板圖片大小,必要時對模板進行降采樣
if i:
img.draw_rectangle(i)
在Arduino IDE編程環境下用C語言編寫系統控制程序,可以方便實現多條件分支邏輯。智能交通燈系統控制程序的邏輯如圖5所示。

圖5 主程序控制邏輯
首先交通燈主控系統初始化狀態,同時OpenMV視野中靠近超聲波傳感器(即路口)的區域設定為ROI,此時東西雙向綠燈亮,車輛正常通行,南北雙向紅燈亮,車輛禁止通行,同時南北雙向超聲波測距傳感器模塊與OpenMV模塊開始檢測有無車輛駛入。在主控程序中為超聲波測距傳感器測量范圍進行設定,設定值為3 m。在此條件下,若超聲波測距傳感器模塊檢測到車輛,且OpenMV感興趣區內檢測到車牌,確認駛入的是車輛而非行人或小動物等其他擾亂因素,即表示車輛已到達路口,需要通行。當超聲波傳感器檢測到有車輛駛入檢測范圍需要通行時,啟動OpenMV機器視覺模塊對全視野內的車距與車流量進行檢測與計算。當計算所得車流量≥20輛或車輛滯留時間超過30 s時,南北雙向指示燈變為綠燈,車輛即可通行,通行時間為30 s,同時東西雙向指示燈變為紅燈,車輛禁止通行。南北雙向通行30 s結束后,東西雙向綠燈亮,車輛通行,南北雙向紅燈亮,車輛禁行。同時,南北方向超聲波傳感器模塊開始繼續檢測有無車輛駛入,并通過OpenMV對車距與車流量數據進行統計。
本文在實驗室環境下以1∶40比例模擬設計了基于流量檢測的智能交通燈控制系統,實驗數據表明,基于OpenMV的車距測量和車牌識別具有較高的精度,能夠根據車流量動態設置交通燈通行時間。在實際應用中,可在現有交通燈控制系統的基礎上進行改造,不需要對路面進行大規模破土挖掘,只需要更換控制板以及在路面加裝工業級超聲波傳感器與攝像頭模塊即可。因此,利用本系統對原有交通燈控制系統進行改造技術簡單、費用低,但能有效提高主路的通行效率,對緩解城市道路的交通擁堵具有重要的現實意義。