Как увеличить счет, если ограничивающий прямоугольник пересекается со статической линией, я использую Darkflow и модуль компьютерного зрения - PullRequest
0 голосов
/ 02 мая 2019

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

Например: если машина проходит через линию, счетчик должен увеличиваться на 1, как я и предполагал, моя программа должна работать.

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

Я пытаюсь сделать это с помощью простого условия «если», например: если обнаруженный объект указывает, например, (верхний х, верхний у) (нижний х, нижний у), счет должен увеличиться, но точки являются динамическими, потому что обнаружение происходит кадр за кадром и счет не точный.

Это координаты линии, в которых я соответственно скорректировал линию.

line = [(0, 430), (1200, 430)] 

Это функция, которую я использую для пересечения

def intersect(A,B,C,D):
    return ccw(A,C,D) != ccw(B,C,D) and ccw(A,B,C) != ccw(A,B,D)

def ccw(A,B,C):
    return (C[1]-A[1]) * (B[0]-A[0]) > (B[1]-A[1]) * (C[0]-A[0])

С помощью этой функции, из которой я получил это из статьи среднего уровня, я пытаюсь создать ограничивающие рамки и подразумевать функцию пересечения внутри себя.

def boxing(original_img, predictions):
    newImage = np.copy(original_img)

    for result in predictions:
        #predictions = mot_tracker.update(result
        top_x = result['topleft']['x']
        top_y = result['topleft']['y']

        btm_x = result['bottomright']['x']
        btm_y = result['bottomright']['y']

        #label = result['label'][1]

        p0 = top_x,top_y        
        #p1 = btm_x,btm_y
        p1 = btm_x,btm_y

        #print(p0,p1)
        #print(line[0],line[1])

        def counter_catch():
            if intersect(p0,p1,line[0],line[1]):

                global counter
                counter += 1
                print(counter)

        counter_catch()


        cv2.putText(newImage, str(counter), (100,200), cv2.FONT_HERSHEY_DUPLEX, 5.0, (0, 255, 255), 5)
        cords = (top_x,top_y,btm_x,btm_y)
        cx,cy = ((top_x+btm_x)//2, (top_y+btm_y)//2)        
        #print(counter)
        cv2.putText(newImage, "+",(cx,cy),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)   
        confidence = result['confidence']
        label = result['label'] + " " + str(round(confidence, 3))

        if confidence > 0.5:
            newImage = cv2.rectangle(newImage, (top_x, top_y), (btm_x, btm_y), (255,0,0),3)
            newImage = cv2.putText(newImage, label, (top_x, top_y-5), cv2.FONT_HERSHEY_COMPLEX_SMALL , 0.8, (0, 230, 0), 1, cv2.LINE_AA)

    return newImage  

После наложения модели на видео обнаруженные объекты будут иметь координаты линии обнаружения x1, y1, x2, y2.

как это

[{'label': 'person', 'confidence': 0.49965367, 'topleft': {'x': 96, 'y': 270}, 'bottomright': {'x': 136, 'y': 367}}, 

с помощью этого я пытаюсь создать счетчик.

...