基于图像处理的车辆识别及智能信号灯控制系统


1 项目概述

1.1项目要求

本项目要求使用Simulink仿真实现车辆识别计数和仿真交通信号灯系统,并且使用硬件搭信号灯控制系统的电路,将程序上传至Arduino控制器,实现硬件信号灯显示和数码管计数功能。

Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。其特点:

(1)跨平台:Arduino IDE可以在Windows、Macintosh OS X、Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。

(2)简单清晰:Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。

(3)开放性:Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。

(4)编程方式多样,代码简洁:Arduino编程主要有以下几种方式:第一种是使用官网Arduino IDE编程环境,这可以在官网下载,支持Windows,MacOS,Linux操作系统。第二如果不太喜欢写代码,或者是教小孩子玩Arduino,也有图形化的编程环境,比如Mixly/Scratch。

1.2项目内容及方案

这里将项目划分成三大块内容,分别是:

1、视频车辆的识别和计数。该模块使用Simulink仿真实现,共分为三个阶段,分别是背景提取、识别车辆和车辆计数,最终实现视频中车辆的识别用目标框标出,并且统计经过车辆的数目,以字幕的形式显示在画面中。

2、红绿灯设计。设计一个十字路口(东西、南北)的交通灯控制电路,放行时间由车流量决定。该模块要求实现以下4个状态:

S1:东西方向绿灯亮,南北方向红灯亮,时间T1;

S2:东西方向黄灯亮,南北方向红灯亮,时间5s;

S3:南北方向绿灯亮,东西方向红灯亮,时间T2;

S4:南北方向黄灯亮,东西方向红灯亮,时间5s。

红绿灯设计的相关设计要求如下:

(1)东西及南北方向的车辆交替放行,放行时间依据车流量设定;

(2)每次绿灯变红灯时,黄灯先亮5秒;

(3)具有倒计时功能。

3、人行横道信号灯设计。人行横道信号灯是专门为方便行人设计的一种交通信号灯。行人穿越马路,只需按一下灯杆上的绿色按钮,车辆信号灯变红,人行信号灯变绿,行人就可以安全通过。该模块的设计要求如下:

(1)车辆信号灯由红灯、绿灯、黄灯组成。红灯表示禁止通行,绿灯表示准许通行,黄灯表示警示。人行信号灯由红灯、绿灯组成,红灯表示禁止通行,绿灯表示准许通行,绿灯闪烁提醒行人快速通过;

(2)初始状态(S1):车辆信号灯绿灯亮,人行信号灯红灯亮,车辆行驶;

(3)当行人按下按钮,车辆信号灯由绿灯→黄灯闪(3秒)→红灯,人行信号灯由红灯→绿灯(亮10秒)→绿灯(闪5秒),灯闪烁的时间间隔为0.5s;

(4)使用七段数码管进行倒计时;

(5)使用Simulink编写程序,使用Arduino控制板、面包板、LED灯等搭建电路。

2 项目原理

2.1背景提取

输入车辆行驶路段视频,首先将原视频的RGB图像转换成灰度图像,方便后续处理,然后提取图像背景。背景提取是在视频图像序列中提取出静止不动的景物,因为摄像机是不动的,因此图像中的每个像素点都有一个对应的背景值,在一段时间内,这个背景值是比较固定的。背景提取的目标就是根据视频图像序列,找出图像中每一点的背景值。背景提取有很多算法,包括中值法、帧间差分法、高斯背景差分法、ViBe背景提取算法以及它的改进算法ViBe+,还有针对运动摄像机的光流法等。

本项目使用简单的中值法来提取图像背景,背景是静止不动的,像素值几乎保持不变。获取视频不同帧的若干张图片,将其对应点的像素大小相加,取中值即为背景像素值,于是就提取出了视频的背景。

2.2识别车辆

将原视频减去上一步骤中提取出的背景就可以得到车辆图像。但是,这会使黑色车辆无法显示,通过对图像加绝对值的方法实现黑色车辆也可以显示。然后将灰度图像转换成二值图像,使车辆显示更加清晰,可以非常清楚的识别出所有车辆。然后对车辆进行填充,再使用Blob Analysis模块调用opencv的功能函数包,实现车辆位置检测,给识别到的车辆添加目标框,设置目标框的线宽和颜色等参数,并且添加字幕显示当前画面中的车辆数目。

2.3车辆计数

车辆计数通过在图像中放置矩形框并检测是否有车辆经过矩形框的方式实现,首先绘制两个矩形框,将其放置在视频底部,使所有通过的车辆都能经过这两个矩形框,从而都能被检测到。

编写程序,用于判断矩形框中是否有车辆通过,如果有车辆通过则计数加1,不断累计。这里使用Chart模块实现不停的脉冲累计,当计数结果达到100就重新开始计数。将两个矩形框得到的车辆数目相加,即可得到最终的车辆总数。

2.4红绿灯设计

红绿灯设计模块使用MATLAB中的Chart模块来设计,首先设计四个状态,并给四个状态添加变量,其对应的状态表如下:

S1 0 0 1 1 0 0 T1

S2 0 1 0 1 0 0 5s

S3 1 0 0 0 0 1 T2

S4 1 0 0 0 1 0 5s

根据状态表设置好四个状态,定义好实验所需的计数变量EW_Count和SN_Count,根据设计要求和状态之间的转换条件,在Chart模块的状态之间放置转换条件,添加倒计时功能,其中放行时间T1和T2的设定条件依据下表设定。

条件 → 执行

N >30 → T1=55; T2=35;

N>10 && N<=30 → T1=50; T2=40;

N>-10 && N<=10 → T1=45; T2=45;

N>-30 && N<=-10 → T1=40; T2=50;

N<=-30 → T1=35; T2=55;

给最终设计好的模块设置输出端口使其与Arduino控制板相连,连接好硬件电路、信号灯和数码管,安装好相关驱动并进行设置,运行程序,数码管开始执行倒计时,倒计时结束信号灯转换,实现了完整的信号灯控制系统。

2.5人行横道信号灯

人行横道信号灯设计模块同样使用MATLAB中的Chart模块,首先设计四个状态并添加变量,其中S2和S4状态要实现闪烁,所以将其分成两个块。

根据状态表设置每个状态所需变量,根据状态之间的转换条件进行状态连接,使其实现上文设计要求中的状态转换,并实现倒计时功能。给最终设计好的模块设置输出端口使其与Arduino控制板相连,连接好硬件电路、信号灯和数码管,安装好相关驱动并进行设置,运行程序,数码管开始倒计时,倒计时结束状态转换,实现了一个完整的人行横道信号灯控制系统。


文章作者: BoBoRing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BoBoRing !
评论
  目录