Наложение объектов на видеопоток с использованием Python и POVRAY - PullRequest
0 голосов
/ 29 июня 2018

Я использую Vapory, которая является библиотекой Python-обертки для Povray. Это позволяет использовать функции Python для управления типичными операциями Povray.

Я хочу наложить 3D-модели в каждом кадре моего видеопотока. Способ сделать это в Vapory следующий:

from vapory import *
from moviepy.video.io.ffmpeg_writer import ffmpeg_write_image

light = LightSource([10, 15, -20], [1.3, 1.3, 1.3])
wall = Plane([0, 0, 1], 20, Texture(Pigment('color', [1, 1, 1])))
ground = Plane( [0, 1, 0], 0,
                Texture( Pigment( 'color', [1, 1, 1]),
                         Finish( 'phong', 0.1,
                                 'reflection',0.4,
                                 'metallic', 0.3)))
sphere1 = Sphere([-4, 2, 2], 2.0, Pigment('color', [0, 0, 1]),
                                           Finish('phong', 0.8,
                                                  'reflection', 0.5))
sphere2 =Sphere([4, 1, 0], 1.0, Texture('T_Ruby_Glass'),
                Interior('ior',2))

scene = Scene( Camera("location", [0, 5, -10], "look_at", [1, 3, 0]),
               objects = [ ground, wall, sphere1, sphere2, light],
               included=["glass.inc"] )


def embed_in_scene(image):

    ffmpeg_write_image("__temp__.png", image)
    image_ratio = 1.0*image.shape[1]/image.shape[0]
    screen = Box([0, 0, 0], [1, 1, 0], Texture(
                    Pigment( ImageMap('png', '"__temp__.png"', 'once')),
                    Finish('ambient', 1.2) ),
                 'scale', [10, 10/image_ratio,1],
                 'rotate', [0, 20, 0],
                 'translate', [-3, 1, 3])
    new_scene = scene.add_objects([screen])
    return new_scene.render(width=800, height=480, antialiasing=0.001)

clip = (VideoFileClip("bunny.mp4") # File containing the original video
        .subclip(23, 47) # cut between t=23 and 47 seconds
        .fl_image(embed_in_scene)  # <= The magic happens
        .fadein(1).fadeout(1)
        .audio_fadein(1).audio_fadeout(1))
clip.write_videofile("bunny2.mp4",bitrate='8000k')

, что приводит к видеопотоку следующим образом:

enter image description here

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

Есть мысли?

РЕДАКТИРОВАТЬ: Таким образом, я смог переместить камеру, получить объект в центре. Однако я все еще не мог получить фильм на весь экран. Это связано с тем, что объекту камеры предписано смотреть в направлении координат, и я не знаю, на какие координаты должна быть направлена ​​камера, чтобы получить изображение на весь экран. См:

enter image description here

...