You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:33:02