タグ別アーカイブ: alpha_channel

4:3を16:9に、16:9を4:3に余白と透過をつける

前回記事は余白だけをつけたが今回はその余白の部分だけ透過させる。映像の部分的に透過させるには geq フィルタを使う。アルファチャンネルをプレビューするには alphaextract フィルタを使う。

640×360の16:9映像を上下に白枠と透過を付けて4:3にする。出力解像度は 640×480
ffplay -f lavfi -i color=s=640x360 -vf format=yuva420p,pad=iw:iw*3/4:0:(oh-ih)/2:white,geq='p(X,Y):a=(between(X,0,W)*between(Y,H/8,7*H/8))*255'
640×480の4:3映像を左右に白枠と透過を付けて16:9にする。出力解像度は 852×480
ffplay -f lavfi -i color=s=640x480 -vf format=yuva420p,pad=ih*16/9:ih:(ow-iw)/2:0:white,geq='p(X,Y):a=(between(X,W/8,7*W/8)*between(Y,0,H))*255'

ドラクエの戦闘シーンチェンジエフェクトを作る

ニコニコ動画に投稿された「DQエンカウント風AviUtlシーンチェンジ用素材 sm30578410」を元に ffmpeg でも同じことを実装する。配布されたファイルは 8bit PNG なのでそれを使い、グラデーションマスクを作成し2入力を合わせる方法をとる。サンプルコマンドの出力コーデックは適宜変える。input1.mp4 と input2.mp4 は 640×360 30000/1001 fps の動画である。それに伴って。color ソースもそれに統一する。シーンチェンジは input1.mp4 から input2.mp4 の順番に切り替わるのがドラクエの戦闘シーンチェンジエフェクトになる。
続きを読む ドラクエの戦闘シーンチェンジエフェクトを作る

数式で線や円、模様が描ける geq

ffmpeg のフィルタの中でおそらく最も使い方が難解な geq(generic equation) フィルタの使い方。YUV と RGB、A のそれぞれを設定により色を変えたり、回転・反転させたり、グラデーションや線、円や矩形も描ける。さらにマスクも作れるのでトランジションへの応用もできるが処理速度はかなり遅い。その書き方はすべて縦横の座標とその値を 評価式 で計算する。
続きを読む 数式で線や円、模様が描ける geq

2つの映像のヒストグラムをうまく揃えるように調整する midequalizer

ffmpeg 3.3 から追加予定のフィルタ。2つの映像を入力して2つ目の映像のヒストグラムを1つ目の映像にうまく揃える midequalizer フィルタの使い方。高ビット深度対応の YUV, GBRP, GRAY, アルファ に対応している。同じ場面を映している2台のカメラ、例えばステレオカメラで、映像の明るさを揃えるのに使う。

基本コマンド

ffmpeg -i input1 -i input2 -filter_complex midequalizer=15 output

公式ドキュメント:FFmpeg Filters Documentation : midequalizer

オプション

planes[int]
フィルタを当てるチャンネル指定
詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
既定値:15(すべてのチャンネル)
範囲:0 から 15 まで

閾値の指定で2つのフィルタを使い分けやすくする threshold

ffmpeg 3.3 から追加予定のフィルタ。4つの映像を入力して、1、2入力の比較で3、4入力を使い分けて1出力する threshold フィルタの使い方。高ビット深度対応の YUV, GBRP, GRAY, アルファ に対応している。2つのフィルタを使い分けたり、白黒2色のマスクが手軽に設定できる。

具体的に説明すると1入力と2入力を比較して、1 < = 2 の部分に4入力が、2 < 1 部分に3入力が割り当てられる。planes 指定でフィルタを当てなければ1入力がそのまま出力される。planes 指定でフィルタを当てても1映像のまま出力する場合でも映像が変わらなければ負荷は変わらない。
続きを読む 閾値の指定で2つのフィルタを使い分けやすくする threshold

フェードイン、フェードアウトの設定ができる fade

フェードするチャンネルにアルファチャンネルあるなしで用途が異なる fade フィルタの使い方。アルファチャンネルがない場合のフェードインは指定色から元映像にフェードし、フェードアウトは元映像から指定色にフェードする。アルファチャンネルがあればクロスフェードのように2映像をきれいにつなげることができる。そのほかにアルファチャンネルの濃度の変化をマスクとして利用し、別のフィルタの濃度変化にも使える。

基本コマンド

元映像から始まり開始2秒から白に1秒間でフェードインする
ffplay -f lavfi -i testsrc,fade=t=out:st=1:d=2:c=white

赤から始まり開始2秒から元映像に1秒間でフェードアウトする
ffplay -f lavfi -i testsrc,fade=t=in:st=1:d=2:c=0xff0000
続きを読む フェードイン、フェードアウトの設定ができる fade

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

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

前後フレームの差分をブレンドする tblend
マスクして2入力を合わせる maskedmerge
続きを読む 前後フレームの差分で動いた部分だけマスクする モーションマスク

前後フレームの差分をブレンドする tblend

1入力から前後フレームを読み込んでそれぞれを計算する tblend(time blend)フィルタの使い方。オプションは blend フィルタと同じ。

YUV RGB を比較計算する blend

条件を指定するのに使う
ffmpeg で使える計算書式
続きを読む 前後フレームの差分をブレンドする tblend

エッジ検出フィルタ sobel, prewitt

ffmpeg 3.2 でリリース予定のビデオフィルタ。エッジ検出フィルタに単体では edgedetectfrei0rsobel があり、カーネルを指定する convolution でもエッジ検出ができるが、今回のこれらのフィルタは edgedetect よりもエッジ部分の線が太く convolution よりも手軽なのでマスクするのにも便利。sobelprewittroberts はカーネルが少し異なるがオプションは同じである。

ffmpeg でエッジ検出をする edgedetect
エッジ検出フィルタ roberts
ffmpeg で使える frei0r フィルタの使い方
先鋭化やぼかし、エンボス処理などができる convolution
ffmpeg でエッジマスク

基本コマンド

既定値のオプションを当てる
ffmpeg -i input -vf sobel=planes=15:scale=1:delta=0 output
ffmpeg -i input -vf sobel=15:1:0 output
ffplay -i input -vf sobel=15:1:0

公式ドキュメント:FFmpeg Filters Documentation : sobel
公式ドキュメント:FFmpeg Filters Documentation : prewitt
続きを読む エッジ検出フィルタ sobel, prewitt