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

如何使用OpenCV检测赛道长白线与垂直短线的交点,求参数或优化方案

赛道分隔线交点检测解决方案

适配参数调整

你当前检测不到垂直短线的核心是参数设置针对长直线做了优化,没有适配短线特征,可调整如下参数:

  • 边缘检测(Canny)参数:
    初始低阈值设为120,高阈值设为200,放宽阈值范围保留更多对比度偏低的短线边缘,你之前的145-150窄阈值会过滤掉大部分短线的边缘信息
  • 霍夫线检测参数:
    • theta调整为np.pi / 180,减小角度步长,提升接近垂直方向的线的检出率
    • threshold调整为5,降低投票阈值,短线本身像素少,原有10的阈值会筛掉绝大多数短线
    • min_line_length初始值调整为10,垂直短线实际长度大多在10-30像素区间,原有50的长度阈值直接过滤了所有短线
    • max_gap调整为10即可,短线没有明显断裂间隙,无需过高设置

更优实现思路

分开检测两种目标线,针对性过滤干扰,比统一检测精度高很多:

  1. 长白线筛选:检测到所有线后,计算每条线的斜率,保留斜率绝对值在0.1~0.3区间的近似水平长直线,过滤其他方向的干扰线
  2. 垂直短线筛选:同样计算斜率,保留斜率绝对值>2的近似垂直线段,只针对这类线做后续计算
  3. 交点计算:遍历每条长白线和所有垂直短线,计算线段交点,仅保留同时落在两条线段范围内的交点,再通过距离阈值合并间距过近的重复点,最终得到你需要的标记点位

核心代码修改示例

# 新增线段交点计算函数
def line_intersection(line1, line2):
    x1, y1, x2, y2 = line1[0]
    x3, y3, x4, y4 = line2[0]
    den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    if den == 0:
        return None
    t_num = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)
    u_num = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3))
    t = t_num / den
    u = u_num / den
    if 0 <= t <= 1 and 0 <= u <= 1:
        x = int(x1 + t * (x2 - x1))
        y = int(y1 + t * (y2 - y1))
        return (x, y)
    return None

# 修改get_lines函数,返回线段数组而不是绘制后的图,方便后续计算
def get_lines(edges, min_length, max_gap):
    rho = 1
    theta = np.pi / 180
    threshold = 5
    min_line_length = min_length
    max_line_gap = max_gap
    lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)
    return lines

调整后你可以先拿到所有线段,分别筛选长白线和垂直短线,再计算交点即可得到目标点位。

内容的提问来源于stack exchange,提问作者fenaux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:57:03