基于OpenMV的智能交通灯系统设计
2023-12-13韩立立刘晓然刘文杰肖保鑫尹教建
韩立立, 刘晓然, 刘文杰, 肖保鑫, 尹教建
(中国石油大学(华东), a. 理学院, b. 石大山能新能源学院, c. 计算机科学与技术学院, d. 机电工程学院, 山东, 青岛 266580)
0 引言
随着社会经济的发展、人民生活质量的提高,我国机动车保有量已达3.9亿辆(根据公安部2021年10月最新统计数据),道路交通压力愈发显著。实地考察发现,大部分十字路口在不同方向上车流量并不均等,而普通交通信号灯系统、各方向的通行时间是固定的,这样经常会出现某一方向绿灯却无车,另一方向有车却是红灯的情况,导致路口通行效率不高。在国外智能交通系统(ITS)相关研究中,图像视频处理技术得到广泛应用[1],实现了交通灯实时自适应控制。
基于以上现状,本文在实验室环境下以1∶40比例模拟设计了一种基于流量检测的智能交通灯控制系统,通过OpenMV机器视觉进行车距和车流辆检测,根据车流量动态设置交通灯通行时间。系统以Arduino UNO单片机为核心处理器,控制交通信号灯显示;用超声波传感器探测道路有无机动车驶入;如有车辆驶入,利用OpenMV机器视觉模块检测车距和车流量,根据车流量大小,控制交通灯的显示,智能分配通行时间,从而实现提高道路通行效率的目的。
1 智能交通灯系统总体设计
系统总体结构设计如图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所示。系统硬件包含2个Arduino UNO单片机、2个超声波传感器HC-SR04、2个I/O扩展芯片74HC595D、2个数码管显示译码器74LS48芯片、2个OpenMV机器视觉模块、4组数码显示管、4组红绿灯以及1个LCD1602液晶屏。其中:第一个单片机用来控制红绿灯、数码管以及超声波传感器,并发送开始工作信号给第二个单片机;第二个单片机用途是处理OpenMV发送来的车距、车牌等数据,并将数据显示在LCD屏幕上。
图2 智能交通灯系统电路图
图3 数码管驱动电路图
2.1 核心微控制器选型
对于智能交通灯控制系统,选用Arduino UNO单片机[2]作为核心控制器。Arduino UNO是一块单片机开发板,其核心是ATmega328 MCU控制器,集成了最小系统、闪存存储器、I/O接口、电源电路、在线编程电路等硬件。通过1条USB数据线连接电脑,就可以实现供电和程序烧录,具备数字输入/输出接口、PWM输出接口和模拟输入接口均可以通过杜邦线引出,电路搭接方便。利用Arduino IDE编程环境编写系统控制程序,通过数据线传送到Arduino UNO开发板,控制外部电路工作。
2.2 单片机I/O接口的扩展
为了解决Arduino UNO单片机数字端口较少的问题,本系统采用1块74HC595D集成芯片来进行端口扩展[3]。74HC595D是八位串行输入/并行输出移位寄存器,具有三态输出和输出锁存功能。在数据移位的过程中,74HC595D的数据输出寄存器可以保证输出数据保持不变,从而避免数码管和红绿灯出现闪烁现象。将Arduino UNO开发板的3个数字端口分别连接至74HC595D芯片的14脚DS数据引脚data、12脚ST_CP锁存线LATCH 和11脚SH_CP时钟线引脚clock,即可将单片机的3个端口扩展为8个端口,十分便捷且功能稳定,编程较为方便。
2.3 数码显示电路设计
系统需要4组数码管显示电路,2组用于显示东西双向通行计时,2组用于显示南北双向通行计时。因为相对方向始终同时放行或禁行,所以东西向2组数码管显示计数值相同,南北向2组数码管显示计数值相同。因此,东西向2组数码管连接在同一组驱动接口上,南北向2组数码管连接在另一组驱动接口上即可。74LS48芯片是共阴极LED七段显示数码管显示译码器,用于将8421BCD码转换为数码管显示相应十进制数字的段码[4]。本系统采用2个74LS48芯片作为单片机和数码管连接的桥梁,既方便编写相应程序,又减少了单片机I/O接口的使用数量。由于本系统使用双位数码管,所以采用动态扫描方法,即让每位数码管轮流显示,设置间隔时间极短,利用视觉暂留现象,可以同时看到2位数码管显示的数字。
2.4 OpenMV机器视觉模块电路连接
OpenMV以串口通信的方式将识别到的图像及其处理结果发送至Arduino UNO主控板,其连接方式为共地后将OpenMV的发送端TXD(P4)连接到主控板的接收端RXD(D0)。将OpenMV的接收端RXD(P5)连接到主控板的发送端TXD(D1),从而实现同波特率条件下的串口通信,依靠此种方式可以发送多种字符串。
3 车距及车牌识别软件设计
当超声波传感器检测到有车辆驶入时,发送信号至Arduino UNO主控板,主控板启动OpenMV机器视觉模块[5]进行车距和车牌识别,通过车牌识别累加计算车流量。
3.1 OpenMV车距和车速检测
用一个带有小孔的板遮挡在墙体与物之间,墙体上就会形成物的倒影,这一现象,叫小孔成像。当焦距不变时,物距越近像越大且亮度变亮,物距越远像越小且亮度变暗。基于上述原理,将对车距这一物理量测量转化为对车辆像素点数量的捕获。利用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%以内。
3.2 OpenMV车牌识别
在机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区(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)
4 智能交通灯系统控制程序设计
在Arduino IDE编程环境下用C语言编写系统控制程序,可以方便实现多条件分支逻辑。智能交通灯系统控制程序的逻辑如图5所示。
图5 主程序控制逻辑
首先交通灯主控系统初始化状态,同时OpenMV视野中靠近超声波传感器(即路口)的区域设定为ROI,此时东西双向绿灯亮,车辆正常通行,南北双向红灯亮,车辆禁止通行,同时南北双向超声波测距传感器模块与OpenMV模块开始检测有无车辆驶入。在主控程序中为超声波测距传感器测量范围进行设定,设定值为3 m。在此条件下,若超声波测距传感器模块检测到车辆,且OpenMV感兴趣区内检测到车牌,确认驶入的是车辆而非行人或小动物等其他扰乱因素,即表示车辆已到达路口,需要通行。当超声波传感器检测到有车辆驶入检测范围需要通行时,启动OpenMV机器视觉模块对全视野内的车距与车流量进行检测与计算。当计算所得车流量≥20辆或车辆滞留时间超过30 s时,南北双向指示灯变为绿灯,车辆即可通行,通行时间为30 s,同时东西双向指示灯变为红灯,车辆禁止通行。南北双向通行30 s结束后,东西双向绿灯亮,车辆通行,南北双向红灯亮,车辆禁行。同时,南北方向超声波传感器模块开始继续检测有无车辆驶入,并通过OpenMV对车距与车流量数据进行统计。
5 总结
本文在实验室环境下以1∶40比例模拟设计了基于流量检测的智能交通灯控制系统,实验数据表明,基于OpenMV的车距测量和车牌识别具有较高的精度,能够根据车流量动态设置交通灯通行时间。在实际应用中,可在现有交通灯控制系统的基础上进行改造,不需要对路面进行大规模破土挖掘,只需要更换控制板以及在路面加装工业级超声波传感器与摄像头模块即可。因此,利用本系统对原有交通灯控制系统进行改造技术简单、费用低,但能有效提高主路的通行效率,对缓解城市道路的交通拥堵具有重要的现实意义。