Правильный способ обнаружения движения из потока - PullRequest
0 голосов
/ 08 декабря 2018

Что я пытаюсь сделать:

Я пытаюсь обнаружить движение из потока камеры.Я хочу найти правильный и наиболее эффективный способ сделать это, так как он будет работать на 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

Есть ли лучший способ для меня решить эту проблему?Любой другой способ, которым я должен думать об этой проблеме?

...