基于 YOLOv8 和 OpenCV 的车道与车辆检测系统
概述
本项目演示了如何使用 YOLOv8(You Only Look Once)和 OpenCV 构建一个车道与车辆检测系统。该系统能够识别道路车道并检测车辆,同时估算车辆与摄像头的距离。它结合了计算机视觉技术和基于深度学习的目标检测,以提供对道路环境的全面理解。
主要功能
- 车道检测:利用边缘检测和霍夫线变换(Hough Line Transformation)识别道路车道。
- 车辆检测:使用 YOLOv8 检测车辆,并在其周围绘制边界框。
- 距离估算:基于边界框大小,计算检测到的车辆与摄像头的距离。
安装步骤
- 安装依赖项:
pip install opencv-python-headless numpy ultralytics
- 运行
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:霍夫线变换(Hough Line Transformation)
应用霍夫线变换检测代表车道的线段。
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:绘制边界框
为每辆检测到的车辆绘制边界框,并显示类别(car)和置信度分数。
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
3. 视频处理流程
将车道检测、车辆检测和距离估算整合到实时视频处理流程中。
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 的车辆检测相结合,我们可以更好地理解道路环境,并提供车辆距离等有价值的数据。
如果需要进一步优化或扩展功能(如多目标跟踪、3D 距离估计等),欢迎讨论! 🚗💨