如何在MoviePy中向fl_image添加参数?

时间:2017-11-16 17:25:32

标签: python moviepy

根据我的理解,fl_image接受一个只接受单个图像的管道功能,即 processedClip = input_file.fl_image(imagePipeline)

,其中

def imagePipeline(img):

...

返回finalImage

但是,如果我们的imagePipeline函数接受更多参数

,该怎么办?

def imagePipeline(img,arg1,arg2,arg3):

...

返回finalImage

我们如何在fl_image中为imagePipeline添加参数?

4 个答案:

答案 0 :(得分:1)

您可以使用lambda技巧:

from moviepy.editor import VideoFileClip

def change_image(image, param):
    return image + param

myparam = 1
modified_clip = (
   VideoFileClip('/path/to/my/initial/clip')
   .fl_image(lambda image: change_image(image, myparam))
)

答案 1 :(得分:0)

虽然这可能不是最佳解决方案,但您可以将您拥有的任何参数设置为全局变量。

例如:

param1 = 34
param2 = 43

def process_image(img):
    global param1
    global param2
    if param1 > param2:
        #do whatever
        param1 = param2 * 2
    return image

clip1 = VideoFileClip("input.mp4")
final_clip = clip1.fl_image(process_image)
final_clip.write_videofile('output.mp4', audio=False)

答案 2 :(得分:0)

我遇到了同样的麻烦并且在课堂上解决了这个问题。

class ProcessImage:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2
    def __call__(self, image):
        # any process you want
        return image

clip = VideoFileClip('input.mp4')
final_clip = clip.fl_image(ProcessImage(1, 2))
final_clip.write_videofile('output.mp4')

答案 3 :(得分:0)

您可以使用闭包(比类少的样板):

def mkproc(*args,*kw):
    def fun(img):
        #this code has access to args and kw
        return img
    return fun

final = clip.fl_image(mkproc("foo","bar",spam="eggs"))

functools.partial也这样做。例如:

import functools
import cv2

blur5 = functools.partial(cv2.GaussianBlur,ksize=(5,5),sigmaX=0)