如何在opencv中的HoughLinesP之后合并行

问题描述

我有这段代码,我正在尝试使用分段和 HoughLine 方法检测植物作物行。

我非常了解分割和 HoughLineP 部分。但是我陷入了如何合并从 HoughLineP 方法输出的行

我的问题是

  1. 为什么我们要合并 houghlinesp 方法检测到的线
  2. 合并这条线的可能方法是什么.. 任何材料的链接将不胜感激

我偶然发现了一个类似的问题 stackoverflow 但没有太多解释只是一堆代码

这里没有合并部分是测试图像上HoughlineP的输出 test_image

HoughLineP 方法

def draw_lines(image,mask):
    mask = mask*255
    mask = cv2.GaussianBlur(mask,(5,5),1)
    mask = cv2.Canny(mask.astype(np.uint8),80,255)
    lines = cv2.houghlinesp(mask,1,np.pi / 180,threshold=50,minLineLength=50,maxLineGap=250)
    lines = np.squeeze(lines,axis=1)
    m_lines = merge_lines(lines)
    for line in m_lines:
        x1,y1,x2,y2 = line.astype(int)
        cv2.line(image,(x1,y1),(x2,y2),(255,0),2)
    
    return image

#根据距离合并彼此靠近的线

from numpy.polynomial import polynomial as P
def merge_lines(lines):
    clusters =  []
    idx = []
    total_lines = len(lines)
    if total_lines < 30:
        distance_threshold = 20
    elif total_lines <75:
        distance_threshold = 15
    elif total_lines<120:
        distance_threshold = 10
    else:
        distance_threshold = 7
    for i,line in enumerate(lines):
        x1,y2 = line
        if [x1,y2] in idx:
            continue
        parameters = P.polyfit((x1,x2),(y1,1)
        slope = parameters[0]#(y2-y1)/(x2-x1+0.001)
        intercept = parameters[1]#((y2+y1) - slope *(x2+x1))/2
        a = -slope
        b = 1
        c = -intercept
        d = np.sqrt(a**2+b**2)
    cluster = [line]
    for d_line in lines[i+1:]:
        x,y,xo,yo= d_line
        mid_x = (x+xo)/2
        mid_y = (y+yo)/2
        distance = np.abs(a*mid_x+b*mid_y+c)/d
        if distance < distance_threshold:
            cluster.append(d_line)
            idx.append(d_line.tolist())
    clusters.append(np.array(cluster))
    merged_lines = [np.mean(cluster,axis=0) for cluster in clusters]
    print(clusters)
    print(merged_lines)
    return merged_lines

我明白在合并函数中斜率和截距是如何获得的..但我不明白其余的代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)