根据我的理解,fl_image接受一个只接受单个图像的管道功能,即 processedClip = input_file.fl_image(imagePipeline)
,其中
def imagePipeline(img):
...
返回finalImage
但是,如果我们的imagePipeline函数接受更多参数
,该怎么办?即
def imagePipeline(img,arg1,arg2,arg3):
...
返回finalImage
我们如何在fl_image中为imagePipeline添加参数?
答案 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)