判断两条直线左右位置的有效方法 可基于numpy或opencv实现
两条直线左右位置判断优化方案
方案1:重叠Y区间投影法(优先使用)
该方法针对短直线导致的均值偏差问题优化,核心是仅在两条直线的纵向重叠范围内计算X坐标均值,完全符合人眼直观判断逻辑,仅依赖numpy即可实现:
- 第一步:提取两条直线的点集,分别记为红直线点集
pts_red(shape为[N,2],每一行是[x,y]坐标)、绿直线点集pts_green(shape为[M,2]) - 第二步:计算两条直线的Y坐标范围和重叠区间:
y_red_min, y_red_max = pts_red[:,1].min(), pts_red[:,1].max() y_green_min, y_green_max = pts_green[:,1].min(), pts_green[:,1].max() # 计算重叠Y区间 y_overlap_min = max(y_red_min, y_green_min) y_overlap_max = min(y_red_max, y_green_max) - 第三步:若
y_overlap_max > y_overlap_min说明存在重叠区间,筛选两条直线在重叠区间内的点计算X均值对比:# 筛选重叠区域内的点 red_overlap = pts_red[(pts_red[:,1] >= y_overlap_min) & (pts_red[:,1] <= y_overlap_max)] green_overlap = pts_green[(pts_green[:,1] >= y_overlap_min) & (pts_green[:,1] <= y_overlap_max)] # 比较X均值 if red_overlap[:,0].mean() < green_overlap[:,0].mean(): print("红直线在绿直线左侧") else: print("红直线在绿直线右侧")
方案2:直线拟合对比法(适用于无重叠区间的场景)
如果两条直线完全没有纵向重叠,可通过拟合直线方程后代入公共参考Y值对比X坐标实现:
- 第一步:以Y为自变量、X为因变量拟合直线方程
x = k*y + b,避免竖直直线斜率无穷大的问题:# 1次多项式拟合,输入分别是Y坐标、X坐标、多项式阶数 k_r, b_r = np.polyfit(pts_red[:,1], pts_red[:,0], deg=1) k_g, b_g = np.polyfit(pts_green[:,1], pts_green[:,0], deg=1) - 第二步:取公共参考Y值(可取两条直线所有Y坐标的均值)代入方程计算对应X值对比:
y_ref = np.mean(np.concatenate([pts_red[:,1], pts_green[:,1]])) x_r_ref = k_r * y_ref + b_r x_g_ref = k_g * y_ref + b_g if x_r_ref < x_g_ref: print("红直线在绿直线左侧") else: print("红直线在绿直线右侧")
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

