确定图像中箭头方向的问题

problem in determining arrow direction in an image

我在图像中检测到现有的箭头和形状,我想知道, 如何确定箭头的来源和去向,我有每个箭头的起点和终点以及每个形状的 x、y、宽度、高度。

我尝试计算每个箭头的斜率以延长箭头并检查是否出现交叉点,但结果并不理想。

我想知道每个箭头连接的是什么形状,但有些箭头只连接一个形状。

#Looping over detected shapes 
for i in range(len(Shapes)-1,0,-1):
    #Check if the shape is an arrow 
    if Shapes[i][4]=="Arrow":
        points=Shapes[i][6]
        StartX = points[0, 0, 0]
        StartY = points[0, 0, 1]
        Ind = np.argmax(points[:, :, 1])
        MaxX = points[Ind, 0, 0]
        Maxy = points[Ind, 0, 1]
       #Calculating Line equation
        m=(Maxy-StartY)/(MaxX-StartX)
        b=StartY-m*StartX
        #loop on every shape to check connected edges
        for j in range(len(Shapes)-1,0,-1):
            #Escape if it is an arrow
            if Shapes[j][4] == "Arrow":
                continue
            #I use the x of the shape to calculate the y of the arrow
            # x is the upper left corner of each shape
            # check every y  from range (X, X+Width of the shape )  
            x = Shapes[j][0]

            while x<Shapes[j][0]+Shapes[j][2]:
                y=m*x+b
                x+=1
                #if the calculated  Y overlaps with the  shape  then it is 
                #connected to that shape
                if y in range(Shapes[j][1]-100,Shapes[j][1]+Shapes[j][3]+100):
                    Shapes[i].append(Shapes[j][7])
                    Found=True
                    break

输入图片

看来您正在尝试找出每个箭头的线相交的形状。我在您的代码中看到两个可能导致问题的缺陷,但我不知道它们是否是导致某些箭头根据您的代码仅连接到一个形状的原因。

首先,计算每个箭头的斜率和 y-intersection。稍后,对于每个形状,您会看到对于该形状的 x 值,方程式是否进入该形状的 y 范围。但是,当您找到斜率和 y-intersection 时,您使用除法,它可以 return 一个浮点数(一个 non-integer 数字,例如 2.5)。这个问题是 range() 只能找到整数。因此,例如,如果箭头的斜率是 2.143,当您找到该箭头的 y 值时,它很可能是一个 non-whole 数字,因此不会进入 y-values 的形状。一个解决方案是更换 if y in range(Shapes[j][1]-100,Shapes[j][1]+Shapes[j][3]+100): if y > Shapes[j][1]-100 and y < Shapes[j][1]+Shapes[j][3]+100:

此外,为了 运行 通过每个形状,您使用 for j in range(len(Shapes)-1,0,-1): 这意味着如果 Shapes 的长度为 5,则 for 循环将按顺序将 j 设置为 4、3、2 和 1。但是,当引用长度为 5 的列表时,您可以引用从 0 到 4,而不是从 1 到 4,因为列表中的第一项的索引为 0,而不是 1。因此,for 循环应该读取: for j in range(len(Shapes)): 或者,如果您有某种原因要倒数,但您似乎没有倒数,但我可能遗漏了一些东西,您可以使用: for j in range(len(Shapes)-1,-1,-1):

希望对您有所帮助! -西奥