Что я пытаюсь сделать:
Я пытаюсь обнаружить движение из потока камеры.Я хочу найти правильный и наиболее эффективный способ сделать это, так как он будет работать на Raspberry Pi.
Что я сделал до сих пор:
Я взялкадры с камеры преобразуются когда-либо из цветного в ч / б кадр, изменяя размер кадра для облегчения обработки и передавая размытие по Гауссу для смягчения кадров.Первый кадр является ключевым кадром
Затем я беру последующие кадры и вычисляю абсолютную разницу между текущим кадром и ключевым кадром.Как только у меня будет разница между двумя кадрами, я вычисляю среднее значение и помещаю его в список.
В этом списке (я называю это скользящим окном) я заполняю его заданным числом средних, скажем, 30. Язатем возьмите среднее значение по списку и вычислите среднее значение скользящего окна и разделите на 255 (это среднее значение пикселей для кадров, поскольку они идут от 0 до 255).Если это среднее значение> 1%, есть движение, иначе движения нет.
После этого я повторю для 60 кадров, затем я установлю ключевой кадр на текущий кадр и обнаружу, есть ли движение снова.
Вот мой код:
if __name__ == "__main__":
keyFrame = None
count = 0
slidingWindow = []
while(True):
#capture frames and apply some blurs to later check absolute value
ret, frame = cap.read()
frameSmall = imutils.resize(frame, width=400)
gray = cv2.cvtColor(frameSmall, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
#if this is the beginning of a stream set the keyframe to the first frame
if keyFrame is None:
keyFrame = gray
#show our frame
cv2.imshow('frame',frame)
key = cv2.waitKey(1) & 0xFF
# compute the absolute difference between the current frame and
frameDelta = cv2.absdiff(keyFrame, gray)
slidingWindow.append(np.average(frameDelta))
if np.average(slidingWindow)/255 > 0.01:
if count % 5 == 0:
print('motion detected')
else:
if count % 5 == 0:
print('no motion')
if count == 60:
#reset keyframe after x frames
keyFrame = gray
count = 0
del slidingWindow[0]
count += 1
Есть ли лучший способ для меня решить эту проблему?Любой другой способ, которым я должен думать об этой проблеме?