图像识别—辆图像识别和道路车流量流量统计

题目:

辆图像识别和道路车流量流量统计——智能识别系统设计

摘 要:本论文旨在探讨图像识别技术和道路车流量统计在交通管理中的应用。通过使用先进的图像识别算法和机器学习技术,我们可以实现对道路上车辆信息的准确识别和统计,从而为交通管理部门提供实时、准确的车流量数据。

论文首先介绍了图像识别和道路车流量统计的背景和重要性,然后详细阐述了图像识别技术的原理和实现方法,包括卷积神经网络(CNN)、深度信念网络(DBN)等。接着,论文详细描述了道路车流量统计的方法和数据处理过程,包括车辆检测、跟踪、分类等。

在实验部分,论文通过对比不同的图像识别算法和车流量统计方法,验证了所提出方法的准确性和可靠性。最后,论文总结了图像识别技术和道路车流量统计在交通管理中的应用前景,并对未来研究方向进行了展望。

总之,本论文提出了一种基于图像识别技术的道路车流量统计方法,为交通管理部门提供了一种高效、准确的车流量数据采集和分析手段。

介:设计一种视频分析方法,并应用于公路上车辆的检测与流量计数问题

提出方法:检测线法

检测线法就是在待检测图像上的合适位置设置检测线,检测线的作用类似于埋于地下的感应线圈传感器,它的方向与车辆行驶方向垂直,如图1所示。保存位于检测线位置上的参考图像(背景图像或其边缘检测图像)当车辆经过检测线时,检测线位置上的图像就会由于车辆的覆盖而发生改变,当运动物体覆盖检测线的宽度大于某个阈值时就认为检测到一辆车辆。

本文的具体实现是根据估计定义汽车选框的大小,先去除视频中的背景去除,然后逐帧读取视频,转化为灰度图,并找出连续几帧中通过检测线的物体,并将其框起来,再通过根据物体的尺寸大小判断是否是汽车,如果是计数加一,否则不加以计数。

实验部分:

1、准备工作

1.1 涉及到的内容

窗口的显示

图像/视频的加载

基本图像的绘制

车辆识别

基本图像运算与处理

形态学

轮廓查找

1.2 整体流程

1、加载视频

2、通过形态学识别车辆

3、对车辆进行统计

4、显示车辆统计信息

1.加载视频

第一个参数ret True 或者False,代表有没有读取到视频帧
第二个参数frame表示截取到一帧的图片

2.将图片灰化处理;

图像的灰度变换:将一幅彩色图像转换为灰度化图像的过程。

特点:

1. 改善图像的质量,使图像能够显示更多的细节,提高图像的对比度。

2. 有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征。

3. 可以有效的改变图像的直方图分布,使像素的分布更为均匀。

4. 在数字图像处理中一般将各种格式的图像转换为灰度图像以使后续的图像计算量少一些。

灰化后的视频;

3.背景减除

背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤,如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获得到前景对象。

但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在运动,情况会变的更加复杂,为此引入了背景减除法,通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。

cv2.BackgroundSubtractorMOG2()用法:

这是一个以混合高斯模型为基础的前景/背景分割算法。它是 P.KadewTraKuPong 和 R.Bowden 在2001年提出的。

它使用 K(K = 3 或 5)个高斯分布混合对背景像素进行建模。使用这些颜色(在整个视频中)存在时间的长短作为混合的权重。背景的颜色一般持续的时间最长,而且更加静止。

在编写代码时,我们需要使用函数:mog = cv2.bgsegm.createBackgroundSubtractorMOG() 创建一个背景对象。

这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等。将它们全部设置为默认值,然后在整个视频中我们是需要使用 mask = mog.apply(frame) 就可以得到前景的掩膜了。

移动的物体会被标记为白色,背景会被标记为黑色的

4.高斯滤波去噪

高斯滤波(Gauss)是一种线性平滑滤波,适用于消除高斯噪声,广泛用于图像处理的减噪过程。高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由他本身和邻域内的其他像素值经过加权平均后得到。

卷积核的选取:在高斯滤波中,卷积核中的值按照距离中心点的远近赋予不同的权重,分别用33,77,15*15的卷积核,并对水平方向和垂直方向的权重进行不同的赋值,然后对视频效果分析。

