首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当在while true循环中检测到更改时才追加列表。或从列表中提取序列

仅当在while true循环中检测到更改时才追加列表。或从列表中提取序列
EN

Stack Overflow用户
提问于 2016-04-24 23:08:29
回答 1查看 61关注 0票数 0

我正在使用opencv和python来根据检测到运动的时间来截断输入视频。

一旦代码的运动检测部分正常工作,下一步就是找到要进行剪切的输入/输出编辑点(我使用ffmpeg)。

当只有一个运动周期时,我使用的方法效果很好:

代码语言:javascript
复制
    If motion occurs:
       append list with time information

然后使用min(列表)和max(列表)来查找切割时间。

但是,如果存在两个或更多独立的运动周期,则此方法会失败。假设列表为2,3,4,34,35,36,编辑点为:

代码语言:javascript
复制
min(list) = 2
max(list) = 36

我想要一种方法来提取连续的定时信息,在这个例子中是: 2-4和34-36。

这就是我坚持的逻辑!

当没有动作,但在while循环的每个迭代(或注册为无运动的每个帧)上创建一个新列表时,我曾尝试将新列表附加到列表列表中,其中我只想在从运动到无运动的转换中创建一个新列表。

代码语言:javascript
复制
    If motion occurs:
       append list with time information

    else:
      append list_of_list #but only once. not every iteration without motion

另一种方法可能是在没有运动发生时将0添加到列表中:

代码语言:javascript
复制
    If motion occurs:
       append list with time information

    else:
      append list with 0

使用前面的示例,这将提供以下结果:

0,0,2,3,4,0,0,0,0,...,0,0,0,0,0,34,35,36,0,0,0,0,0,0...

是否有一种简便的方法可以从单个列表中提取序列2-4和34-36?

我希望这是很清楚的。任何建议都将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-04-26 00:59:49

好的,从评论来看,我认为你想要的是一个连续运动的间隔列表,例如[ [2,5], [8,12], [15,16] ]

可以使用以下代码获得该值:

代码语言:javascript
复制
lst = [[]]

while True:
    # get second
    if lst[-1]:
        last = lst[-1][1]
        if second - last == 1:
            lst[-1][1] = second
        elif second - last > 1:
            lst.append([second, second])
    else:
        lst[-1] = [second, second]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36824897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档