Как отследить рост нескольких контуров? - PullRequest
2 голосов
/ 21 октября 2019

Цель состоит в том, чтобы найти контуры , которые больше 170 в размере области контура , которые продолжают расти в течение 5 кадров.

Я могу сделать это для один контур . Мой метод такой, как для новичка, так как в настоящее время я добавляю значения центра отфильтрованных контуров в деку, а соответствующие значения области контура - в отдельную деку. Если после 5 кадров значения последовательно увеличиваются, я вытаскиваю первое значение из очереди (указывающее начальную позицию роста).

ключ вопросявляется: - Как я могу отслеживать два или три контура для последовательный рост контуров ?

Дополнительные вопросы:

-В настоящее время я предполагаю, что рост будет происходить от первого отфильтрованного контура , это будет , а не всегда так, может начаться рост контура происходит в позициях 10,11,12,13,14 - тогда мне нужно будет взять значение координаты позиции 10 в координатной деке - как мне сравнить последовательные области контура для проверкидля 5 кадров последовательного роста при отслеживании начальных координат роста ?

- есть более эффективный способ обработки значений центральной и контурной областей, чем добавление боth по запросу после прохождения порога области контура?

enter image description here

coords = deque()
cGrowth = deque()

dim = (1280, 720) 
firstFrame = None
j = 0

# loop over the frames of the video
while True:

    frame = cv2.VideoCapture(pathToVideo)
    if frame is None:
        break

    frame = cv2.resize(frame, dim, interpolation = cv2.INTER_AREA)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)

    if firstFrame is None:
        firstFrame = gray
        continue

    frameDelta = cv2.absdiff(firstFrame, gray)
    thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]    
    thresh = cv2.dilate(thresh, None, iterations=2)      
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
                            cv2.CHAIN_APPROX_SIMPLE)
    centres = []
    cAreas = []          
    center = None

    for i in range(len(contours)):

        if cv2.contourArea(contours[i]) < 150:
            continue

        moments = cv2.moments(contours[i])
        cAreas.append(cv2.contourArea(contours[i]))
        centres.append((int(moments['m10']/moments['m00']), int(moments['m01']/moments['m00'])))
        cv2.circle(frame, centres[-1], 3, (0,0,0), -1)
        coords.append(centres)
        cGrowth.append(cAreas)

        if len(cGrowth) == 5:
        i = 0
        for x, y in pairwise(cGrowth):
            #print(x, y)
            if (x < y):
                i += 1
                if (i == 4):
                    impX = coords.popleft()
                    print("Origin of motion is at: " + str(impX))
                    break   

    break

    j += 1
    cv2.imshow("Motion Feed", frame)
    cv2.imshow("Thresh", thresh)
    cv2.imshow("Frame Delta", frameDelta)
    key = cv2.waitKey(1) & 0xFF


# if the 'q' key is pressed, destroy all windows
if key == ord("q"):
    cv2.destroyAllWindows()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...