簡體   English   中英

從較大的 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 是幀數。 給定一個隨機視頻,它可能沒有正確的 excersize 分辨率,所以我們用藍色像素填充幀,直到它的分辨率為 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 幀。

希望這能回答你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM