Freezing a movie frame with a painting effect — MoviePy 1.0.1 documentation

# Freezing a movie frame with a painting effect

That’s an effect that we have seen a lot in westerns and such.

The recipe used to make a photo look like a painting:

- Find the edges of the image with the Sobel algorithm. You obtain what looks like a black and white hand-drawing of the photo.

- Multiply the image array to make the colors flashier, and add the contours obtained at the previous step.

The final clip will be the concatenation of three part: the part before the effect, the part with the effect, and the part after the effect. The part with the effect is obtained as follows:

- Take the frame to freeze and make a “painted image” of it. Make it a clip.

- Add a text clip saying “Audrey” to the “painted image” clip.

- Overlay the painted clip over the original frame, but make it appear and disappear with a fading effect.

Here you are for the code:

    """ 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")