从一个大的 ndarray 中减去一个较小的 ndarray 然后使用剩下的将较小的 ndarray 填充到较大的 ndarray 的大小
subtract a smaller ndarray from a larger onethen use whats left to pad the smaller ndarray to the size as the larger ndarray
我有一个理想的 ndarray 大小,可以将视频表示为 numpy 数组。尺寸分辨率为 1080X1920Xfr,其中 Fr 是帧数。给定一个随机视频,它可能没有适合运动尺寸的正确分辨率,所以我们用蓝色像素填充帧,直到它的分辨率为 1080X1920。
我们想一次性完成,而不是遍历帧,我想我们可以
具有比典型视频更长的 fr 值。
以某种方式从理想视频中减去随机视频
将理想视频中的所有像素值设为蓝色
然后将理想中减去的片段添加到随机视频中。
所以我们首先会检查随机视频中的帧数是否> Fr...如果是我们跳过,然后继续进行减法。
我有一段代码可以拍摄一段视频,将其展平并检查大小是否大于某个值,如果不是,则跳过,然后创建一个带有差异的 numpy 数组,并填充它0 并将其附加到视频,然后再重新整形。这使得所有正在处理的视频都具有相同的帧数。
这是相关代码。我认为你看到上面的代码要复杂得多,如果你能帮助解决它,我们将不胜感激。
videodata = skvideo.io.vread(dirname2)
videodata = videodata.flatten()
# following code pads the video so that it all videos are the same size
x = (1080 * 1920 * 3 * 12600) - videodata.size
y = [[0] for i in range(x)]
y = np.asarray(y)
y = y.flatten()
videodata = np.concatenate((videodata, y), -1)
videodata = videodata.reshape(1, 12600, 1080, 1920, 3)```
根据我对问题的理解,有两个子问题要问你:
- 视频分辨率不等于 1080x1920。
- 时间步数,即视频帧数应等于一定数量(在提供的示例中为 12600)。
这两个问题都可以用numpy.pad来解决。
设 videodata
为大小为 1065x1900 且有 1200 帧的数组。
a = np.random.random((1065, 1900, 3, 1200))
所以要使视频分辨率为 1080x1920,我们可以执行以下操作:
b = np.pad(a, ((7,8),(10,10),(0,0),(0,0)), mode='constant', constant_values=0)
b.shape
你会得到 (1080, 1920, 3, 1200)
。所以现在您的视频是 1080x1920。值 (7,8)
指示 numpy 在该轴中填充(之前,之后),因此我们在第一个轴的前面填充 7 个值,在第一个轴的末尾填充 8 个值。
现在要添加额外的帧,我们将沿着最后一个轴填充。
b = np.pad(a, ((7,8),(10,10),(0,0),(0,10)), mode='constant', constant_values=0)
b.shape
我们会得到 (1080, 1920, 3, 1200)
。因此我们向视频添加了 10 个帧。
希望这能回答您的问题。
我有一个理想的 ndarray 大小,可以将视频表示为 numpy 数组。尺寸分辨率为 1080X1920Xfr,其中 Fr 是帧数。给定一个随机视频,它可能没有适合运动尺寸的正确分辨率,所以我们用蓝色像素填充帧,直到它的分辨率为 1080X1920。
我们想一次性完成,而不是遍历帧,我想我们可以
具有比典型视频更长的 fr 值。
以某种方式从理想视频中减去随机视频
将理想视频中的所有像素值设为蓝色
然后将理想中减去的片段添加到随机视频中。
所以我们首先会检查随机视频中的帧数是否> Fr...如果是我们跳过,然后继续进行减法。
我有一段代码可以拍摄一段视频,将其展平并检查大小是否大于某个值,如果不是,则跳过,然后创建一个带有差异的 numpy 数组,并填充它0 并将其附加到视频,然后再重新整形。这使得所有正在处理的视频都具有相同的帧数。
这是相关代码。我认为你看到上面的代码要复杂得多,如果你能帮助解决它,我们将不胜感激。
videodata = skvideo.io.vread(dirname2)
videodata = videodata.flatten()
# following code pads the video so that it all videos are the same size
x = (1080 * 1920 * 3 * 12600) - videodata.size
y = [[0] for i in range(x)]
y = np.asarray(y)
y = y.flatten()
videodata = np.concatenate((videodata, y), -1)
videodata = videodata.reshape(1, 12600, 1080, 1920, 3)```
根据我对问题的理解,有两个子问题要问你:
- 视频分辨率不等于 1080x1920。
- 时间步数,即视频帧数应等于一定数量(在提供的示例中为 12600)。
这两个问题都可以用numpy.pad来解决。
设 videodata
为大小为 1065x1900 且有 1200 帧的数组。
a = np.random.random((1065, 1900, 3, 1200))
所以要使视频分辨率为 1080x1920,我们可以执行以下操作:
b = np.pad(a, ((7,8),(10,10),(0,0),(0,0)), mode='constant', constant_values=0)
b.shape
你会得到 (1080, 1920, 3, 1200)
。所以现在您的视频是 1080x1920。值 (7,8)
指示 numpy 在该轴中填充(之前,之后),因此我们在第一个轴的前面填充 7 个值,在第一个轴的末尾填充 8 个值。
现在要添加额外的帧,我们将沿着最后一个轴填充。
b = np.pad(a, ((7,8),(10,10),(0,0),(0,10)), mode='constant', constant_values=0)
b.shape
我们会得到 (1080, 1920, 3, 1200)
。因此我们向视频添加了 10 个帧。
希望这能回答您的问题。