我有一个Python脚本触发计算机网络摄像头,并能够检测使用opencv捕获的视频中的移动。
它的工作方式是Python读取视频的第一帧并将其存储为变量中的numpy数组。然后,在脚本中运行一个while循环,基本上将第一个视频帧与视频的每个当前帧进行比较。每秒大约有30帧在循环中迭代。当前帧不同于第一帧时,我通过为其分配值1来更新while循环内的变量。因此,当循环继续时,您可能有0,0,0,然后是1,1,1,1,具体取决于是否有运动。 我的目的是记录动作开始的时间。换句话说,我的变量从0变为1的时间。
这是我的伪代码:
start webcam
times_list=[]
motion_list=[]
while True:
my_variable=0
frame_difference=current_frame - first_frame
if frame_difference > 0:
continue
my_variable=1
motion_list.append(my_variable)
#The motion_list will get big, so let's keep only the last two items to avoid memory problems
#The last two items is all we need.
#Check if there was a change from non-motion to motion
if motion_list[-1]==1 and motion_list[-2]==0:
times_list.append(datetime.datetime.now())
所以,最后我有动作开始的所有时间的time_list。
这是一个很好的解决方案还是我在这里遗漏了什么?
答案 0 :(得分:2)
<强>更新强>
您可以做的改进很少,特别是如果通常在实践中(但不一定),您打算在Raspberry Pi上运行您的应用程序。
总共有4个案例要考虑,你的程序必须全部涵盖:
无动作:⇢⓪⇢⓪⇢⇢⇢
连续动作:⇢❶⇢❶⇢❶⇢
从无动作到动作:⓪⇢❶
从动作到无动作:❶⇢⇢
注册的唯一时间是案例3所描述的时间;在议案期间(案例2),我们不关心时间。
为了解决这个问题,我想,在while
循环之前:
first_frame
my_variable
设置为0
这是伪代码:
times_list=[]
my_variable = 0
while True:
frame_difference = current_frame - first_frame
# Case 1:
if difference_frame == 0 and my_variable == 0:
continue
# Case 2:
if difference_frame != 0 and my_variable == 1:
continue
# Case 3:
if difference_frame != 0 and my_variable == 0:
my_variable = 1
# Your comments say this is the only instant you are interested in
times_list.append(datetime.datetime.now())
# Case 4:
if difference_frame == 0 and my_variable == 1:
my_variable = 0
备注:强>
motion_list
并且不再需要为此列表分配内存,因为my_variable
扮演了一个标志的角色,它通过将其值重新设置为{{{}来满足您的需求最后两种情况下,1}}或0
。 如果您没有将此应用程序作为大学项目,但出于更多实际/商业原因,您可能会想到这一改进:因为相机的阅读框是一个I / O限制任务,您可能会感兴趣{{3 (更可能在increasing webcam FPS)