Как подсчитать транспортные средства, если обязательный пункт коснется линии - PullRequest
0 голосов
/ 19 апреля 2020

Ниже код, который я пытаюсь:

    def mouse_drawing(event, x, y, flags, params):
    global point1, point2, drawing
    if event == cv2.EVENT_LBUTTONDOWN:
        if drawing is False:
            drawing = True
            point1 = (x, y)
        else:
            drawing = False
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing is True:
            point2 = (x, y)

    cap = cv2.VideoCapture("new2.asf")
    cv2.namedWindow("App", cv2.WINDOW_FREERATIO)
    cv2.setMouseCallback("App", mouse_drawing)
    fgbg = cv2.createBackgroundSubtractorMOG2()
    kernel = np.ones((5, 5), np.uint8)

while True:
    ret, frame = cap.read()
    frame = cv2.resize(frame,None,fx=scaling_factorx,fy=scaling_factory,interpolation=cv2.INTER_AREA)
    imgray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    fgmask1 = cv2.GaussianBlur(imgray, (7,7), 0)

    fgmask = fgbg.apply(fgmask1)

    if point1 and point2:
        cv2.line(frame, point1, point2, (0, 255, 0), 3)

    contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    try:
        hierarchy = hierarchy[0]
    except:
        hierarchy = []

    for contour, hier in zip(contours, hierarchy):
        (x, y, w, h) = cv2.boundingRect(contour)
        if w > 80 and h > 80:
            cv2.rectangle(frame, (x,y), (x+w,y+h), (0, 255, 0), 2)

    cv2.imshow("App", frame)

Как написать изображение транспортного средства с cv2.imwrite, который достигает линии, линия, которая рисуется как вручную. И у транспортных средств есть прямоугольные angular коробки, это хорошо, но у некоторых транспортных средств есть больше чем одна коробка. На одном транспортном средстве должна быть только одна прямоугольная коробка angular. И это должно быть сохранено, если достигнуто линия, остальные транспортные средства не должны быть сохранены. Пожалуйста, дайте мне знать решение. image

1 Ответ

0 голосов
/ 20 апреля 2020

Сначала вам нужно сгруппировать пересекающиеся прямоугольники в один.

  • Вы делаете это путем проверки области пересечения между каждой парой прямоугольников.
  • Если область пересечения больше предварительно определенного отношения heuristi c для небольшой области прямоугольника тогда меньший прямоугольник должен быть удален. Например, intersection_area / smaller_rect_area > 0.75
  • Пожалуйста, проверьте этот ответ для пересечения прямоугольников.

Во-вторых, чтобы проверить, что прямоугольник прошел линию:

  • Используйте ваши точки, чтобы найти параметры для формулы общей линии: ax + by + c = 0
  • Для каждого кадра вставьте координаты центра прямоугольника в формулу и отследите знак результата .
  • Если знак результата изменяется, это означает, что центр прямоугольника прошел линию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...