【问题标题】:How do you use masks from pngs with moviepy?你如何在moviepy中使用来自png的蒙版?
【发布时间】:2020-04-10 06:30:03
【问题描述】:

我正在尝试将遮罩与 moviepy 一起使用。

我想使用这样的图像文件 (http://imgur.com/1IGHflk) 并将其作为蒙版覆盖在视频之上,这样只有图像的黑色部分在视频中是透明的。

当我使蒙版图像与视频的大小完全相同时,我可以让它工作,但我不知道如何使它与更小的蒙版图像一起工作。我想获取给定的小蒙版图像,并将其定位到视频上(此外,我实际上想获取此蒙版图像并将其作为蒙版一次放在几个不同位置的视频中)。

我已经包含了下面我尝试执行此操作的代码以及我得到的错误。任何帮助表示赞赏(或只是一个简单示例的链接,显示如何使用moviepy掩码)。谢谢!

from moviepy.editor import VideoFileClip, concatenate_videoclips, ImageClip, vfx, AudioFileClip, \
concatenate_audioclips, CompositeAudioClip, ColorClip, CompositeVideoClip, VideoClip

import random


if __name__ == '__main__':

    DEFAULT_CLIP_HEIGHT = 720
    DEFAULT_CLIP_WIDTH = 1280

    color_clip = ColorClip(size=(DEFAULT_CLIP_WIDTH, DEFAULT_CLIP_HEIGHT), col=((0, 0, 255)))
    color_clip = color_clip.set_duration(15)
    color_clip = color_clip.set_fps(DEFAULT_FPS)

    color_clip2 = ColorClip(size=(DEFAULT_CLIP_WIDTH, DEFAULT_CLIP_HEIGHT), col=((255, 0, 0)))
    color_clip2 = color_clip2.set_duration(15)
    color_clip2 = color_clip2.set_fps(DEFAULT_FPS)

    rounded_border_path = os.path.join(PROJECT_PATH, 'black_on_white_small.png')
    mask_clip = ImageClip(rounded_border_path)
    mask_clip = mask_clip.set_duration(10)
    mask_clip = mask_clip.set_fps(DEFAULT_FPS)
    mask_clip = mask_clip.set_position(('center', 'center'))

    comp_clip = CompositeVideoClip([mask_clip], bg_color=(255, 255, 255),
                               size=(DEFAULT_CLIP_WIDTH, DEFAULT_CLIP_HEIGHT), ismask=True)

     color_clip.mask = comp_clip

     comp_clip = CompositeVideoClip([color_clip2, color_clip], size=(DEFAULT_CLIP_WIDTH, DEFAULT_CLIP_HEIGHT))

     o_path = os.path.join(PROJECT_PATH, 'comp_color.mp4')
     comp_clip.write_videofile(o_path, fps=DEFAULT_FPS, codec='libx264')

产生错误: File "/Users/maxfowler/Dropbox/desktop/cs/upwork_montage/custom_moviepy/moviepy/video/compositing/CompositeVideoClip.py", line 110, in make_frame f = c.blit_on(f, t) File "/Users/maxfowler/Dropbox/desktop/cs/upwork_montage/custom_moviepy/moviepy/video/VideoClip.py", line 570, in blit_on return blit(img, picture, pos, mask=mask, ismask=self.ismask) File "/Users/maxfowler/Dropbox/desktop/cs/upwork_montage/custom_moviepy/moviepy/video/tools/drawing.py", line 43, in blit 1.0 * mask * blitted + (1.0 - mask) * blit_region) ValueError: operands could not be broadcast together with shapes (720,1280,9) (720,1280,3)

【问题讨论】:

    标签: python video mask moviepy


    【解决方案1】:

    您似乎正在使用整个图像(高 x 宽 x 3)作为蒙版。 MoviePy 中的蒙版必须是(高度 x 宽度 x 1),浮点值介于 0(透明)和 1(完全不透明)之间。

    这有帮助吗?

    【讨论】:

    • 感谢您的快速响应! (height x width x 3) 中的第三个值是多少?以及如何从“整个图像”转换为遮罩所需的格式?
    • aaa 我猜是 x3 的意思和 RGB 3 元组。所以我需要将它转换为 0 到 1 之间的浮点数......仍然会感谢代码示例!
    【解决方案2】:

    对于在一年后搜索此内容的任何人,您的蒙版图像需要是灰度而不是全彩色。

    这包括插入背景颜色

    bg_color=(255, 255, 255)
    

    应该只有一个变量,而不是 RGB 的三个变量。例如:

    bg_color=(255)
    

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2014-08-29
      • 2011-02-14
      • 2010-12-17
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多