如何使用OpenCV检测赛道长白线与垂直短线的交点,求参数或优化方案
赛道分隔线交点检测解决方案
适配参数调整
你当前检测不到垂直短线的核心是参数设置针对长直线做了优化,没有适配短线特征,可调整如下参数:
- 边缘检测(Canny)参数:
初始低阈值设为120,高阈值设为200,放宽阈值范围保留更多对比度偏低的短线边缘,你之前的145-150窄阈值会过滤掉大部分短线的边缘信息 - 霍夫线检测参数:
theta调整为np.pi / 180,减小角度步长,提升接近垂直方向的线的检出率threshold调整为5,降低投票阈值,短线本身像素少,原有10的阈值会筛掉绝大多数短线min_line_length初始值调整为10,垂直短线实际长度大多在10-30像素区间,原有50的长度阈值直接过滤了所有短线max_gap调整为10即可,短线没有明显断裂间隙,无需过高设置
更优实现思路
分开检测两种目标线,针对性过滤干扰,比统一检测精度高很多:
- 长白线筛选:检测到所有线后,计算每条线的斜率,保留斜率绝对值在0.1~0.3区间的近似水平长直线,过滤其他方向的干扰线
- 垂直短线筛选:同样计算斜率,保留斜率绝对值>2的近似垂直线段,只针对这类线做后续计算
- 交点计算:遍历每条长白线和所有垂直短线,计算线段交点,仅保留同时落在两条线段范围内的交点,再通过距离阈值合并间距过近的重复点,最终得到你需要的标记点位
核心代码修改示例
# 新增线段交点计算函数 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
相关产品推荐
相关产品推荐

