Bootstrap

基于深度学习opencv的车道线检测与车辆单目距离测量项目

概述

本项目展示了如何使用YOLOv8(You Only Look Once)和OpenCV构建车道和车辆检测系统。该系统能够检测道路车道并识别车辆,估计其与相机的距离。通过结合计算机视觉技术和基于深度学习的目标检测,该系统提供了对道路环境的全面理解。
在这里插入图片描述

核心功能

  • 车道检测:使用边缘检测和霍夫线变换(Hough Line Transformation)来检测道路车道。
  • 车辆检测:使用YOLOv8识别车辆,并在车辆周围绘制边界框。
  • 距离估计:根据边界框的大小计算检测到的车辆与相机的距离。

安装

  1. 安装依赖:
    pip install opencv-python-headless numpy ultralytics
    
  2. 运行 video.py 文件。

工作原理

1. 车道检测流程

车道检测过程包括以下步骤:

步骤1:感兴趣区域(ROI)掩码

仅处理图像的下半部分(车道通常可见的部分)。

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
)
2. 使用YOLOv8进行车辆检测
步骤1:加载YOLOv8模型

使用预训练的YOLOv8模型检测每帧中的车辆。

from ultralytics import YOLO
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  # 示例焦距
    known_width = 2.0  # 汽车的近似宽度(米)
    distance = (known_width * focal_length) / bbox_width
    return distance

在这里插入图片描述

视频处理流程

将车道检测、车辆检测和距离估计结合成实时视频处理流程。

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    lane_frame = pipeline(resized_frame)
    results = model(resized_frame)
    for result in results:
        # 绘制边界框并估计距离
    cv2.imshow('Lane and Car Detection', lane_frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

结果

该系统能够实时检测车道和车辆,显示检测到的车辆的边界框并估计其与相机的距离。

结论

本项目展示了如何结合传统的计算机视觉技术和深度学习技术来检测道路车道和车辆。通过将车道检测与基于YOLOv8的车辆检测相结合,我们可以更好地理解道路环境,并提供有价值的数据,如车辆距离。这种系统在自动驾驶、交通监控和智能交通管理等领域具有广泛的应用前景。

;