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