我要做什么:
我正在尝试检测摄像机流中的运动。我想找到一种合适且最有效的方法,因为它可以在树莓派上运行。
我到目前为止所做的事情:
我从相机拍摄的帧从彩色帧转换为黑白帧,重新调整了帧的大小以便于处理,并通过了高斯模糊来柔化帧。第一帧是关键帧
然后我获取后续帧,并计算当前帧和关键帧之间的绝对差。一旦我得到了两个帧之间的差,就可以计算平均值并将其推入列表。
在此列表中(我称其为滑动窗口),将其填充有一定数量的平均值(例如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
我是否有更好的方法来解决这个问题?还有其他我应该考虑这个问题的方式吗?