Python自动驾驶图像识别完整实战教程(OpenCV+YOLOv8,附可直接运行源码)

文章目录

很多初学者想要入门自动驾驶视觉感知,却找不到一套连贯、可落地的Python实操方案。自动驾驶图像识别,本质就是让车载摄像头看懂路面环境:识别车道线、车辆、行人、交通标志,为车辆路径规划与安全避让提供依据。

本文从环境搭建、传统视觉车道线检测,再到深度学习目标检测完整实现。所有代码都经过本地调试运行,新手跟着步骤复制就能跑通,适合想要做智能小车、自动驾驶仿真项目、ADAS辅助驾驶原型开发的开发者。

一、技术方案整体介绍

自动驾驶视觉感知分为两大路线:

  1. 传统计算机视觉(OpenCV):依靠边缘检测、透视变换、霍夫变换实现车道线识别,优势无需训练数据集、运行速度快,适合入门学习;缺点在强光、阴雨、弯道场景稳定性一般。
  2. 深度学习目标检测(YOLOv8):识别行人、机动车、非机动车、红绿灯等障碍物,鲁棒性更强,是现阶段自动驾驶感知主流方案。

本教程将两者结合,搭建简易自动驾驶视觉识别流水线:摄像头画面输入 → 图像预处理 → 车道线检测 + 道路障碍物识别 → 画面可视化标注。

用到依赖库说明

  • opencv-python:图像读取、滤波、边缘检测、视频流处理
  • numpy:图像矩阵运算
  • ultralytics:YOLOv8官方库,快速实现目标检测推理
  • matplotlib:可选,用于静态图像结果查看

二、开发环境搭建

推荐使用Python3.9~3.11版本,高版本Python部分库兼容性较差。打开终端执行安装命令:

bash 复制代码
pip install opencv-python numpy ultralytics matplotlib

安装慢可以加上国内镜像源

bash 复制代码
pip install opencv-python numpy ultralytics matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

环境安装完成后,简单验证OpenCV是否正常导入:

python 复制代码
import cv2
print(cv2.__version__)

输出版本号即代表安装成功。

三、实战一:OpenCV实现车道线检测(基础入门)

车道线识别是自动驾驶最基础的功能,实现流程:

图像灰度化→高斯模糊降噪→Canny边缘检测→划定感兴趣区域ROI→透视变换(鸟瞰图)→霍夫直线检测→车道线拟合绘制。

新建lane_detect.py,完整源码:

python 复制代码
import cv2
import numpy as np

def region_of_interest(img):
    # 划定道路感兴趣区域,屏蔽天空、路边无效画面
    height, width = img.shape[:2]
    polygon = np.array([
        [(int(width*0.1), height),
         (int(width*0.45), int(height*0.6)),
         (int(width*0.55), int(height*0.6)),
         (int(width*0.9), height)]
    ])
    mask = np.zeros_like(img)
    cv2.fillPoly(mask, polygon, 255)
    roi_img = cv2.bitwise_and(img, mask)
    return roi_img

def draw_lane_lines(img, lines):
    line_img = np.zeros_like(img)
    if lines is None:
        return img
    for line in lines:
        x1, y1, x2, y2 = line.reshape(4)
        cv2.line(line_img, (x1, y1), (x2, y2), (0, 255, 0), thickness=5)
    return cv2.addWeighted(img, 0.8, line_img, 1, 0)

def lane_detection(frame):
    # 1.灰度转换
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 2.高斯模糊降噪
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    # 3.Canny边缘提取
    edges = cv2.Canny(blur, 50, 150)
    # 4.截取路面ROI区域
    roi_edges = region_of_interest(edges)
    # 5.霍夫变换检测直线
    hough_lines = cv2.HoughLinesP(
        roi_edges,
        rho=2,
        theta=np.pi / 180,
        threshold=40,
        minLineLength=40,
        maxLineGap=100
    )
    # 6.绘制车道线
    result = draw_lane_lines(frame, hough_lines)
    return result

if __name__ == "__main__":
    # 传入视频路径,参数填0可调用本地摄像头实时识别
    cap = cv2.VideoCapture("road_video.mp4")
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        output = lane_detection(frame)
        cv2.imshow("车道线检测", output)
        # 按q退出窗口
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

使用说明

  1. 准备一段道路行车视频,命名road_video.mp4放在同级目录;
  2. 想要实时摄像头测试,将cv2.VideoCapture("road_video.mp4")修改为cv2.VideoCapture(0)
  3. 运行脚本,画面中绿色线条即为识别到的车道标线。

常见问题优化

  • 弯道识别效果差:可以增加透视变换代码,将原图转换成鸟瞰视角再检测;
  • 强光画面识别失效:增加自适应阈值、白平衡预处理;
  • 大量噪点产生多余线条:调整Canny阈值、霍夫变换minLineLength参数。

四、实战二:YOLOv8实现道路目标检测(识别车辆、行人、红绿灯)

仅识别车道线不足以保障行车安全,系统需要实时感知前方障碍物。YOLO系列因为速度与精度均衡,广泛用于自动驾驶、智能小车视觉项目。

YOLOv8开箱即用,无需手动下载权重,首次运行自动下载预训练模型。

新建road_object_detect.py完整代码:

