Moviepy - обрезать видео с кадром (областью интереса), перемещающимся слева направо со временем

Я работаю над автоматическим созданием GIF из видеоклипов на сервере с помощью MoviePy. Библиотека помогла в различных преобразованиях и обрезке видео для создания GIF-файлов.

В моем текущем проекте у меня есть видеоклип с большим количеством движущихся объектов, что затрудняет автоматическое отслеживание интересующей области. (На коротком gif-файле ниже показана сцена, хотя фон там можно легко убрать и выполнить отслеживание объекта. Но допустим, отслеживание объекта выходит за рамки проекта).

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

введите здесь описание изображения

Я использую MoviePy, где я вырезал прямоугольник из видео, чтобы создать gif. Но прямоугольник фиксируется в исходной позиции координат. Я ищу способ переместить этот прямоугольник со временем и обрезать его, чтобы создать GIF.

clip = (VideoFileClip("my_video.mp4")
         .subclip((1,10.1),(1,14.9))
         .resize(0.5)
         .crop(x1=145,y1=110,x2=400,y2=810)) 

clip.write_gif("my_gif.gif")

Как добавить фактор времени, чтобы эти координаты менялись со временем.

Любые предложения приветствуются.


person Anna23    schedule 28.05.2017    source источник


Ответы (1)


Вы ищете функцию scroll в moviepy. Документов для него нет, но они здесь, а исходный код здесь< /а>.

moviepy.video.fx.all.scroll(clip, h=None, w=None, x_speed=0, y_speed=0, x_start=0, y_start=0, apply_to='mask')

Параметры:

  • clip; клип, на который нужно воздействовать

  • h и w, которые определяют высоту и ширину финального клипа

  • x_speed и y_speed, которые определяют скорость прокрутки. Не уверен, в чем они измеряются, поэтому вам, возможно, придется исследовать исходный код или просто пробовать и ошибаться.

  • x_start и y_start, которые представляют собой расстояния от (0,0), с которых начинается прокрутка.

  • apply_to; что-то делать с масками, вам это не понадобится!

Окончательный код:

clip = (VideoFileClip("my_video.mp4")
     .subclip((1,10.1),(1,14.9))
     .resize(0.5)
     .crop(x1=145,y1=110,x2=400,y2=810))

# You won't need to set `w` and `h` if you are separately cropping it
new_clip = clip.scroll(w=clip.w, h=var, x_speed=speed, y_start=height_to_top_of_wanted_bit)
new_clip.set_duration(1.0 / speed)

new_clip.write_gif("my_gif.gif")

Обратите внимание, этот код не тестировался.

person Tom Burrows    schedule 28.05.2017
comment
Что такое vfx? - person tommy.carstensen; 29.03.2021
comment
vfx означает визуальные эффекты, и потребовалось бы from moviepy.editor import vfx или что-то в этом роде. Я обновил код, чтобы удалить его и заменить рекомендуемым способом применения эффектов в MoviePy. - person Tom Burrows; 30.03.2021