实验结论:

使用3*3的高斯卷积核,并且权重值:sigmaX=sigmaY=5时降噪效果最好。

对视频进行先去噪、后背景减除比先背景减除、后去噪的效果要好很多。

对灰度图像进行高斯模糊处理,使用 cv2.GaussianBlur(gray, (3, 3), 5)。

将高斯模糊后的图像应用于 MOG 模型,使用 mog.apply(blur),生成前景掩膜 mask。

高斯滤波去噪前;

高斯滤波去噪后;

5.腐蚀

腐蚀(erossion)是指卷积核沿着图像滑动,把物体的边界腐蚀掉。使图像沿着边界向内收缩,可以将小于指定结构体元素的部分去除。实现去除噪声、元素分割等功能。 (扩大黑色部分,减小白色部分)

工作原理:如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。

操作原因:由于在使用高斯降噪后依然有许多细小边缘和噪声点存在所以使用腐蚀操作可以很好地去除

通过腐蚀操作,使用 cv2.erode(mask, kernel) 去除前景掩膜中的白色噪点。

腐蚀前;

腐蚀前;

腐蚀后:

6、膨胀:

膨胀(dilation)是用结构元素的原点遍历所有原图像的背景点,若结构元素与原图像中的前景点有重叠的部分,则标记原图像中的该背景点,使之成新的前景点,从而实现将图像的边界点向外扩张。

工作原理:卷积核对应的原图像像素值中只要有一个是1,中心像素值就是1

操作原因:由于在腐蚀操作后车辆会丢失部分信息,所以使用膨胀运算可以使车的部分信息进行还原。

通过膨胀操作,使用 cv2.dilate(erode, kernel, iterations=1) 扩展前景区域

膨胀前;

膨胀后;

7闭运算:

闭运算(closing)是先膨胀在腐蚀,主要用于填充白色物体内细小黑色空洞的区域。

闭运算的特点:是能够排除小型空洞,平滑物体轮廓,连接窄的间断点以及沟壑,同时也能够填补断裂的轮廓线。

操作原因:先腐蚀在膨胀的操作相当于进行了一个开运算(消除亮度较高的细小区域),但是得到的视频中汽车内部有细小黑色空洞的区域,所以要使用闭运算来填充汽车内部的小孔。

闭运算前后对比;

8.轮廓查找和过滤小矩形

外接矩形:在闭运算结束之后,已经基本可以识别近景处的汽车轮廓,可以通过外接矩形框出每一辆车,如下左图所示。

获取外接矩形的数据点: (x, y, w, h) = cv2.boundingRect(contour)

画出外接矩形框: cv2.rectangle(frame, (x, y), (x+w, y + h), (0, 255, 0), 2)

存在的问题:虽然经过了前面的闭运算操作,消除了视频中车辆以外的外部干扰因素,但是因为有的汽车内部可能会有车窗、车灯等内部干扰因素,导致部分汽车内部会充满很多细小矩形

过滤小矩形

改进:为了去掉在大矩形内部的小矩形,通过实验,我们确定了最小长宽即min_w=50和min_h=50,当矩形的长宽小于50时,这个矩形就被认为是无效的,这样就可以过滤小矩形

调用cv2.findContours()函数来查找图像中的轮廓。该函数的参数包括源图像(close)、轮廓的提取模式(cv2.RETR_TREE)和轮廓的近似方法(cv2.CHAIN_APPROX_SIMPLE)。返回的contours是一个轮廓的列表,而h是层次结构。

通过cv2.boundingRect()函数计算每个轮廓的最小外接矩形的坐标和尺寸(即该矩形的左上角点的坐标 (x, y) 以及宽度 w 和高度 h)。然后,判断该矩形是否符合要求(宽度大于等于min_w并且高度大于等于min_h),如果不符合要求,则跳过该轮廓的处理。

对于符合要求的矩形,使用cv2.rectangle()函数在原始图像上画出该矩形。

9.画出检测线;

确立检测线

检测线的确定:检测线的作用是当汽车通过线则进行记数,所以在检测线的位置line_high要尽量靠近近景区域,因为近景区域汽车细节更加完善,也更容易进行识别。但不应该过于靠前,因为过于靠前可能反向车道的汽车还没有形成外接矩形,就已经通过线,所以最终确定下图所示的检测线位置

