Pythonic方式记录while循环内的变化

时间:2016-03-10 09:30:36

标签: python list while-loop

我有一个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。

这是一个很好的解决方案还是我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:2)

<强>更新

第一个建议:

您可以做的改进很少,特别是如果通常在实践中(但不一定),您打算在Raspberry Pi上运行您的应用程序。

总共有4个案例要考虑,你的程序必须全部涵盖:

  1. 无动作:⇢⓪⇢⓪⇢⇢⇢

  2. 连续动作:⇢❶⇢❶⇢❶⇢

  3. 从无动作到动作:⓪⇢❶

  4. 从动作到无动作:❶⇢⇢

  5. 注册的唯一时间是案例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
    

    备注:

    1. 为了表现,最好在休息之前测试案例1和2,因为在实践中,它们比其他两个案例更频繁地发生。因此,通过运行继续,您可以避免浪费时间检查不太常见的案例3和4。
    2. 我们摆脱了motion_list并且不再需要为此列表分配内存,因为my_variable扮演了一个标志的角色,它通过将其值重新设置为{{{}来满足您的需求最后两种情况下,1}}或0
    3. 第二个建议:

      如果您没有将此应用程序作为大学项目,但出于更多实际/商业原因,您可能会想到这一改进:因为相机的阅读框是一个I / O限制任务,您可能会感兴趣{{3 (更可能在increasing webcam FPS