前後フレームの 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 で使える計算書式