给定一个掩码NumPy数组,维度为
我想将这个视频从
我实现的朴素解决方案将数组分成维度为
然后,我将数组转置为
此过程会删除间歇帧的掩码(这对我来说没问题)。
当前性能:形状小数组
以下是具有所需和不需要行为数据的玩具示例:
(frames,points,2)
,表示跟踪frames
帧的每个帧中points
个(x,y)
点的视频。我想将这个视频从
frames
帧插值到任意数量的帧数中,速度非常快,希望能使用三次样条插值,但是任何其他连续插值也可以工作。
我实现的朴素解决方案将数组分成维度为
(frames,points)
的两个数组X
和Y
。然后,我将数组转置为
(points,frames)
。对于每一行(单点随时间变化),我将其映射到索引和值,因此数组[5,6, - ,7]
变为:
[{"x": 0, "y": 5}, {"x": 1, "y": 6}, {"x": 3, "y": 7}]
我将其提供给scipy.interp1d
,并运行在我的新数组上,例如[0,0.5,1,1.5,2,2.5,3]
,然后得到一个新的x,y
数组,然后将其转换回NumPy。此过程会删除间歇帧的掩码(这对我来说没问题)。
当前性能:形状小数组
(9帧,140个点,2)
到(24帧,140个点,2)
- 立方插值 0.115秒
- 线性插值 0.112秒
注意!
这是一个掩码数组,例如[5,6, - ,7]
。因此,重要的是在插值中合并掩码,以便不会有0值(数据数组看起来像[5,6,0,7]
!)以下是具有所需和不需要行为数据的玩具示例:
import numpy as np
import numpy.ma as ma
from scipy.interpolate import interp1d
points = np.array([1, 2, 3, 4, 0, 6])
mask = [0, 0, 0, 0, 1, 0]
points = ma.array(points, mask=mask)
print(points) # [1 2 3 4 -- 6]
lin = np.linspace(0, 1, 6)
# Undesired behavior
f = interp1d(lin, points, axis=0, kind='cubic')
print(f(lin)) # [1 2 3 4 -8.8817842e-16 6]
# Desired behavior
compressed_lin = [0, 0.2, 0.4, 0.6, 1]
compressed_points = np.array([1,2,3,4,6])
f = interp1d(compressed_lin, compressed_points, axis=0, kind='cubic')
print(f(lin)) # [1 2 3 4 5 6]
9
帧转换到24
帧时,这些帧是均匀分布的,还是它们有自己的帧时间戳? - Quang Hoang9
帧吗? - Quang Hoang[0,0.125,0.250,0.375,0.500,0.625,0.750,0.875,1]
间隔,并且如果我们需要插值至25帧,则会尝试插值这些值:[0, 0.04, 0.08, ... , 0.92, 0.92, 1]
(这是一个示例,其中的值介于0和1之间,但它们也可以介于0和9之间,无所谓) - Amit