Как сохранить список центральных точек из последнего кадра для сравнения списка центральных точек текущего кадра - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно сравнить списки предыдущего кадра со списками текущего кадра. Я могу хранить и распечатывать списки текущего кадра из функции get_contours. Он добавляет центральные точки обнаруженных объектов из видео в пустые списки, называемые whiteCoordinates и otherCoordinates.

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

Так как это можно сделать? Как я могу сохранить предыдущие списки в whiteCoordinates2 и otherCoordinates2 и использовать их для сравнения со списками текущего кадра whiteCoordinates и otherCoordinates.

# returns every center point from video's objects to a list.
whiteCoordinates = []   #empty lists
otherCoordinates = []
def get_contours(hsv, target, mask):
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)

    for contour in cnts:
        if filter_contours(contour):
            try:
                M = cv2.moments(contour)
                cX = int(M["m10"] / M["m00"])   #returns center points
                cY = int(M["m01"] / M["m00"])
                cv2.circle(target, (cX,cY), 5, (0, 0, 255), -1)
                mcolor = mean_color(hsv, contour)
                if colour_filter(mcolor):
                    cv2.putText(target,"White %s" % mcolor.astype(np.int), (cX, cY), font, 0.5, fontColor, lineType=lineType)
                    whiteCoordinates.append((cX, cY))   #appends center points to list
                else:
                    cv2.putText(target,"Other %s" % mcolor.astype(np.int), (cX, cY), font, 0.5, fontColor, lineType=lineType)
                    otherCoordinates.append((cX, cY))   #appends center points to list
            except:
                pass

    return target
while True:
    #how to store previous lists to otherCoordinates2, whiteCoordinates2
    whiteCoordinates2, otherCoordinates2 = whiteCoordinates, otherCoordinates
    #convert to tuples
    firstOther = set(map(tuple, otherCoordinates))
    secOther = set(map(tuple, otherCoordinates2))
    firstWhite = set(map(tuple, whiteCoordinates))
    secWhite = set(map(tuple, whiteCoordinates2))
#check lenght of diffecences, if 0 nothing have moved  
    other = len(firstOther.symmetric_difference(secOther))
    white = len(firstWhite.symmetric_difference(secWhite))
    hits = 0
    miss = 0
#calculates is others have moved
    if other != 0:
        hits += 1
    else:
        miss += 1
    print(miss, hits)
    print(firstOther, secOther)

Желаемый результат - сравнить предыдущие и текущие списки для определения наличия движения между кадрами. Имеет ли это какой-либо смысл для кого-либо? Спасибо, что даже прочитали это, особое спасибо, если у кого-то есть какие-либо советы!

Ссылка для полного кода: https://github.com/kristiansyrjanen/billystat/blob/master/matias/circles/palloframe.py

1 Ответ

1 голос
/ 25 апреля 2019

whiteCoordinates2 = whiteCoordinates не копирует список, он копирует ссылку на список в памяти.Поэтому любое изменение одного из них также будет отображаться в другом.

Чтобы сделать правильную копию списка, вы можете использовать whiteCoordinates2 = whiteCoordinates.copy()

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