【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(複製)が指定できますので各自で試してみてください。 ...

公開: 2022年7月25日 · 更新: 2026年5月2日 · Toshihiko Arai

【Python】MoviePyで動画編集の自動化【動画編集への道#1】

この記事は、FFmpegコマンドを直接書くのに疲れた人が、PythonでサクッとカットやテロップやBGMミックスまで自動化するための入門メモです。 MoviePyはコアにFFmpegを使いつつ、Pythonらしいオブジェクト指向で VideoFileClip(...).subclip(...).write_videofile(...) のようにつなげて書けるので、動画編集ソフトを開かずに同じ加工を繰り返したいときに向いています。 まず手を動かすなら、後述の 指定時間でカット からどうぞ。1分尺の動画から数秒だけ切り出して書き出すだけなら、10行ほどで済みます。 準備 Pythonやシェルを使った動画編集の第一弾としまして、MoviePyでの動画編集をご紹介していきます。MoviePyの全体像や最新情報は 公式ドキュメント にまとまっていますので、ご覧ください。 次のような動画フォーマットを元に、MoviePyで動画を編集していきますね。 項目 値 サイズ 1280 × 720 エンコード H.264、 AAC MoviePyのインストール pipでMoviePyをインストールしましょう。Pythonは3.x系を使っていきます。 本記事のサンプルは from moviepy.editor import * や subclip を前提とした 1.x 系で書いています。2.x 系ではインポートパスや一部APIが変わっておりサンプルがそのままでは動かないため、バージョンを固定してインストールしてください。 $ pip install "moviepy<2" なお、MoviePyのコアでは ffmpeg のバイナリを呼び出します。OS側に ffmpeg が入っていない場合は事前にインストールしてください(macOSなら brew install ffmpeg、Ubuntuなら sudo apt install ffmpeg)。 それではMoviePyの使い方、プログラミング例をご紹介していきます。 指定時間でカット from moviepy.editor import * start = "00:00:03" # 開始時刻 end = "00:00:06" # 終了時刻 final_clip = VideoFileClip("in.mp4").subclip(start, end) final_clip.write_videofile( "split.mp4", codec='libx264', audio_codec='aac', temp_audiofile='temp-audio.m4a', remove_temp=True ) 音が出ない時の対処 write_videofile に何も指定しないと、環境によっては音が落ちて書き出されることがあります。MP4 で配るなら audio_codec='aac' と一時ファイル名 temp-audio.m4a を明示しておくと安定します。書き出し後はQuickTime / VLCなどで実際に音が出るかも軽く確認しておくのがおすすめです。 ...

公開: 2022年7月22日 · 更新: 2026年6月1日 · Toshihiko Arai

FFmpegでGIFアニメ作成|シェル・コマンド

はじめに この記事では、iPhoneで録画した動画ファイルを、FFmpegでGIFアニメーションに変換する方法を解説する。 パレット機能で見た目を整え、gifsicleでファイルサイズを小さくするところまで扱う。 最後に、GitHubで公開しているスクリプトをcurl経由でその場実行する方法も紹介する。 なお、macOSにbrewを使ってFFmpegがインストールされているものとする。 FFmpegでGIFアニメの基本の作り方 iPhoneで録画した動画ファイルをinput.movとして用意した。動画のファイルサイズは5.3 MB。 FFmpegを使って、動画ファイルをGIFアニメに変換するコマンドがこちら。横幅を320pxに収めるため、アスペクト比を保ちながら変換した。フレームレートは15fps。 ffmpeg -i input.mov -vf scale=320:-1 -r 15 output.gif ご覧の通り、画像がざらざらしていて、決してキレイとは言えない。GIFアニメのファイルサイズは約288 KB。 次では、もうひと手間かけて画像をキレイにする方法を紹介する。 FFmpegでGIFアニメをキレイに作る方法 FFmpegでGIFアニメをキレイに作るには、パレット機能を使う。次のコマンドで動画ファイルから色彩情報を抽出したpalette.pngを作成する。 ffmpeg -i input.mov -vf fps=15,scale=320:-1:flags=lanczos,palettegen palette.png 生成されたpalette.png画像がこちら。 このpalette.pngを元に動画を変換する。 ffmpeg -i input.mov -i palette.png -filter_complex "fps=15,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif だいぶキレイなGIFアニメを作ることができた。しかし、ファイルサイズは約786 KBで、最初のGIF画像の3倍弱の容量になってしまった。そこでこのファイルサイズを小さくする方法を次の項で紹介する。 GIFアニメのファイルサイズを小さくする方法 ここでは、GIFアニメのファイルサイズを小さくするために、gifsicleを使ってコマンドラインで圧縮する方法を紹介する。 gifsicleは、GIFをコマンドラインで編集できるツールだ。brewを使ってインストールする。 brew install gifsicle Gifsicleの詳細はこちら。 https://github.com/kohler/gifsicle 使い方は、次のとおり。 gifsicle -O3 --colors=128 --lossy=30 output.gif -o output_compressed.gif lossyの値を増やしていくとファイルサイズが小さくなる。 この結果、ファイルサイズを約786 KBから約369 KB(約53%削減)へと圧縮できた。 見た目もそれほど変わらない。 アニメGIF作成のシェルスクリプト ここまでのコマンドを毎回入力するのは面倒なので、シェルスクリプト化してみた。 使い方は、$ ./gif_anime.sh 動画ファイルで引数に動画のパスを渡す。すると、動画ファイルのディレクトリ上にanime.gifの名前でGIFアニメが保存される。 #!/bin/bash input=$1 output=$(dirname ${input})/anime.gif tmp=$(dirname ${input})/tmp.gif echo $output ffmpeg -i $input -vf fps=15,scale=320:-1:flags=lanczos,palettegen palette.png ffmpeg -i $input -i palette.png -filter_complex "fps=15,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $tmp gifsicle -O3 --colors=128 --lossy=30 $tmp -o $output rm -rf palette.png rm -rf $tmp 同じ考え方のスクリプトは、GitHubのshell-toolbox でも公開している。 手元にスクリプトを保存せず、その場で実行したい場合は、次のようにcurlで取得した内容をbashへ渡す。 ...

公開: 2019年3月6日 · 更新: 2026年4月29日 · Toshihiko Arai