基于OpenCV的车辆变道检测

使用OpenCV检测和追踪车辆 使用高斯混合模型分离前景再用cvBlob库追踪 阅读详情

点击上方“机器学习算法那些事”,选择加"星标"或“置顶”

重磅干货,第一时间送达


本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢?

01. 数据集

我们将道路上汽车的视频文件用作数据集。当然可以使用图像数据集检测来汽车,但是由于汽车在变道时我们需要通过弹出窗口提供警报,因此对于这些动态情况,视频输入更为可行。

02. 输入

第一步是提供要在本教程中使用的输入-OpenCV的haar级联文件,用于检测汽车的坐标,道路上的汽车的视频文件-

cascade_src = 'cascade/cars.xml'
video_src = 'dataset/cars.mp4'


cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)

cv2.VideoCapture()方法用于捕获输入视频,视频通常为每秒25个图像/帧(fps)。捕获输入后,使用循环提取帧,并使用汽车的haar级联文件检测到的坐标,我们在循环中在汽车周围绘制一个矩形,以在对捕获的帧执行其他操作时获得一致性。

while(1):
# Take each frame
    _, frame = cap.read()
    cars = car_cascade.detectMultiScale(frame, 1.1, 1)
for (x,y,w,h) in cars:
        roi = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)   #ROI is region of interest


在OpenCV中,使用BGR而不是RGB,因此(0,0,255)将在汽车上绘制一个红色矩形,而不是蓝色。

03. 图像处理

如果帧的分辨率很高,则会减慢执行的操作,此外,该帧还包含噪声,可以使用模糊降低噪声,这里使用高斯模糊。

3.1 HSV框架

在此,我们使用从cv2.VideoCapture()捕获的帧中获得的HSV帧仅突出显示汽车转弯的点,并遮挡其余道路和在道路上直行的汽车。设置上限和下限阈值是为了定义HSV中的颜色范围,以查看汽车改变车道的点,并用作框架的遮罩。以下是用于获取此代码的代码段-



    #canceling noise in the video frames using blur
frame = cv2.GaussianBlur(frame,(21,21),0)
    # Convert BGR to HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # define range of color in HSV to see the points at which the car is changing angles
lower_limit = np.array([0,150,150])
upper_limit = np.array([10,255,255])
    # Threshold the HSV image to get only the thresholded colors
mask = cv2.inRange(hsv, lower_limit, upper_limit)

3.2腐蚀与膨胀

腐蚀和膨胀是图像处理中常使用的两个基本形态学操作。腐蚀算子在内核区域上具有局部最小值的作用。腐蚀用于减少图像中的斑点噪声,斑点会从图像中的对象边界腐蚀掉。膨胀具有局部最大值运算符的作用。当添加像素以平滑图像中对象的边界时,将使用膨胀来重新获得一些丢失的区域。现在,通过基本形态学操作(腐蚀和膨胀)处理从HSV帧的第一步生成的蒙版。通过将帧和掩码之间的按位与运算应用于获取 ROI(感兴趣区域),可以生成结果帧。

    kernel = np.ones((3,3),np.uint8)
    kernel_lg = np.ones((15,15),np.uint8)
    # image processing technique called the erosion is used for noise reduction
    mask = cv2.erode(mask,kernel,iterations = 1)
    # image processing technique called the dilation is used to regain some lost area
    mask = cv2.dilate(mask,kernel_lg,iterations = 1)
    # Bitwise-AND to get black everywhere else except the region of interest
    result = cv2.bitwise_and(frame,frame, mask= mask)

3.3车道检测

canny边缘检测器与霍夫线变换一起用于检测车道。

canny边缘检测(作者提供的图像)

04. 边缘检测

诸如canny边缘检测器之类的算法用于查找将图像中的边缘像素,但是由于我们无法融合某些点和边缘,因此它无法找到实际对象,在这里我们可以使用OpenCV中的cv2.findContours()实现轮廓的查找。

