Opencv3 - Как дать ID людям, которых я считаю, основываясь на контурах и прямоугольниках? - PullRequest
0 голосов
/ 09 июня 2019

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

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

video_path = 'C:\\Users\\MONSTER\\Desktop\\video.avi'
cv2.ocl.setUseOpenCL(False)

version = cv2.__version__.split('.')[0]
print(version) 

#read video file
cap = cv2.VideoCapture(video_path)

#check opencv version
if version == '2' :
    fgbg = cv2.BackgroundSubtractorMOG2()
if version == '3': 
    fgbg = cv2.createBackgroundSubtractorMOG2()


while (cap.isOpened):

    #if ret is true than no error with cap.isOpened
    ret, frame = cap.read()

    if ret==True:

        #apply background substraction
        fgmask = fgbg.apply(frame)
        ret1,th1 = cv2.threshold(fgmask,150,200,cv2.THRESH_BINARY)              
        #check opencv version
        if version == '2' : 
            (contours, hierarchy) = cv2.findContours(th1.copy(), 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        if version == '3' : 
        (im2, contours, hierarchy) = cv2.findContours(th1.copy(), 
cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        if cv2.contourArea(c) < 200:
            continue

        #get bounding box from countour
        (x, y, w, h) = cv2.boundingRect(c)

        #draw bounding box
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow('foreground and background',th1)
    cv2.imshow('rgb',frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

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

i = 1
        for c in contours:
            if cv2.contourArea(c) < 200:
                continue

            #get bounding box from countour
            (x, y, w, h) = cv2.boundingRect(c)

            #draw bounding box
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            i = i + 1
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(frame,str(i),(x,y), font, 2,(255,255,255),2,cv2.LINE_AA)

У вас есть идея дать точные идентификаторы прямоугольникам.

1 Ответ

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

Ваш код не отслеживает. только обнаружение только на фоне. Боюсь, что для того, чтобы ваш код изначально выполнял отслеживание, не все так просто. отслеживание будет происходить только в том случае, если у вас есть идеальный связанный объект и имеется только 1 объект. Обычно это происходит редко, поскольку обнаружение сбоев происходит постоянно Таким образом создается несколько RECT.

Идентификатор сохранит изменения для разных кадров при входе в сцену, и существует несколько обнаружений, как на изображении ниже. Я пробовал это раньше. Каждый раз ограничивающий прямоугольник будет меняться от объекта к объекту. Особенно, когда вы используете простой метод, такой как bgfg, этот потерянный трек или потерянный идентификатор происходит почти в каждом кадре.

Правильный способ - использовать реальный алгоритм отслеживания для постоянного обновления объекта. * например 1005 *

https://www.youtube.com/watch?v=qvcyK4ZMKbM

enter image description here

Вход в трекер TLD получен из Rect, полученного

(x, y, w, h) = cv2.boundingRect(c)

Исходный код находится в github. не стесняйтесь проверить это

https://github.com/gnebehay/TLD

Выполните установку, чтобы запустить ее и интегрировать в текущую систему обнаружения.

https://github.com/zk00006/OpenTLD/wiki/Installation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...