вычтите меньший ndarray из большего, затем используйте то, что осталось, чтобы дополнить меньший ndarray к размеру как больший ndarray - PullRequest
0 голосов
/ 18 февраля 2020

У меня идеальный размер ndarray, который представляет видео в виде массива numpy. Размер имеет разрешение 1080X1920Xfr, где Fr - количество кадров. Для произвольного видео у него может быть неправильное разрешение для размера оттиска, поэтому мы дополняем кадры голубыми пикселями до разрешения 1080X1920.

Мы хотели бы сделать это за один go вместо l oop через кадры, и я подумал, что мы могли бы

иметь значение fr, которое длиннее обычного видео.

Каким-то образом вычесть случайное видео из идеального видео

make все значения пикселей в идеальном видео синего цвета

затем добавляют куски, вычтенные из идеального к случайному видео.

, поэтому мы сначала проверим, чтобы увидеть, является ли количество кадров в случайном виде video> Fr ... если это мы пропускаем, затем приступаем к выполнению вычитания.

У меня есть код, который берет видео, выравнивает его и проверяет, больше ли размер, чем определенное значение, если он пропущен, если нет, он создает массив numpy с разницей, заполняет его нулями и добавляет его к видео, прежде чем изменить его обратно. это делает все видео, которые обрабатываются, одинаковым числом кадров.

вот код для этого. Я полагаю, вы видите, что код для вышеупомянутого гораздо сложнее, и ваша помощь в его решении будет принята.

     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 Ответ

2 голосов
/ 24 февраля 2020

Из того, что я понял из вопроса, есть две подзадачи для вас:

  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 кадров к видео.

Надеюсь, что это ответ на ваш вопрос.

...