定义-“轮廓是代表图像中曲线的点的列表。” 等高线由序列表示(序列是结构的链表),每个序列都编码有关下一点位置的信息。我们在ROI中多次运行cv2.findContours()以获得实体,然后使用cv2.drawContours()绘制轮廓区域。等高线可以是点,边,多边形等,因此在绘制等高线时,我们进行多边形近似,以找到边的长度和区域的面积。函数cv2.drawContours()的工作方式是从根节点开始绘制一棵树(数据结构),然后将后续点,边界框和freeman链代码连接在一起。

找到轮廓后的另一个重要任务是匹配它们。轮廓匹配意味着我们有两个单独的计算轮廓相互比较,或者轮廓与抽象模板相比较。

thresh = mask
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# define a minimum area for a contour (ignoring all values below min)
min_area = 1000
cont_filtered = []
# filter out all contours below a min_area
for cont in contours:
  if cv2.contourArea(cont) > min_area:
    cont_filtered.append(cont)


cnt = cont_filtered[0]
# draw the rectangles around contours
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(frame,[box],0,(0,0,255),2)
rows,cols = thresh.shape[:2]
[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
cv2.line(frame,(cols-1,righty),(0,lefty),(0,255,0),2)

05. 中心矩

我们可以通过计算轮廓矩来比较两个轮廓。“中心矩是通过将轮廓的所有像素相加而得出的轮廓的总体特征。”

中心矩型-

  • 空间矩: m00,m10,m01,m20,m11,m02,m30,m21,m12,m03。

  • 中心矩: mu20,mu11,mu02,mu30,mu21,mu12,mu03。

  • Hu矩:有七个Hu矩(h0 — h6)或(h1 — h7),两种表示法都使用。

我们使用cv2.fitEllipse()计算矩并将椭圆拟合在这些点上。从轮廓和力矩中得出角度,因为改变车道需要45度旋转,这被认为是汽车转弯角度的阈值。

现在,我们不仅可以打印检测变化的车道,还可以使用Tkinter作为一个简单的弹出窗口来提醒更改。

使用Greenline测量角度,并在框架中的汽车上绘制矩形

弹出警报(作者提供的图片)

输出

06. 总结

在本教程中,使用车道变更检测方法探索了智能汽车导航的小型演示。计算机视觉正在迅速发展,其应用不仅在汽车的本地导航中而且在火星导航和产品检查领域中也在不断发展,甚至医疗应用也正在开发中,并可以在早期用于检测X射线图像中的癌症和肿瘤阶段。

代码链接:https://github.com/Hitesh-Valecha/Car_Opencv

参考文献:

  1. Bradski, Gary and Kaehler, Adrian, Learning OpenCV: Computer Vision in C++ with the OpenCV Library, O’Reilly Media, Inc., 2nd edition, 2013, @10.5555/2523356, ISBN — 1449314651.

  2. Laganiere, Robert, OpenCV Computer Vision Application Programming Cookbook, Packt Publishing, 2nd edition, 2014, @10.5555/2692691, ISBN — 1782161481.

基于OpenCV的车辆检测与追踪的实现 最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大家,因为本人也是个小白,所以如果有什么讲的不对的地方希望各位看官多指正!       一、安装OpenCV和搭建环境         首先呢,大家得安装OpenCV,这里网络上有很多相关的教程,这 阅读详情

相关推荐

【openCV学习】38.车辆检测计数项目

8.经过观察,会发现,由于车内有车灯,车牌等物件,可能会在大车的轮廓框内包含一些小的车灯的,车牌的轮廓框,因此我们设置当宽和高大于某一个值的时候,才绘制出显示框,这样就可以把车灯和车牌等干扰项给排除掉。3.去掉背景后的视频,不动的地方是黑色的,移动的地方会显现出白色,会发现有黑色的背景有时会出现白色的小方块的噪声,因此采用腐蚀操作去除噪声(腐蚀)2.去噪后消除背景,在计算机视觉中,不动的叫背景,移动的叫前景(这里使用到了一个新的API,是关于去除视频背景的)进行视频背景去除后的视频截图。

m0_66606474的博客 3439

Web前端工程师常去的15个技术网站

1、优快云 网址:https://www.youkuaiyun.com/ 简介: 优快云 (Chinese Software Developer Network) 创立于1999年,是中国最大的IT社区和服务平台,为中国的软件开发者和IT从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。 2、GitH...

weixin_33892359的博客 3233

opencv案例: 车辆检测

车辆检测

因为热爱所以坚持 5708

eclipse安装和使用

1.掌握注解的核心基础知识2.利用反射实现自定义注解

基于OpenCV的视频道路车辆检测与跟踪

含代码

基于OpenCV的车辆监测与计数

基于OpenCV2.4.9的视频车辆识别与车辆计数,在Visual Studio 2010上开发。多多指教。

基于opencv的图像阴影消除&车辆变道检测

基于opencv的图像阴影消除&车辆变道检测

weixin_50862344的博客 1151

【史诗级】详细阐述借助AI实现对Windows蓝屏原因进行精确定位的方法

在解决问题的过程中我决定把这一切都记录下来,并整理出一套通用的方法,方便快速精确定位引起蓝屏的真实原因。今天我的蓝屏代码是0x000000ef,而你或许是遇到另一个蓝屏代码,代码本身代表的含义不是这里的讨论重点,重要的是解决问题的底层逻辑。

sprlightning的博客 1万+

opencv 膨胀_基于OpenCV的车辆变道检测

本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用OpenCV 的haar级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢?01. 数据集我们将道路上汽车的视频文件用作数据集。当然可以使用图像数据集检测来汽车,但是由于汽车在变道时我们需要通过弹出窗口提供警报,因此对于这些动态情况,视频输入更为可行。02. 输入第...

weixin_39706561的博客 151

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 455

5分钟搞定Vivado IP核的VCS仿真:从Export脚本到Verdi波形查看全流程

本文详细介绍了如何利用Vivado的Export Simulation功能,快速搭建Vivado IP核的VCS与Verdi联合仿真环境。通过自动化脚本生成、FSDB波形配置及高效调试技巧,实现从工程导出到波形查看的全流程,大幅提升FPGA验证效率,尤其适合IC验证工程师和竞赛团队。

weixin_29306261的博客 483

Python视觉实战项目52讲

Python视觉实战项目52讲 【下载地址】Python视觉实战项目52讲 Python视觉实战项目52讲欢迎来到Python视觉实战项目集合,本资源是专为那些希望深入理解并实践机器视觉技术的学习者准备的宝库 项目地址: http...

gitblog_09809的博客 965

深入解析达梦数据库核心技术:检查点、redo、undo、MVCC与内存缓存刷盘

MVCC 依赖 undo 日志:通过 undo 日志构建版本链,实现 “读不加锁”;刷盘依赖检查点:检查点批量清理脏页,redo 日志通过检查点释放空间;日志保障刷盘安全:redo 日志先行写入,确保未刷盘脏页可恢复;刷盘优化 MVCC 性能:优先刷冷区脏页,减少对高频访问数据的影响。例如,一个完整的 “查询 - 修改 - 提交 - 恢复” 流程中:查询时,MVCC 通过 undo 日志获取可见版本,无需等待锁;修改时,redo/undo 日志先记录,缓冲池生成脏页;

tangyuan12345678的博客 1416

盲区检测系统

属于ADAS的一种,用于监测处于内外后视镜视觉盲区侧后方移动物体(如汽车、摩托车、自行车、行人),探测相邻车道后方有没有车子在靠近,以及后视镜盲区里有没有车子,之所以说盲点车辆识别系统是好东西,是因为它能够降低开车时变道发生碰撞事故的可能性。该代码是基于win10 系统下darknet yolo v3/v4,yolo v3/v4 tiny实现,能够纯cpu下跑10帧左右,丢弃两帧后就能达到实时的效果。盲区检测系统 , 纯软件,工程师或者学生学习用,暂时没有做硬件。需要vs2015+opencv4环境。

zhangxian333的博客 306

ESP32S3电池电量监测实战:从分压电路到IDF组件配置(附GitHub源码)

本文详细介绍了ESP32S3电池电量监测的完整实战方案。从硬件分压电路的电阻选型、滤波设计,到软件层面利用ESP-IDF的ADC校准机制提升精度,并重点讲解了如何集成bat_monitor开源组件快速实现电压采集、电量计算、充电检测与事件通知。文章提供了从原理到调试的完整指南和GitHub源码,帮助开发者构建稳定可靠的物联网设备电源管理系统。

ee345的博客 531

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1852

告别目标跟丢!用Python+OpenCV实战IMM算法,搞定自动驾驶中的车辆多模型追踪

本文详细介绍了如何使用Python和OpenCV实现交互式多模型(IMM)算法,解决自动驾驶中的多目标追踪问题。通过实战代码演示,展示了IMM算法在车辆突然变道、急刹等复杂场景下的优越性能,相比单一模型追踪误差降低高达47.6%。文章包含完整的环境配置、算法实现、可视化评估和优化技巧,帮助开发者快速掌握这一关键自动驾驶算法。

weixin_30522183的博客 208

innovus: ccopt_design如何给不同clock设置max_transition

sdc命令的max_trans约束,对应spec里的set_ccopt_property target_max_trans_sdc -delay_corner ss -early/-late -clock_tree xx 0.2。其他的就用set_max_transition 0.5 -clock_path [all_clocks]或者set_ccopt_property target_max_trans 0.5。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 177

基于OpenCV的车辆检测与记数

本次项目是研一上学期的《图像处理》课程考核作品,由3个人一起完成,记录为了以后查案,也希望对大家有所帮助

weixin_44342777的博客 5313

得物(毒)App潮鞋价格波动监控系统实战:从爬虫开发到数据可视化完整指南

本文将带领您从零开始构建一套完整的得物潮鞋价格监控系统,涵盖爬虫开发、数据存储、价格波动分析和可视化展示等全流程技术。我们将使用最新的Python技术栈,包括异步爬虫框架、智能代理池、反爬虫绕过技巧,以及基于机器学习的时间序列预测模型。无论您是想要追踪特定鞋款价格的潮流爱好者,还是希望构建商业级监控系统的开发者,这篇文章都将为您提供切实可行的解决方案。

2201_76125261的博客 2508

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【OpenCV】 车辆识别 运动目标检测

【OpenCV】 车辆识别 运动目标检测,超详细教学!

m0_56051805的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【OpenCV学习】(九)目标识别之车辆检测与计数

【OpenCV学习】(九)目标识别之车辆检测及计数 背景 本篇将具体介绍一个实际应用项目——车辆检测及计数,在交通安全中是很重要的一项计数;当然,本次完全采用OpenCV进行实现,和目前落地的采用深度学习的算法并不相同,但原理是一致的;本篇将从基础开始介绍,一步步完成车辆检测计数的项目; 一、图像轮廓 本质:具有相同颜色或强度的连续点的曲线; 作用: 1、可用于图形分析; 2、应用于物体的识别与检测; 注意点: 1、为了检测的准确性,需要先对图像进行二值化或Canny操作; 2、画轮廓的时候回修改输入的图像

weixin_40620310的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【OpenCV】车辆识别 目标检测 级联分类器 C++ 案例实现

本文继续以车辆识别为目标,继续改进方法以此提高车辆识别进准度,核心的内容包括:OpenCV级联分类器概念、创建自己的级联分类器以及使用级联分类器对车流进行识别

持续学习,持续进步! 9352

【OpenCV】“帧差法”实现移动物体的检测(车辆识别)

本文介绍如何通过使用Qt结合OpenCV运用帧差法来进行车辆识别。帧差法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。...

似末的博客 2万+

基于OpenCV检测影像中的车辆

关注微信公众号:GISGO,获得更多GIS技术 近段时间一直在研究机器学习,主要学习的是数据挖掘和自然语言处理,期望能将所学与GIS结合起来。同时团队有成员在研究视觉,平时听到最多的是他们在讨论OpenCV这个库,通过他们的口也了解到这个库在图像处理领域十分强大。虽然OpenCV和我的核心工作没有关联,但是热衷于技术的我实在抵挡不了新鲜事的诱惑。 OpenCV是一个基于BSD许可(开源)发行的跨...

GISXX 5634
上一篇: 1000 面试题,BAT 机器学习面试刷题宝典!
下一篇: 使用Mask-RCNN在实例分割应用中克服过拟合
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值