前後フレームの差分で動いた部分だけマスクする モーションマスク


前後フレームの YUV 差分をマスクしてフィルタを当てなくするモーションマスクの使い方。マスクするチャンネルは Y だけと、YUV のすべてを指定でき、マスクを反転することもできる。使うフィルタは tblend で前後フレームを1入力で取り込み、maskedmerge で1,2入力の割合を決めている。

前後フレームの差分をブレンドする tblend
マスクして2入力を合わせる maskedmerge

Y チャンネルをマスクする

Y は [1] のフィルタが当たり、UV は [0] のフィルタが当たる。[0] は元映像を入力しているので適宜フィルタチェーンを変更する。つまり動いていない部分に [1] のフィルタが当たる
ffplay -i input -vf format=yuvj420p,split=3[0][1][2];[1]lutyuv=0:0:0[1a];[2]tblend=c0_mode=difference128,lutyuv=between(clip(val\,118\,138)\,119\,137)\*255:0:0[2a];[0][1a][2a]maskedmerge=0x7,format=yuv420p

Y は [0] のフィルタが当たり、UV は [1] のフィルタが当たる。[1] は元映像を入力しているので適宜フィルタチェーンを変更する。つまり動いている部分に [0] のフィルタが当たる
ffplay -i input -vf format=yuvj420p,split=3[0][1][2];[0]lutyuv=0:0:0[0a];[2]tblend=c0_mode=difference128,lutyuv=between(clip(val\,118\,138)\,119\,137)\*255:255:255[2a];[0a][1][2a]maskedmerge=0x7,format=yuv420p

YUV チャンネルをマスクする

YUV のマスクが各自独立した値なのでフィルタが各チャンネルに同じように当たるわけではない

動いていない部分に [1] のフィルタが当たる
ffplay -i input -vf format=yuvj420p,split=3[0][1][2];[1]lutyuv=0:0:0[1a];[2]tblend=all_mode=difference128,lutyuv=between(clip(val\,118\,138)\,119\,137)\*255:between(clip(val\,123\,133)\,124\,132)\*255:between(clip(val\,123\,133)\,124\,132)\*255[2a];[0][1a][2a]maskedmerge=0x7,format=yuv420p

動いている部分に [0] のフィルタが当たる
ffplay -i input -vf format=yuvj420p,split=3[0][1][2];[0]lutyuv=0:0:0[0a];[2]tblend=all_mode=difference128,lutyuv=between(clip(val\,118\,138)\,119\,137)\*255:between(clip(val\,123\,133)\,124\,132)\*255:between(clip(val\,123\,132)\,124\,134)\*255[2a];[0a][1][2a]maskedmerge=0x7,format=yuv420p

tblend フィルタの解説

difference128 は差が無ければ 128 を返し、プラスに差があれば 128 からプラスに、マイナスに差があれば 128 からマイナスを加算する。YUV の UV が 128 のときに Y の値のグレースケールになり、今回マスクの値で 1,2入力の割合を決める maskedmerge フィルタを使って使い分けている。

Y チャンネルは 119 から 137 までを 255 でマスクし、UV チャンネルは 124 から 132 までを 255 でマスクしている
ffplay -i input -vf tblend=all_mode=difference128,lutyuv=between(clip(val\,118\,138)\,119\,137)\*255:between(clip(val\,123\,133)\,124\,132)\*255:between(clip(val\,123\,133)\,124\,132)\*255

between や clip の使い方
ffmpeg で使える計算書式

コメントを残す

メールアドレスが公開されることはありません。