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

#python #opencv #image-processing #object-detection

#python #opencv #обработка изображений #обнаружение объекта

Вопрос:

Мне нужно сравнить списки предыдущего кадра со списками текущего кадра. Я могу сохранять и распечатывать списки текущего кадра из функции 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:

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

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