OpenCV Python从TuSimple数据集车道坐标中提取当前车道两条中线的方法
操作步骤
TuSimple车道数据集的lanes字段内的子列表按从左到右的水平位置排序,x值越小对应车道越靠近画面左侧。车载摄像头默认安装在车辆中轴线位置,对应图像水平中线就是当前车辆的行驶位置,基于这个逻辑筛选步骤如下:
- 第一步:获取图像水平中心坐标
TuSimple数据集原图分辨率为1280×720,默认水平中心x坐标为640,如果你的图像做了缩放处理,按实际宽度除以2计算即可。 - 第二步:计算每条车道的平均有效x坐标
遍历所有车道,剔除值为-2的无效点,计算剩余x坐标的平均值,代表这条车道的整体横向位置。 - 第三步:筛选左右边界车道
- 左边界:所有平均x小于图像中心的车道中,平均x最大的那条,就是离当前车辆最近的左侧车道线
- 右边界:所有平均x大于图像中心的车道中,平均x最小的那条,就是离当前车辆最近的右侧车道线
- 第四步:仅对筛选出的两条车道做可视化
参考代码
import numpy as np import cv2 # 假设img为原始图像,annots为当前标注字典 lanes = annots["lanes"] h_samples = annots["h_samples"] img_w = img.shape[1] center_x = img_w / 2 valid_lanes_info = [] for lane in lanes: # 提取当前车道所有有效x点 valid_x = [x for x in lane if x >= 0] if not valid_x: continue # 跳过没有有效点的无效车道 avg_x = sum(valid_x) / len(valid_x) valid_lanes_info.append((avg_x, lane)) if len(valid_lanes_info) < 2: # 特殊情况:车道数不足2条的处理逻辑,可自行补充 pass else: # 分离左右侧车道 left_lanes = [item for item in valid_lanes_info if item[0] < center_x] right_lanes = [item for item in valid_lanes_info if item[0] > center_x] # 取最靠近中心的左右车道 target_lanes = [] if left_lanes: target_lanes.append(max(left_lanes, key=lambda x: x[0])[1]) if right_lanes: target_lanes.append(min(right_lanes, key=lambda x: x[0])[1]) # 可视化筛选后的车道 lane_vis = [[(x, y) for (x, y) in zip(lane, h_samples) if x >= 0] for lane in target_lanes] img_vis = img.copy() for lane in lane_vis: cv2.polylines(img_vis, np.int32([lane]), isClosed=False, color=(255,255,255), thickness=15)
注意事项
- 如果道路只有1条车道的特殊场景,可根据需求调整逻辑,保留该车道的两条边界即可
- 如果图像做了裁剪、缩放等预处理,需要同步调整
center_x的计算逻辑,确保和实际画面中心对齐
内容的提问来源于stack exchange,提问作者dev1ce
相关产品推荐
相关产品推荐

