python+opencv实时识别路口车流量

最近智慧城市这个名词越来越被大家知晓,各大城市都在全力打造智慧城市,那么智慧城市中有一个重要的部分就是智慧交通,让AI来指挥整个城市的红绿灯系统,从而减少交通的拥堵,那么AI是如何识别各个路口的实时车流量的呢,下面小编带大家用python+opencv来检测路口的实时车流量。

python+opencv实时识别路口车流量

今天我们使用一款开源github库来实现,该库的地址:

https://github.com/alex-drake/OpenCV-Traffic-Counter

主代码为:trafficCounter/blobDetection.py

该项目的目的是实时检测道路路口的车流量,整个项目分为两个部分,车辆检测与车辆计数。

▊ 车辆检测

为了计算车辆,我们首先需要能够在图像中检测到它们。对于人类来说,这很简单,但是在机器的世界中却很难实现。但是,如果我们认为图像只是一个数字数组(每个像素一个值),则可以使用它来确定车辆的外观以及在没有车辆的情况下期望看到的图像。我们可以使用OpenCV查看这两种情况下某些像素的值如何变化,如下图所示。为此,我们必须首先将图像从RGB通道(红色,绿色蓝色)转换为HSV(色相,饱和度,值),并检查每个通道是否可以告诉我们一些信息。

python+opencv实时识别路口车流量
从直方图可以看出,色相通道没有提供太多信息,而饱和度和值通道都清楚地显示了车辆/无车辆条件之间的差异,因此我们可以在检测算法中使用此通道。但是,为简单起见,我们暂时仅使用Value通道。

我们还需要一张没有车辆的背景图片,通过摄像头实时获取的交通实景图的帧数据来计算差异区域,当然还要设置一个阀值。
python+opencv实时识别路口车流量

 python+opencv实时识别路口车流量

上面的图像显示了满足阈值标准的像素(左),以及将这些像素设置为最大值/亮度后得到的形状(右)。同样突出显示(绿色)的是我们物体上的空隙,其中深色区域(挡风玻璃,格栅等)可能不符合我们的阈值标准。稍后可能会引起一些问题,因此我们尝试使用OpenCV库中的腐蚀和膨胀函数来填补这些空白。

一旦对创建的形状感到满意,我们就必须检查这些形状(或轮廓),以确定哪些形状是车辆,然后再将那些不是车的形状排除。我们可以通过这样的条件来实现:仅当检测到的轮廓超过一定大小时,我们才对认为是车辆。请注意,这将根据视频源大小的不同而改变。

▊ 车辆计数

车辆计数器分为两个类别对象,一个命名对象Vehicle用于定义每个车辆对象,另一个Vehicle Counter确定哪些“车辆”有效(在对它们进行计数之前或之后)。Vehicle相对简单,它提供有关每个检测到的对象的信息,例如每个帧中的跟踪位置,它出现在多少帧中(还有多少帧没有被看到),是否计算了车辆尚未驶入,以及我们认为车辆将驶向哪个方向。我们还可以获取最后一个位置和该位置之前的位置,以便在Vehicle Counter算法中计算出一些值。

Vehicle Counter更复杂,有多种用途。我们可以使用它来确定每个被跟踪车辆在帧与帧之间的矢量运动,从而指示出哪些运动是正确的,哪些是错误的匹配。我们这样做是为了确保我们不会错误地匹配车辆,从而获得最准确的计数。在这种情况下,我们只希望车辆从图像的顶部行驶到右下角或相反方向。这意味着我们仅根据车辆移动的角度在一定范围内允许矢量运动-从下图可以看出。左图显示了预期的矢量运动(以红色突出显示),左图显示了距离与角度的关系图-归类为允许运动的图由绿色框突出显示。

python+opencv实时识别路口车流量

如果车辆对象满足上述条件,则我们可以检查其前进方向。然后,我们可以使用此信息来确定是否应该对车辆进行计数,最后将计数应用于左车道(向上方向)还是右车道(向下方向)。一旦满意,我们将更新计数器并将其打印到输出帧。如果有一段时间没有看到车辆,我们将其从追踪对象列表中删除。

▊ 遗留问题

在白天时段内流量畅通的情况下,使用的算法效果很好。它在大多数天气条件下也能很好地发挥作用,尽管在强风中很难去除背景,因为移动的相机意味着背景也会快速变化。但是,当车辆靠近或有大阴影(形成一个大物体),黑暗的车辆并不总是满足检测标准时,精度会下降,并且夜景很难分辨,因为前照灯会产生满足阈值标准的较大区域。每个摄像机的检测标准也相对不同,因此可能需要花费一些时间来完善这些值,才能对输出计数产生信心。

这些问题中的许多问题都可以通过研究可替代的检测方法来解决,这些方法并不非常依赖检测阈值以上的像素。为此,使用HAAR级联检测车辆可能会解决这些问题,或者至少提供一种更准确,一致的方法来计算各种条件下的车辆,而不必过多担心初始检测值。也就是说,这将需要良好的训练数据以及每个摄像机的潜在数据。

{{collectdata}}

网友评论0