正确检测流中运动的方法

时间:2018-12-08 06:23:46

标签: python motion motion-detection

我要做什么:

我正在尝试检测摄像机流中的运动。我想找到一种合适且最有效的方法,因为它可以在树莓派上运行。

我到目前为止所做的事情:

我从相机拍摄的帧从彩色帧转换为黑白帧,重新调整了帧的大小以便于处理,并通过了高斯模糊来柔化帧。第一帧是关键帧

然后我获取后续帧,并计算当前帧和关键帧之间的绝对差。一旦我得到了两个帧之间的差,就可以计算平均值并将其推入列表。

在此列表中(我称其为滑动窗口),将其填充有一定数量的平均值(例如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

我是否有更好的方法来解决这个问题?还有其他我应该考虑这个问题的方式吗?

0 个答案:

没有答案