
【Python】VidStabで手ぶれ補正【動画編集への道#2】
Pythonで動画の手ぶれ補正をするライブラリ「VidStab」を試した記録です。OpenCVベースの補正を、短いコードで動かせるのが便利なところです。 この記事では、VidStabの基本的な使い方、補正後に出る黒いボーダーを reflect で目立たなくする方法、逆に補正が向かない動画の例をまとめます。Pythonやシェルを使って動画編集を自動化していく企画の第二弾です。 VidStab(Python Video Stabilization) VidStabモジュールは、コアにOpenCVを使用した動画の手振れを修正できるプログラムになります。OpenCVへの理解がなくても、VidStabを利用すれば手っ取り早く手ぶれ補正ができますのでご安心ください。 vidstab と OpenCV のインストール Python3.xで動作させていきます。vidstabをpipでインストールします。 $ pip install vidstab vidstabを動かすにはOpenCVも必要になりますので合わせてインストールしてください。 $ pip install opencv-python $ pip install opencv-contrib-python VidStab で手ぶれ補正する それではさっそく、VidStab で手ぶれ補正してみましょう。自転車に乗りながらスマホをチェストマウントして撮影した動画になります。 元動画(左)ではブレブレだった映像も、手ぶれ補正後はだいぶマシになったように感じます。 プログラムは次のとおりです。たったの数行で手ぶれ補正ができちゃいます。 from vidstab import VidStab stabilizer = VidStab(kp_method='ORB') stabilizer.stabilize(input_path='../build/in.mp4', output_path='../build/out_orb.avi') VidStabを使えば、驚くおほど簡単に手ぶれ補正した動画が作れちゃいますね! ただし注意点としまして、avi 形式で保存しないと機能しませんでした。 黒いボーダーを reflect(反射)で埋める 手ぶれ補正すると、端の部分に黒い隙間ができてしまいます。黒い部分を含めないように MoviePyなどでCrop処理しても良いのですが、VidStabのreflect(反射)機能を使うことで目立たなくさせることもできます。 from moviepy.editor import * from moviepy.video.tools.segmenting import findObjects import moviepy.video.fx.all as vfx import os def crop(clip, region, margin = 50): w,h = clip.size # clip = vfx.crop(clip, x1=(w/4), width=(w/2)) clip = clip.set_mask(region.mask).set_pos(region.screenpos) clip = vfx.crop(clip, x1=(margin), width=(w - margin * 2), y1=(margin), height=(h - margin * 2) ) return clip.resize(region.size) if __name__ == "__main__": # im = ImageClip("splitter_720x1280.png") im = ImageClip("../assets/splitter_800x900.png") # Loacate the regions, return a list of ImageClips regions = findObjects(im) # region ( リージョン): 範囲、領域、分野、(身体の)部位の意味 print(len(regions)) # ←これが0なら、マスク画像の作成で何か間違ってる。(黒枠でちゃんと囲えてないとか、透過だとダメで白黒でやる) clip1 = crop(VideoFileClip("../build/out_orb.avi", audio=False), regions[0]) clip2 = crop(VideoFileClip("../build/out_orb_reflect.avi", audio=False), regions[1]) final_clip = CompositeVideoClip([clip1, clip2], im.size).subclip(0.5, clip2.duration - 0.5) out_path = "../build/pip_orb_reflect.mp4" final_clip.write_videofile(out_path) os.system('open ' + out_path) 他にもkp_method には replicate(複製)が指定できますので各自で試してみてください。 ...

