用Matlab实现路口车量的计数

本文介绍了如何使用Matlab进行路口车量计数,采用背景差分法,通过灰度化和二值化处理图像,去除噪声。针对不同车道的特点选择合适的计算区域,并提供代码示例展示分析过程。尽管存在处理时间较长的问题,但通过优化如跳帧处理,可实现基本的实时计数功能。
摘要由CSDN通过智能技术生成
最近有一个作业,用matlab写一段代码来检测路口的车流量(虽然我一直喜欢用C胜过用matlab,原因你懂的,但是这是作业没办法),简单实现了下。

这里写图片描述
这是视频中的一帧图片,可以看到主要分为4个车道(应该有5个)由于视频是直行时拍的所以不考虑最右边的转弯车道,也不考虑自行车等非机动车。
首先这边使用背景差分法,由于视频的时间比较短,笔者只选用了没有车的一张图片作为背景,如果要进行长时间的计算,应该进行背景的更新,效果应该会更好一些。背景更新,可以用均值滤波法,W4法或者一些背景统计的算法。
将背景转化为灰度,;
在选取另一张图片,转化为灰度图,与原来背景灰度图进行相减,可以得到一张背景差分图片,再将背景差分图转化为二值图像,在转化为二值图像时用合适的阈值将车道上的噪声消除(有车时几乎没有噪声,无车时噪声出奇大,这可能与摄像头有关),这里转换出来的车可能被分割为大大小小多块,笔者用的时膨胀和腐蚀,将小的腐蚀掉或用膨胀将大块和小块相连接。

对整个机动车道按车道分成四部分:

这里写图片描述

可以用matlab中figure上的数据游标大致的测量出车道(图中的黑线)在图片中坐标位置,大致计算出黑线的函数表达式,方便对车道的切割。
如图:

这里写图片描述
这是笔者对第一车道的分割结果。
主要代码要根据你的黑线函数式:

 for u=1:a(1,1)
        for v=1:a(1,2)
            if(v>(u-287)/(-1.6)&&v<((u-843)/(-3)))
              dst1(u,v,1)=erzhi(u,v,1);
             elseif(v>((u-843)/(-3))&&v<(u+4551)/(13))
              dst2(u,v,1)=erzhi(u,v,1);
            elseif(v<((u+1327)/(3.2))&&v>(u+4551)/(13))
               dst3(u,v,1)=erzhi(u,v,1);
            elseif(v>((u+1327)/(3.2))&&v<(u+1006)/(2))
               dst4(u,v,1)=erzhi(u,v,1);
            end   
        end
这是笔者的分割,主要是将相应坐标像素复制到了四张新的图片中(额~,现在只是在分析,这种复制的方法只适合在分析时使用,实际复制出奇的慢)
对每一个车道进行计数。
对车的计数方法有很多种,可以选择线计数,可以选择块计数,点计数等等,这里我使用块计数,即选取某一块区域当区域中白点(二值化后车的部分),到达一定数目时表明这是有车。由于车速比较慢,不可能在一帧的时间间隔内完全驶过这个区域,所以我将区域由黑变白的时刻当成一辆车,即设置一个标志,记录这时是否有车,与记录上一帧是否有车的标志相减,如果为1,则该车道的车数加一。
代码:
 for u=261:281
        
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值