尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于OpenCV的车辆检测与记数

发布时间:2026/9/29 5:35:22

资讯中心
01
ARTICLE

基于OpenCV的车辆检测与记数

基于OpenCV的车辆检测与记数
文章目录概要整体架构流程1. 获取车流量视频2. 视频预处理2.1 灰度变换2.2 背景减除2.3 高斯滤波去噪2.4 腐蚀操作2.5 膨胀操作2.6 闭运算操作3. 轮廓查找4. 过滤小矩形5. 确立检测线6. 对汽车抽象7. 统计汽车数量最终项目演示项目完整代码小结概要本文提出一种简单有效的基于opencv的车辆检测与计数方法。首先通过高速公路上的摄像头获取到一段车流量视频先预处理利用灰度线性变换为了只关注视频中车辆移动的特征不关注不同车辆的不同颜色的干扰特征然后对灰度视频去除背景进一步抑制车辆外的其他特征接着进行高斯滤波降噪得到噪声很少的二值化黑白视频。然后进行腐蚀膨胀闭运算等形态学的相关操作进一步完善我们近景移动车辆的特征抑制其他无关特征。接着通过外接矩形框的方式对近景的每辆车查找轮廓确定检测线的高度将外接矩形框抽象为一点设置检测线的偏移量来进一步提高车辆统计的精度。结果 我们获取到的视频中所有车辆都能通过经过检测线的形式来准确记录。结论 基于opencv的车辆检测与计数能够将摄像头记录的视频中车辆信息给精确记录但是对部分车辆的精确度还不够高通过之后的改进可以运用到我们的实际生活中完善我们的智能交通管理体系。整体架构流程1. 获取车流量视频capcv2.VideoCapture()ret,framecap.read()第一个参数ret 为True 或者False,代表有没有读取到视频帧第二个参数frame表示截取到一帧的图片importcv2# 加载视频capcv2.VideoCapture(.\\data\\cars1.mp4)# 循环读取视频帧whileTrue:ret,framecap.read()ifretisTrue:cv2.imshow(video,frame)keycv2.waitKey(20)# 用户按ESC退出ifkey27:break# 释放资源cap.release()cv2.destroyAllWindows()车流量视频2. 视频预处理2.1 灰度变换图像的灰度变换将一幅彩色图像转换为灰度化图像的过程。特点1. 改善图像的质量使图像能够显示更多的细节提高图像的对比度。2. 有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征。3. 可以有效的改变图像的直方图分布使像素的分布更为均匀。4. 在数字图像处理中一般将各种格式的图像转换为灰度图像以使后续的图像计算量少一些。2.2 背景减除背景减除Background Subtraction是视频图像中运动目标检测任务的主要预处理步骤如果我们有完整的静止的背景帧那么我们可以通过帧差法来计算像素差从而获得到前景对象。工作原理使用 KK 3 或 5个高斯分布混合对背景像素进行建模。使用这些颜色存在时间的长短作为混合的权重。背景的颜色一般持续的时间最长而且更加静止。移动的物体会被标记为白色背景会被标记为黑色的2.3 高斯滤波去噪高斯滤波(Gauss)是一种线性平滑滤波适用于消除高斯噪声广泛用于图像处理的减噪过程。高斯滤波是对整幅图像进行加权平均的过程每一个像素点的值都由他本身和邻域内的其他像素值经过加权平均后得到。卷积核的选取在高斯滤波中卷积核中的值按照距离中心点的远近赋予不同的权重分别用337715*15的卷积核并对水平方向和垂直方向的权重进行不同的赋值然后对视频效果分析。实验结论使用3*3的高斯卷积核并且权重值sigmaXsigmaY5时降噪效果最好。对视频进行先去噪、后背景减除比先背景减除、后去噪的效果要好很多。使用高斯滤波降噪前使用高斯滤波降噪后2.4 腐蚀操作腐蚀erossion是指卷积核沿着图像滑动把物体的边界腐蚀掉。使图像沿着边界向内收缩可以将小于指定结构体元素的部分去除。实现去除噪声、元素分割等功能。 扩大黑色部分减小白色部分工作原理如果卷积核对应的原图的所有像素值为1那么中心元素就保持原来的值否则变为零。操作原因由于在使用高斯降噪后依然有许多细小边缘和噪声点存在所以使用腐蚀操作可以很好地去除。腐蚀操作前腐蚀操作后2.5 膨胀操作膨胀dilation是用结构元素的原点遍历所有原图像的背景点若结构元素与原图像中的前景点有重叠的部分则标记原图像中的该背景点使之成新的前景点从而实现将图像的边界点向外扩张。工作原理卷积核对应的原图像像素值中只要有一个是1中心像素值就是1。操作原因由于在腐蚀操作后车辆会丢失部分信息所以使用膨胀运算可以使车的部分信息进行还原。膨胀操作前膨胀操作后2.6 闭运算操作闭运算closing是先膨胀在腐蚀主要用于填充白色物体内细小黑色空洞的区域。闭运算的特点是能够排除小型空洞平滑物体轮廓连接窄的间断点以及沟壑同时也能够填补断裂的轮廓线。操作原因先腐蚀在膨胀的操作相当于进行了一个开运算消除亮度较高的细小区域但是得到的视频中汽车内部有细小黑色空洞的区域所以要使用闭运算来填充汽车内部的小孔。3. 轮廓查找外接矩形在闭运算结束之后已经基本可以识别近景处的汽车轮廓可以通过外接矩形框出每一辆车如下左图所示。获取外接矩形的数据点 (x, y, w, h) cv2.boundingRect(contour)画出外接矩形框 cv2.rectangle(frame, (x, y), (xw, y h), (0, 255, 0), 2)存在的问题虽然经过了前面的闭运算操作消除了视频中车辆以外的外部干扰因素但是因为有的汽车内部可能会有车窗、车灯等内部干扰因素导致部分汽车内部会充满很多细小矩形如右图所示。4. 过滤小矩形改进为了去掉在大矩形内部的小矩形通过实验我们确定了最小长宽即min_w50和min_h50当矩形的长宽小于50时这个矩形就被认为是无效的这样就可以过滤小矩形如下图。5. 确立检测线检测线的确定检测线的作用是当汽车通过线则进行记数所以在检测线的位置line_high要尽量靠近近景区域因为近景区域汽车细节更加完善也更容易进行识别。但不应该过于靠前因为过于靠前可能反向车道的汽车还没有形成外接矩形就已经通过线所以最终确定下图所示的检测线位置line_high550。画出检测线cv2.line(frame,(0,line_high),(1280,line_high),(255,255,0),2)6. 对汽车抽象存在的问题当汽车通过检测线时会增加统计数据但由于很难对判断整个外接矩形是否过线并且当车辆较多时可以发现按照矩形框经过检测线的次数来计数会使统计数目不准。改进所以我们将汽车抽象为外接矩形的中心点这时只需要判断中心点是否通过线就可以清楚地统计经过汽车的数量如下图。获取中心点的坐标cxint(x0.5*w)cyint(y0.5*h)画出中心点cv2.circle(frame,(cx,cy),5,(0,0,255),-1)7. 统计汽车数量存在的问题由于视频帧数限制有的车辆可能没有办法正好落在检测线上。改进当存在一个偏移量时就可以避免了中心点没有落在检测线上而不被统计的情况。我们定义一个偏移量offset用来表示汽车中心点位于检测线最远的偏移距离这样我们可以得到有效区间 [检测线高度 – offset , 检测线高度 offset]当汽车的中心点位于有效区间时我们会对车辆进行统计并且经过多次实验确定了offset5时其车辆计数基本上没有遗漏满足我们此次项目的需求。最终项目演示作品效果演示项目完整代码importcv2# 加载视频capcv2.VideoCapture(.\\data\\cars1.mp4)# 创建mog对象去除图像的背景mogcv2.bgsegm.createBackgroundSubtractorMOG()# 构造5×5的结构元素结构为十字形kernelcv2.getStructuringElement(cv2.MORPH_RECT,(5,5))# 设定车辆外接矩形框的最小宽度和最小高度min_w50min_h50# 设定计数线的高度line_high550# 偏移量offset5# 对车计数carnum0# 保存视频# # 参数保存路径编码器帧率画面尺寸是否彩色# width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度# height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度# fps cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率# fourcc int(cap.get(cv2.CAP_PROP_FOURCC)) # 视频的编码## out cv2.VideoWriter(.\\data\\cars1_final1.mp4, fourcc, fps, (width, height), True)# 循环读取视频帧whileTrue:# 第一个参数ret 为True 或者False,代表有没有读取到图片# 第二个参数frame表示截取到一帧的图片ret,framecap.read()# 通过设置缩放比例对图像进行放大或缩小, (这里若对窗口的粗存更改则会使矩形框的位置失真)# dst cv2.resize(frame, None, fx0.8, fy0.8, interpolationcv2.INTER_CUBIC)ifretisTrue:# 将原始帧灰度化graycv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 高斯滤波去噪卷积核为3*3blurcv2.GaussianBlur(gray,(3,3),5)# 获取去背景后的数据maskmog.apply(blur)# 腐蚀:卷积核对应的原图的所有像素值为1吗那么中心元素像素值不变否则变为0. ”扩大黑色部分减小白色部分。“erodecv2.erode(mask,kernel)# 膨胀卷积核对应的与图像像素值中只要有一个是1中心像素值就为1.dilatecv2.dilate(erode,kernel,iterations1)# 闭运算先膨胀后腐蚀用于填充白色物体内细小黑色空洞的区域 消除内部小块closecv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)# 查找轮廓:# cv2.findContours(img, mode, method):cv2.RETR_EXTERNAL只检测外轮廓;cv2.RETR_LIST检测的轮廓不建立等级关系。contours,hcv2.findContours(close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 画出检测线cv2.line(frame,(0,line_high),(1280,line_high),(255,255,0),2)# 画出所有检测出的轮廓forcontourincontours:# 获得外接矩形的四个数据点x轴坐标y轴坐标矩形的宽矩形的高(x,y,w,h)cv2.boundingRect(contour)# 通过外接矩形的宽高大小来过滤小矩形ifnot((wmin_w)and(hmin_h)):continueif(wmin_w)and(hmin_h):# 这里只计算正常的汽车# 画外接矩形的轮廓 (0, 255, 0)颜色 2线条的粗细cv2.rectangle(frame,(x,y),(xw,yh),(0,0,255),2)# 把车抽象为一点要通过外接矩形计算矩形的中心点cxint(x0.5*w)cyint(y0.5*h)# 画中心圆点cv2.circle(frame,(cx,cy),5,(0,0,255),-1)# 判断汽车是否过检测线if(line_high-offset)cy(line_highoffset):carnum1# 落入有效区间计数1print(carnum)# cv2.imshow(video1, frame)# cv2.imshow(video2, dst)# cv2.imshow(video3, gray)# cv2.imshow(video4, blur)# cv2.imshow(video5, mask)# cv2.imshow(video6, erode)# cv2.imshow(video7, dilate)# cv2.imshow(video8, close)cv2.putText(frame,Vehicle Count:str(carnum),(420,60),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),5)cv2.imshow(frame,frame)# 保存视频帧到视频容器# out.write(frame)keycv2.waitKey(50)# 按ESC退出ifkey27:break# 释放资源cap.release()cv2.destroyALLWindows()小结通过这几周的不懈努力项目已基本满足作品的预期和要求。但是从项目的整体性和完美性来说还存在以下几点需要改进在背景减除的时候一共找到了七种方法但是每种方法都有其优缺点最终使用了最经典的BackgroundSubtractorMOG方法因为它的成像质量非常好不会有太多噪声能满足本次的项目但此方法并不会将视频中的车辆移动的阴影删除。在实际生活中当车辆太近时不同的车辆通过其阴影连接将会影响车辆的计数。希望在接下来的学习中将其改进。在过滤完小矩形后虽然能将一些车窗车灯等小的内部干扰清除但是在实际生活中如果车道上同时存在大卡车和小轿车有可能大卡车上干扰信息的矩形框近似等于小轿车或者存在载有小轿车的运输车那么本项目对车辆的计数不太准确。由于本次项目使用传统的opencv对其视频中的车辆进行计数简短的视频是可以通过获取每帧的图像在对其进行一系列的判断处理。但是对部分型号车辆统计的精确度不够高所以希望通过之后的机器学习来进一步改进项目。通过本次项目的制作和相关文献的查阅不仅回顾了图像处理课程的相关知识也对学习到了关于图像形态学的相关知识还进一步的运用到实际项目中提高了对项目的研究能力和实践能力。车辆检测的原视频已经存放在kaggle官网和CSDN有需要的麻烦点赞收藏祝大家都能熟练掌握这个小项目kagglehttps://www.kaggle.com/datasets/cxdlearning/vehicle-detection-raw-videoCSDNhttps://download.csdn.net/download/weixin_44342777/93517745?spm1001.2014.3001.5501
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。