python 复制代码
from ultralytics import YOLO
import cv2

def auto_detect_video(video_path):
    # 加载YOLOv8轻量模型nano版本,适合低配置设备实时运行
    model = YOLO("yolov8n.pt")
    cap = cv2.VideoCapture(video_path)

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        # 推理,置信度阈值0.4,过滤低可信度目标
        results = model(frame, conf=0.4)
        # 在原图绘制检测框、类别名称与置信度
        annotated_frame = results[0].plot()
        cv2.imshow("道路障碍物识别", annotated_frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    # 0=本地摄像头,填入视频文件路径读取视频
    auto_detect_video("road_video.mp4")

运行之后,可以自动识别画面内行人、小汽车、公交车、自行车、交通信号灯等COCO数据集内目标。

拓展提示:如果想要精准识别交通标志,需要采集道路标志牌数据集,微调训练YOLOv8模型。

五、实战三:车道线+目标检测融合(简易自动驾驶视觉总流程)

把上面两套模块整合,实现一套完整视觉感知程序,同时输出车道线和障碍物识别结果。

新建autodrive_vision.py

python 复制代码
import cv2
import numpy as np
from ultralytics import YOLO

# ==========复用车道线检测函数==========
def region_of_interest(img):
    height, width = img.shape[:2]
    polygon = np.array([
        [(int(width*0.1), height),
         (int(width*0.45), int(height*0.6)),
         (int(width*0.55), int(height*0.6)),
         (int(width*0.9), height)]
    ])
    mask = np.zeros_like(img)
    cv2.fillPoly(mask, polygon, 255)
    roi_img = cv2.bitwise_and(img, mask)
    return roi_img

def draw_lane_lines(img, lines):
    line_img = np.zeros_like(img)
    if lines is None:
        return img
    for line in lines:
        x1, y1, x2, y2 = line.reshape(4)
        cv2.line(line_img, (x1, y1), (x2, y2), (0, 255, 0), thickness=5)
    return cv2.addWeighted(img, 0.8, line_img, 1, 0)

def lane_detection(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    edges = cv2.Canny(blur, 50, 150)
    roi_edges = region_of_interest(edges)
    hough_lines = cv2.HoughLinesP(
        roi_edges,2,np.pi/180,40,minLineLength=40,maxLineGap=100
    )
    result = draw_lane_lines(frame, hough_lines)
    return result

# ==========主程序融合逻辑==========
if __name__ == "__main__":
    model = YOLO("yolov8n.pt")
    cap = cv2.VideoCapture("road_video.mp4")

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        # 第一步:车道线绘制
        lane_frame = lane_detection(frame)
        # 第二步:目标检测绘制障碍物框
        detect_result = model(lane_frame, conf=0.4)
        output_frame = detect_result[0].plot()

        cv2.imshow("Python自动驾驶图像识别系统", output_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    cap.release()
    cv2.destroyAllWindows()

运行后画面同时展示绿色车道线、障碍物检测框,完成自动驾驶视觉感知原型。

六、项目进阶优化方向(落地必看)

1、实时性优化

  • 硬件性能较弱时,使用yolov8n.pt最小模型;高端设备切换yolov8s.pt提升精度;
  • 缩小输入图像分辨率,降低每一帧运算量;
  • 模型导出ONNX格式,使用OpenVINO、TensorRT硬件加速推理,适合移植到树莓派、Jetson嵌入式平台。

2、识别稳定性优化

  • 车道线:增加滑动窗口多项式拟合,替代基础霍夫变换,适配连续弯道;增加前后帧平滑滤波,消除画面闪烁;
  • 目标检测:采集本地道路数据集迁移学习,解决通用模型对国内路况误检、漏检问题;增加目标追踪(ByteTrack),避免相邻帧目标ID频繁跳动。

3、拓展功能

  • 单目视觉距离估算:根据检测框像素大小估算前车距离;
  • 增加语义分割:区分可行驶区域、人行道、绿化带;
  • 接入CARLA自动驾驶仿真平台,把视觉识别结果输出给控制模块,实现仿真车辆自主行驶;
  • 移植树莓派+USB摄像头,搭建实体智能小车。
相关推荐
闻道且行之15 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
许彰午16 小时前
95_Python内存管理与垃圾回收
开发语言·python
骄阳如火17 小时前
Python 性能深度剖析:从“被诟病的慢”到“Rust 重塑”的拐点
python
满怀冰雪17 小时前
03-第一个 Paddle 程序:Tensor 创建、计算与设备管理
人工智能·python·paddle
CClaris18 小时前
大模型量化从0到1(九):用 llama.cpp 把模型转成 GGUF 并跑本地推理
人工智能·pytorch·python·深度学习·llama
学编程的小虎18 小时前
SenseVoice微调
人工智能·python·自然语言处理
诸葛说抛光18 小时前
国内大型汽车改装展览会定展 佛山改装 佛山汽车赛事
python·汽车
chouchuang18 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
乖巧的妹子18 小时前
Python基础核心知识点详解:内置函数、运算符、字符串方法、数据结构与类型转换
python
幸福清风19 小时前
Python 完美处理Excel合并单元格:拆分填充+自动合并
python·excel·合并单元格·拆分单元格