#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()