OpenCV 高级曲线车道检测:从畸变校正到实时视频处理
项目背景
引言
车道线是自动驾驶的基石,引导车辆安全行驶。在直线车道检测项目基础上,我开发了一套鲁棒的曲线车道检测管线,在阴影、遮挡、路面不平等复杂场景下表现可靠。
完整图像处理流程基于 Python + OpenCV 实现:
- 畸变校正
- 透视变换 (鸟瞰图)
- Sobel 滤波
- 直方图峰值检测
- 滑动窗口搜索
- 多项式曲线拟合
- 检测车道叠加显示
- 实时视频处理
前代系统局限
早期模型仅支持直线车道,难以应对曲线、阴影、部分遮挡。新管线引入边缘滤波与动态滑动窗口解决上述问题。
畸变校正
相机镜头径向畸变会扭曲测量。通过非对称棋盘格标定生成畸变模型,校正全量数据。标定流程:采集多张棋盘格图片,cv2.findChessboardCorners() 提取角点,cv2.calibrateCamera() 计算相机矩阵与畸变系数,cv2.undistort() 输出校正图像。下图展示校正前后对比,虽肉眼差异微小但对后续几何精度至关重要。
标定代码片段:
def undistort_img():
obj_pts = np.zeros((6*9,3), np.float32)
obj_pts[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
objpoints = []
imgpoints = []
images = glob.glob('camera_cal/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
objpoints.append(obj_pts)
imgpoints.append(corners)
img_size = (img.shape[1], img.shape[0])
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size, None, None)
dst = cv2.undistort(img, mtx, dist, None, mtx)
dist_pickle = {'mtx': mtx, 'dist': dist}
pickle.dump(dist_pickle, open('camera_cal/cal_pickle.p', 'wb'))
return dst
def undistort(img, cal_dir='camera_cal/cal_pickle.p'):
with open(cal_dir, 'rb') as f:
file = pickle.load(f)
mtx, dist = file['mtx'], file['dist']
return cv2.undistort(img, mtx, dist, None, mtx)
undistort_img()
img = cv2.imread('camera_cal/calibration1.jpg')
dst = undistort(img)
完整函数亦收录于配套 Jupyter Notebook Code 区。
透视变换
直接在相机坐标系检测曲线车道困难。变换至鸟瞰视角可假设车道处于平面,高精度拟合多项式。使用 cv2.getPerspectiveTransform() 与 cv2.warpPerspective(),源/目标点选取兼顾车道几何与最大可视范围。
def perspective_warp(img, dst_size=(1280,720),
src=np.float32([(0.43,0.65),(0.58,0.65),(0.1,1),(1,1)]),
dst=np.float32([(0,0),(1,0),(0,1),(1,1)])):
img_size = np.float32([img.shape[1], img.shape[0]])
src = src * img_size
dst = dst * np.float32(dst_size)
M = cv2.getPerspectiveTransform(src, dst)
return cv2.warpPerspective(img, M, dst_size)
Sobel 滤波
纯颜色滤波易将浅色混凝土误判为车道线。改用梯度边缘检测:Sobel 算子在 HLS 颜色空间计算水平梯度,突出高对比度车道边缘同时抑制路面纹理。生成的二值掩膜对光照变化鲁棒,作为滑动窗口输入。
直方图峰值检测
滑动窗口前,沿 x 轴统计二值图直方图,左右两侧最高峰对应左右车道线底部位置。
滑动窗口搜索
以底部峰值为起点,滑动窗口迭代收集各车道像素索引,拟合二次多项式,精确估算曲率与车辆相对车道中心偏移。最终叠加显示检测车道区域、曲率半径与车辆偏移量。
详细实现与可视化结果请见:Curved Lane Detection
制造工艺
- 故障检测与诊断(FDD):提升设备可靠性与维护效能
- Java 与 Reactive Blocks 构建运动检测报警系统:树莓派部署发送短信
- Farmaid:自主精准植物病害检测与标记机器人
- 在 Sonbi 机器人上集成 Microsoft Kinect 与树莓派实现实时人体检测
- 曲面精密 CNC 铣削:工艺流程、刀具选择与关键技巧
- 欧姆龙 E3AS-F 光电传感器实现 1.5 米飞行时间检测
- 基于8051的超声波测距传感器——设计、电路与应用
- 入侵检测系统:用智能警报守护网络安全
- Hydra3D ToF 传感器为工业与户外应用提供快速精准 3D 检测
- AEye发布远程激光雷达:车辆探测达1000米,助力自动驾驶
- 全金属太赫兹超材料生物传感器实现蛋白质检测超高灵敏度
- 微阵列技术在临床研究基因表达检测中的应用