文章目录
很多初学者想要入门自动驾驶视觉感知,却找不到一套连贯、可落地的Python实操方案。自动驾驶图像识别,本质就是让车载摄像头看懂路面环境:识别车道线、车辆、行人、交通标志,为车辆路径规划与安全避让提供依据。
本文从环境搭建、传统视觉车道线检测,再到深度学习目标检测完整实现。所有代码都经过本地调试运行,新手跟着步骤复制就能跑通,适合想要做智能小车、自动驾驶仿真项目、ADAS辅助驾驶原型开发的开发者。
一、技术方案整体介绍
自动驾驶视觉感知分为两大路线:
- 传统计算机视觉(OpenCV):依靠边缘检测、透视变换、霍夫变换实现车道线识别,优势无需训练数据集、运行速度快,适合入门学习;缺点在强光、阴雨、弯道场景稳定性一般。
- 深度学习目标检测(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()
使用说明
- 准备一段道路行车视频,命名
road_video.mp4放在同级目录; - 想要实时摄像头测试,将
cv2.VideoCapture("road_video.mp4")修改为cv2.VideoCapture(0); - 运行脚本,画面中绿色线条即为识别到的车道标线。
常见问题优化
- 弯道识别效果差:可以增加透视变换代码,将原图转换成鸟瞰视角再检测;
- 强光画面识别失效:增加自适应阈值、白平衡预处理;
- 大量噪点产生多余线条:调整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摄像头,搭建实体智能小车。