Инициализация мультиобъектного отслеживания в Opencv с использованием объекта multiTracker - PullRequest
0 голосов
/ 17 февраля 2019

Я использую multiTracker в cv2 для отслеживания нескольких объектов.Мой код построен на основе этой ссылки и этой .Я хочу инициализировать все ограничивающие прямоугольники одновременно в любой момент видео.Однако у меня проблемы с этим.Вот код:

import imutils
import cv2
from random import randint

trackerName = 'csrt'
videoPath = "C:/Users/Art/testVideo.mp4"

OPENCV_OBJECT_TRACKERS = {
    "csrt": cv2.TrackerCSRT_create,
    "kcf": cv2.TrackerKCF_create,
    "boosting": cv2.TrackerBoosting_create,
    "mil": cv2.TrackerMIL_create,
    "tld": cv2.TrackerTLD_create,
    "medianflow": cv2.TrackerMedianFlow_create,
    "mosse": cv2.TrackerMOSSE_create
}


trackers = cv2.MultiTracker_create()
cap = cv2.VideoCapture(videoPath)

while cap.isOpened():

    ret, frame = cap.read()

    if frame is None:
        break

    # for fast processing resize the frame 
    frame = imutils.resize(frame, width=600)

    (success, boxes) = trackers.update(frame)
    for box in boxes:
        (x, y, w, h) = [int(v) for v in box]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the 'p' key is selected, we select a bounding box to track
    if key == ord("p"):
        boxes = []
        colors = []
        boxFlag = True
        while boxFlag:
            box = cv2.selectROI('MultiTracker', frame, fromCenter=False, 
                                showCrosshair=True)
            boxes.append(box)
            colors.append((randint(64, 255), randint(64, 255), randint(64, 
                          255)))
            print("Press q to quit selecting boxes and start tracking")
            print("Press any other key to select next object")
            if key == ord("q"):  # q is pressed
                boxFlag = False
    # Initialize MultiTracker
    for box in boxes:
        tracker = OPENCV_OBJECT_TRACKERS[trackerName]()
        trackers.add(tracker, frame, box)

cap.release()
cv2.destroyAllWindows()

Однако есть некоторые проблемы.Во-первых, когда я нажимаю клавишу «p», чтобы выбрать ограничивающие рамки, видео останавливается, и открывается другое окно, в котором отображается кадр, в котором было приостановлено видео, и я могу выбрать ограничивающие рамки только в новом окне.Кроме того, когда я нажимаю клавишу «q», ничего не происходит, и в основном оно остается там навсегда.У меня вопрос, как я могу решить эту проблему и иметь возможность инициализировать отслеживание после того, как я выберу все ограничивающие рамки.

1 Ответ

0 голосов
/ 17 февраля 2019

Я не люблю отвечать на свой вопрос.Тем не менее, это может быть полезно для кого-то еще.Я сделал некоторые изменения в предыдущем коде.Я также понял, что в cv2 есть метод selectROIs, который может быть полезен, если кто-то хочет выбрать несколько ограничивающих рамок одновременно.Вот обновленный код:

import imutils
import cv2
from random import randint

trackerName = 'csrt'
videoPath = "C:/Users/Art/testVideo.mp4"

OPENCV_OBJECT_TRACKERS = {
    "csrt": cv2.TrackerCSRT_create,
    "kcf": cv2.TrackerKCF_create,
    "boosting": cv2.TrackerBoosting_create,
    "mil": cv2.TrackerMIL_create,
    "tld": cv2.TrackerTLD_create,
    "medianflow": cv2.TrackerMedianFlow_create,
    "mosse": cv2.TrackerMOSSE_create
}

# initialize OpenCV's special multi-object tracker
trackers = cv2.MultiTracker_create()
cap = cv2.VideoCapture(videoPath)

while cap.isOpened():

    ret, frame = cap.read()

    if frame is None:
        break

    frame = imutils.resize(frame, width=600)
    (success, boxes) = trackers.update(frame)

    # loop over the bounding boxes and draw them on the frame
    for box in boxes:
        (x, y, w, h) = [int(v) for v in box]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    # if the 's' key is selected, we are going to "select" a bounding
    # box to track
    if key == ord("s"):
        colors = []
        # select the bounding box of the object we want to track (make
        # sure you press ENTER or SPACE after selecting the ROI)
        box = cv2.selectROIs("Frame", frame, fromCenter=False,
                             showCrosshair=True)
        box = tuple(map(tuple, box)) 
        for bb in box:
            tracker = OPENCV_OBJECT_TRACKERS[trackerName]()
            trackers.add(tracker, frame, bb)

    # if you want to reset bounding box, select the 'r' key 
    elif key == ord("r"):
        trackers.clear()
        trackers = cv2.MultiTracker_create()

        box = cv2.selectROIs("Frame", frame, fromCenter=False,
                            showCrosshair=True)
        box = tuple(map(tuple, box))
        for bb in box:
            tracker = OPENCV_OBJECT_TRACKERS[trackerName]()
            trackers.add(tracker, frame, bb)

    elif key == ord("q"):
        break
cap.release()
cv2.destroyAllWindows()

После выбора каждого ограничивающего прямоугольника необходимо нажать кнопку «Ввод» или «Пробел», чтобы завершить его и начать выбор нового ограничивающего прямоугольника.Когда вы закончите с выбором ограничивающего прямоугольника, нажмите клавишу «Esc», чтобы завершить выбор ROI и начать отслеживание.Также, если вам необходимо сбросить ограничивающие рамки по какой-либо причине, нажмите кнопку «r».

...