ITPub博客

首页 > 数据库 > 数据库开发技术 > 用YOLOv8和OpenCV打造车道与车辆检测系统,实时掌握道路情况!

用YOLOv8和OpenCV打造车道与车辆检测系统,实时掌握道路情况!

原创 数据库开发技术 作者:讳疾忌医-note 时间:2025-01-04 00:00:00 0 删除 编辑
创作不易,方便的话点点关注,谢谢
本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身。

文章结尾有最新热度的文章,感兴趣的可以去看看。

文章有点长(2081字阅读时长:8分),期望您能坚持看完,并有所收获


在这篇文章中,我们将探讨如何使用YOLOv8(You Only Look Once)和OpenCV构建一个车道与车辆检测系统。我们的目标是创建一个能够检测道路车道,并识别车辆,同时估算车辆与摄像头距离的系统。本项目将计算机视觉技术与深度学习目标检测相结合,打造出一个用于了解道路环境的强大工具。

系统的主要功能:

  • 车道检测:利用边缘检测和霍夫直线变换来检测道路上的车道。
  • 车辆检测:使用YOLOv8模型识别车辆,并在车辆周围绘制边界框。
  • 距离估算:依据边界框的大小来计算检测到的车辆与摄像头之间的距离。

在本教程中,我们将完整地介绍整个流程,对代码进行解释,并通过示例图像来说明该系统的工作原理。

先决条件

在开始之前,你需要安装几个库:

  • OpenCV:用于图像处理和车道检测。
  • Ultralytics YOLOv8:用于车辆检测。
  • NumPy:用于数组操作。

你可以使用pip命令来安装这些依赖项:

pip install opencv-python-headless numpy ultralytics

车道检测流程

我们首先来实现车道检测。其核心思路是通过检测边缘,并运用霍夫直线变换来检测线段,从而识别道路上的车道。

步骤1:对感兴趣区域(ROI)进行掩膜处理

在道路环境中,我们只对图像下部区域的车道检测感兴趣。region_of_interest函数会创建一个掩膜,将这个区域分离出来。

def region_of_interest(img, vertices):
    mask = np.zeros_like(img)
    match_mask_color = 255
    cv2.fillPoly(mask, vertices, match_mask_color)
    masked_image = cv2.bitwise_and(img, mask)
    return masked_image

步骤2:Canny边缘检测

接下来,我们将图像转换为灰度图,并应用Canny边缘检测器来突出图像中的边缘。

gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
cannyed_image = cv2.Canny(gray_image, 100, 200)

步骤3:霍夫直线变换

为了检测构成车道的线条,我们应用霍夫直线变换。然后根据检测到的线条的斜率,将它们划分为左侧车道线和右侧车道线。

lines = cv2.HoughLinesP(
    cropped_image,
    rho=6,
    theta=np.pi / 60,
    threshold=160,
    lines=np.array([]),
    minLineLength=40,
    maxLineGap=25
)

检测到的线条的斜率有助于我们判断它们属于左侧车道还是右侧车道。然后我们使用cv2.fillPoly函数在图像上绘制出车道。

使用YOLOv8进行车辆检测

接下来,我们使用YOLOv8(深度学习目标检测模型)来实现车辆检测。YOLO非常适用于实时应用场景,因为它只需让图像在网络中进行一次前向传播就能完成处理。

步骤1:加载YOLOv8模型

我们首先使用ultralytics库加载YOLOv8模型。在这里,我们使用预训练的权重来检测视频帧中的车辆。

model = YOLO('weights/yolov8n.pt')

步骤2:绘制边界框

对于每一辆检测到的车辆,我们都会在图像上绘制一个边界框,并附上类别名称(“汽车”)以及置信度得分。

for box in boxes:
    x1, y1, x2, y2 =map(int, box.xyxy[0])
    conf = box.conf[0]
if model.names[cls]=='car'and conf >=0.5:
        label =f'{model.names[cls]} {conf:.2f}'
        cv2.rectangle(lane_frame,(x1, y1),(x2, y2),(0,255,255),2)
        cv2.putText(lane_frame, label,(x1, y1 -10), cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),2)

距离估算

每辆检测到的车辆与摄像头之间的距离是基于其边界框的大小来估算的。这是一种简单的方法,我们假定距离与边界框的宽度成反比。

def estimate_distance(bbox_width, bbox_height):
    focal_length = 1000  # Example focal length
    known_width = 2.0  # Approximate width of the car (in meters)
    distance = (known_width * focal_length) / bbox_width
    return distance

整合起来:视频处理

最后一步是将所有组件整合到一个视频处理流程中。我们从视频中捕获帧,运行车道检测和车辆检测流程,并实时显示结果。

while cap.isOpened():
    ret, frame = cap.read()
ifnot ret:
break
    lane_frame = pipeline(resized_frame)
    results = model(resized_frame)
for result in results:
# Draw bounding boxes and estimate distance
    cv2.imshow('Lane and Car Detection', lane_frame)
if cv2.waitKey(1)&0xFF==ord('q'):
        break

结论

在本项目中,我们将使用传统计算机视觉技术的车道检测与基于深度学习的YOLOv8模型的车辆检测相结合。该系统能够实时检测车道和车辆,提供诸如道路上车辆的位置以及估算距离等有价值的信息。

以上就是我的分享。这些分析皆源自我的个人经验,希望上面分享的这些东西对大家有帮助,感谢大家!

点个“在看”不失联

最新热门文章推荐:

OpenCV全景图拼接:全景图制作竟如此简单

谁才是Rust视频处理的最佳选择?ffmpeg-next vs opencv vs video-rs

震惊!只需几行代码,OpenCV与TesseractOCR就能实现车牌识别,准确率超乎想象

惊!Rust绑定C++API运行OpenCV,效率大幅提升

惊!Go语言中的指针竟能让代码性能翻倍,你还不赶紧学?

告别繁琐!Phi-3-Vision-128K人工智能OCR轻松搞定PDF解析

Mojo比Python快35000倍?让我们来测试一下

告别C/C++ ?看看这15种替代语言如何征服开发者的心?

为什么说C和C++比其他语言更能培养优秀程序员?底层思维的重要性

必学!你的第一个C++ WebSocket客户端程序

必看:CTC训练神经网络中的波束搜索解码

C语言程序:从头开始编写一个实时嵌入式操作系统的内核

使用 TensorFlow 构建手写文本识别系统

深度学习中的池化层:减少计算量的背后是牺牲了分类准确性吗?

何恺明团队挑战CNN霸权,ViT能否颠覆目标检测传统?

用纯C++实现神经网络:不依赖Python和PyTorch,260行代码训练手写数字分类器准确率高达99%,你敢信?

我从VSCode转向Cursor的原因

监控你的Linux系统只需一个脚本!

干净简洁的实现Go项目结构 | GitHub 4.8k 星

为什么开发人员讨厌PHP?(世界上最好的语言)

参考文献:《OpenCV中文文档》《YoLov8文档》

原文作者:讳疾忌医-note;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-08-12

  • 博文量
    126
  • 访问量
    73110