【python】滑动窗口算法
·
一、诉求
起因是要计算视频卡顿时长。
在处理video_to_pic的时候,用数字标识图片切片,比如1.png、2.png;
由于卡顿时长不一致,不是固定的区间,但希望获取到所有卡顿的小区间;
当成列表处理,那么如何获取呢?想到了滑动窗口,统计所有窗口的起、始位置。
二、实现
卡顿前后则画面相同,通过比较画面的相似度,确认连续相同的图片张数。
滑动窗口抽象成列表计算
输入:A = [1,1,2,3,3,3,3,4,5,6,6,6,6]
目标:[1,1],[3,3,3,3,3],[6,6,6,6]
输出:B1 = [0,3,9] ,B2 = [1,6,12]
结果:frozen_len = [2, 4, 4]
踩坑:
- 列表长度小于2不判断
- 列表的最后一位元素分三种情况
- [1,2,3,3,3]、[1,2,3,3,4]、[1,2,3,3,4,4]
- 列表第一个元素要进行指针赋值
三、原理
双指针概念,固定left、滑动right(待补充)
四、代码
# 获取连续卡顿的帧数下标,计算卡顿时间
def sliding_window(url):
# 每帧的值
A = [1,1,2,3,3,3,3,4,5,6,6,6,6]
f1 = 0
f2 = 0
# 窗口起始位置下标
B1 = []
# 窗口中止位置下标
B2 = []
"""
1、前置条件
2、确定循环测试
3、删除重复判断
4、返回所有重复窗口的起、始下标
"""
if len(A) == 0 or len(A) == 1:
print("没有窗口")
if len(A) >= 2:
for i in range(len(A)-1):
if i == 0:
f1 = i
f2 = i + 1
if f2 == len(A) - 1:
if A[f1] == A[f2]:
B1.append(f1)
B2.append(f2)
if A[f1] != A[f2] and A[f1] == A[f2-1] and f2-f1 >= 2:
B1.append(f1)
B2.append(f2-1)
f2 += 1
f1 = f2 - 1
elif A[f1] != A[f2]:
f2 += 1
f1 += 1
# print(B1, B2)
elif A[f1] == A[f2]:
f2 += 1
f1 = f1
# print(B1, B2)
print("卡顿起始位置下标:",str(B1) +",终止位置下标:",str(B2))
timecode = []
for i in range(len(B1)):
# 计算所有卡顿的时长
tmp = B2[i] - B1[i]
timecode.append(tmp)
# 需要知道卡顿的时间戳??
print("所有卡顿的持续时长/帧:",timecode)
输出:
卡顿起始位置下标: [0, 3, 9],终止位置下标: [1, 6, 12]
所有卡顿的持续时长/帧: [2, 4, 4]
五、扩展
- 可计算卡度起始的时间戳
- 可判断连续卡顿60张的区间
- 可通过将图像转成直方图,比较两张图前后的differ
- 可判断声波文,无声的区间
更多推荐
所有评论(0)