基于斜率、截距及重叠率合并OpenCV霍夫检测直线的优化方案问询
霍夫直线检测结果的重叠直线合并优化方案
我正在处理一个OpenCV相关问题:霍夫直线检测器(Hough Line Detector)输出了大量直线,需要通过斜率(slope)、**y轴截距(y-intercept)**和重叠率将重叠直线合并,以此减少直线数量。
背景说明
下图是叠加了霍夫检测直线的图像:
当前实现代码
获取直线端点数组
通过以下代码得到检测到的线段端点数组:
hough = cv.HoughLinesP(can, h_rho, h_theta, h_threshold, minLineLength=h_min_line_length, maxLineGap=h_max_line_gap) # Hough Line Detection h1 = hough.squeeze() # 输出"h1"是包含检测线段端点的数组
h1中的每个元素是包含[x1 y1 x2 y2]坐标的1x4 NumPy数组。
Line类定义
我创建了Line类来存储直线的坐标、斜率和y轴截距:
class Line: def __init__(self, x1, y1, x2, y2) -> None: self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 if ((x2-x1) != 0): # 非竖直线 self.m = (y2-y1) / (x2-x1) self.b = y2 - self.m*x2 else: # 竖直线 self.m = 999 self.b = 999 # 用999作为标识,避免处理NoneType
转换为Line实例并排序
将所有数组元素转换为Line实例存入列表l1,并按斜率m排序:
l1 = [] for i,line in enumerate(h1): x1,y1,x2,y2 = np.ravel(line,"C") l = Line(x1,y1,x2,y2) l1.append(l) # 按斜率'm'对实例列表排序 l1.sort(key=operator.attrgetter('m'))
尝试的分组方法及问题
我希望基于斜率m的阈值将l1划分子组,例如阈值为2时,斜率列表[-85, -50, -50, -1.125, -0.75, -0.679, -0.12, -0.13, -0.16, 25, 27,..., 999, 999]应被分组为[[1], [2,3], [4,5,6], [7,8,9], [10,11],...,[850,851]]。
参考方案使用itertools.groupby分组:
# 基于斜率'm'的相似度子分组(可根据'm'和'b'的标准差调整子分组顺序以优化速度) l2 = [list(group) for _, group in itertools.groupby(l1, lambda num: num.m//2)]
但该方法在斜率跨0值时会出现分组错误。
疑问
我的后续计划是在每个子组内基于截距b再次分组,再通过重叠率删除被完全包含的直线,请问有没有更简便的实现方法?
内容的提问来源于stack exchange,提问作者lordcarrot
相关产品推荐
相关产品推荐