10.确立中心点;

对汽车抽象

存在的问题:当汽车通过检测线时会增加统计数据,但由于很难对判断整个外接矩形是否过线,并且当车辆较多时,可以发现按照矩形框经过检测线的次数来计数,会使统计数目不准。

改进:所以我们将汽车抽象为外接矩形的中心点,这时只需要判断中心点是否通过线就可以清楚地统计经过汽车的数量(如下图)。

获取中心点的坐标

根据外接矩形计算车辆的中心点坐标,并使用cv2.circle()函数在图像上画出这些中心点。

11. 统计汽车数量

存在的问题:由于视频帧数限制,有的车辆可能没有办法正好落在检测线上。

改进:当存在一个偏移量时,就可以避免了中心点没有落在检测线上而不被统计的情况。

我们定义一个偏移量:offset,用来表示汽车中心点位于检测线最远的偏移距离

这样我们可以得到 有效区间 = [检测线高度 – offset , 检测线高度 + offset]

当汽车的中心点位于有效区间时我们会对车辆进行统计,并且经过多次实验,确定了offset=5时,其车辆计数基本上没有遗漏,满足我们此次项目的需求。

首先进入一个循环用来读取视频帧,并处理每一帧图像。在这段代码中,使用了一个名为 cars 的列表来存储检测到的汽车的位置信息。遍历检测到的汽车列表 cars,对于每个汽车的位置 (x, y),通过判断 y 是否在检测线的高度范围内来确定汽车是否通过检测线。通过比较 y 的值和检测线的上下偏移量 (line_high - offset) 和 (line_high + offset),来判断汽车是否位于有效区间内。

如果汽车位于有效区间内,则将车辆计数 carno 加一,并从列表 cars 中移除该位置信息。

使用 cv2.putText() 方法,将车辆计数的文字信息在图像上进行标注。

使用 cv2.imshow() 显示带有车辆计数标注的图像。

等待键盘输入,如果用户按下 ESC 键,则退出循环。

通过以上的步骤,这段代码可以实现对汽车通过检测线的计数功能并在图像上进行展示。

实验结果与分析:

在这个设计中,对于每辆车,会在图像上画出一个矩形框,框出车的外形。程序会在检测到车通过时进行计数,并将车的数量更新到屏幕上。这个过程可以很好地完成。

分析结果表明,这个程序可以准确地进行车辆计数,并且能够正确地识别每一辆车。然而,在过于拥挤的情况下,程序可能会把不同的车辆误认为是同一个,从而影响计数的准确性。因此,如果要在实际应用中使用这个程序,需要仔细调整车辆检测的参数,以实现最佳效果。

总之,这个Python—opengl设计车辆计数的大作业是一个非常有趣和实用的项目,它可以广泛应用于交通管理、智慧城市等领域,帮助我们更好地理解和掌握计算机视觉的相关技术。

论:

1.车辆计数算法的实现:通过使用OpenCV库和OpenGL绘图技术,成功实现了车辆的实时检测和计数功能。

2.准确性与可靠性:经过对2400帧图像的采集记录,程序检测到508辆汽车通过,表明该算法在车辆计数方面具有一定的准确性和可靠性。

3.识别误差:尽管程序能够准确识别每辆车辆,但在过于拥挤的情况下,可能会出现误将不同的车辆视为同一个的情况,从而影响计数的准确性。为了提高识别准确性,需要仔细调整车辆检测参数。

4.实际应用潜力:该作业对计算机视觉和智能交通领域具有一定的应用潜力。通过进一步优化算法和结合其他技术,可以将该车辆计数系统用于交通管理和智能城市等实际场景中。

总的来说,这个Python-opengl设计车辆计数的大作业是一个有趣且有实用价值的项目,它为我们探索计算机视觉和交通管理的交叉点提供了一种思路和实践平台。然而,需要进一步的改进和优化,以适应更广泛的实际应用需求。

参考文献:

[1]郁梅, 王圣男, 蒋刚毅. 复杂交通场景中的车辆检测与跟踪新方法[J]. 光电工程, 2005, 32(2):4.

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值