проблема определения направления стрелки на изображении - PullRequest
0 голосов
/ 17 июня 2019

Я обнаружил существующие стрелки и формы на изображении, и я хочу знать, как определить, откуда и куда идет стрелка, у меня есть начальная и конечная точки каждой стрелки и 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

Входное изображение

Input Image

1 Ответ

0 голосов
/ 17 июня 2019

Похоже, что вы пытаетесь найти, какие фигуры пересекает линия каждой стрелки. Я вижу два недостатка в вашем коде, которые могут вызвать проблему, но я не знаю, являются ли они причиной того, что некоторые стрелки могут быть соединены только с одной формой в соответствии с вашим кодом.

Сначала вы вычисляете наклон и y-пересечение каждой стрелки. Позже для каждой фигуры вы увидите, что для значений x этой фигуры уравнение переходит в диапазон y этой фигуры. Однако, когда вы находите наклон и y-пересечение, вы используете деление, которое может вернуть число с плавающей запятой (нецелое число, такое как 2.5). Проблема в том, что range () находит только целые числа. Поэтому, если, например, наклон стрелки равен 2,143, вполне вероятно, что когда вы найдете значение y этой стрелки, оно будет не целым числом и, следовательно, не попадет в диапазон значений y форма. Решение состоит в том, чтобы заменить 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):

Надеюсь, это поможет! -Theo

...