从一个大的 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)```

根据我对问题的理解,有两个子问题要问你:

  1. 视频分辨率不等于 1080x1920。
  2. 时间步数,即视频帧数应等于一定数量(在提供的示例中为 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 个帧。

希望这能回答您的问题。