以绘画效果冻结帧

原文链接:http://zulko.github.io/moviepy/examples/painting_effect.html

这是一种我们经常在西部片之类看到的效果:

视频地址:https://youtu.be/aC5CifkacSI

这个方法可以使照片看起来像绘画:

  • 使用Sobel算法对图片进行边缘检测,从而获得一张看起来像黑白手绘的照片。
  • 叠加图像的数组使颜色更加华丽,并添加在上一步骤中获得的轮廓。

最终剪辑将会把三个部分联结起来:特效之前的部分,带有特效的部分和特效之后的部分。带有特效的部分以以下方式获得:

  • 选择一帧进行冻结,使之转为绘画效果,并使其成为一个图像剪辑。
  • 添加文字剪辑“Audrey”至图像剪辑。
  • 将修改过的图像剪辑添加至原帧的顶层,但给其添加淡入淡出效果。

代码如下:

""" requires scikit-image installed (for vfx.painting) """
 
from moviepy.editor import *

# WE TAKE THE SUBCLIPS WHICH ARE 2 SECONDS BEFORE & AFTER THE FREEZE

charade = VideoFileClip("../../videos/charade.mp4")
tfreeze = cvsecs(19.21) # Time of the freeze, 19'21

# when using several subclips of a same clip, it can be faster
# to create 'coreaders' of the clip (=other entrance points).
clip_before = charade.coreader().subclip(tfreeze -2,tfreeze)
clip_after = charade.coreader().subclip(tfreeze ,tfreeze +2)


# THE FRAME TO FREEZE

im_freeze = charade.to_ImageClip(tfreeze)
painting = (charade.fx( vfx.painting, saturation = 1.6,black = 0.006)
                   .to_ImageClip(tfreeze))
                 
txt = TextClip('Audrey',font='Amiri-regular',fontsize=35)

painting_txt = (CompositeVideoClip([painting,txt.set_pos((10,180))])
                   .add_mask()
                   .set_duration(3)
                   .crossfadein( 0.5)
                   .crossfadeout( 0.5))

# FADEIN/FADEOUT EFFECT ON THE PAINTED IMAGE

painting_fading = CompositeVideoClip([im_freeze,painting_txt])

# FINAL CLIP AND RENDERING

final_clip =  concatenate_videoclips([ clip_before,
                            painting_fading.set_duration(3),
                            clip_after])

final_clip.write_videofile('../../audrey.avi',fps=charade.fps,
                        codec = "mpeg4", audio_bitrate="3000k")