我正在使用opencv和python根据检测到运动时截断输入视频。
一旦代码的运动检测部分工作,下一步就是找到进行剪切的输入/输出编辑点(我正在使用ffmpeg)。
我使用过的方法适用于只有一段动作的时候:
If motion occurs:
append list with time information
然后使用min(list)和max(list)来查找切割时间。
但是,如果存在两个或更多个孤立的运动周期,则此方法会降低。如果列表显示[2,3,4,34,35,36],编辑点将是:
min(list) = 2
max(list) = 36
我想要一种提取连续时序信息的方法,所以在这个例子中:2-4和34-36。
这就是我坚持的逻辑!
我尝试在没有操作但是在while循环的每次迭代(或者每个注册为无运动的帧)上创建新列表时,将新列表附加到列表列表中我只想要一个新列表从运动到无运动的过渡。
If motion occurs:
append list with time information
else:
append list_of_list #but only once. not every iteration without motion
另一种方法可能是在没有运动时将0添加到列表中:
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,0,34,35,36,0,0,0, 0,0,0 ...]
是否有方便的方法从单个列表中提取序列2-4和34-36?
我希望这很清楚。任何建议都将不胜感激。
由于
答案 0 :(得分:0)
好的,从评论中,我认为你想要的是连续运动的间隔列表,例如: [ [2,5], [8,12], [15,16] ]
。
这可以使用以下代码获得:
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]