斜めから撮った写真や動画をまっすぐから見たように修正するperspective
フィルタの使い方。修正部分だけを取り出すにはcrop
フィルタを併用する。crop
フィルタを併用しないと出力解像度が元の解像度のままになりアスペクト比がおかしくなる。
基本コマンド
既定値のコマンドだと何も変化しない。
ffmpeg -i nput -vf perspective=x0=0:y0=0:x1=W:y1=0:x2=0:y2=H:x3=W:y3=H:interpolation=linear:sense=source:eval=int ouput
ffmpeg -i input -vf perspective=0:0:W:0:0:H:W:H:0:0:0 ouput
ffplay -i input -vf perspective=0:0:W:0:0:H:W:H:0:0:0
台形の例。
ffplay -f lavfi -i testsrc -vf pad="iw+4:ih+4:2:2:0x000000",perspective=x0=W/4:y0=H/4:x1=3*W/4:y1=H/4:sense=destination
公式ドキュメント:FFmpeg Filters Documentation : perspective
オプション
- x0, y0, x1, y1, x2, y2, x3, y3[string]
左から順番に左上(0)、右上(1)、左下(2)、右下(3)の横(x)と縦(y)の座標指定。sense=sourceのとき。評価式が使える - x0:プラスにすると左に引き延ばされ、マイナスにすると右に縮む
- y0:プラスにすると上に引き延ばされ、マイナスにすると下に縮む
- x1:wより大きくすると縮み、小さくすると引き延ばされる。x1, x3を同じ値で、y1, y3の値を同じにすると真横に伸び縮みする
- y1:プラスにすると引き延ばされ、マイナスにすると縮む
- x2:プラスにすると引き延ばされ、マイナスにすると縮む。y2, y3を同じ値で、y2, y3の値を同じにすると上下に伸び縮みする
- y2:Hより大きくすると縮み、小さくすると引き延ばされる
- x3:Wより大きくすると縮み、小さくすると引き延ばされる。x1, x3を同じ値にすると横に伸び縮みする
- y3:Hより大きくすると縮み、小さくすると引き延ばされる。y2, y3を同じ値にすると縦に伸び縮みする
- interpolation[int] 補間方法
- 0, linear:既定値
- 1, cubic
- sense[int] 補間方法の調整
- 0, source:指定した座標の枠内を修正。既定値
- 1, destination:画面全体を指定した座標の枠内に修正して枠外で補間。引っ張る方向が0, sourceと逆で数値と引っ張る方向が同じになり直感的にわかりやすい
- eval[int] 座標の評価式の設定
- 0, init:入力した時点で固定。既定値
- 1, frame:フレーム毎に評価する。in, on で使う
x0, y0, x1, y1, x2, y2, x3, y3に以下の評価式が使える
- W
入力フレームの横幅 - H
入力フレームの縦幅 - in
入力フレーム数。on と同じ結果になる
フィルタを適応した時点で 1 から 1 ずつ増える整数を返す - on
出力フレーム数。in と同じ結果になる
コマンド解説
GIMPの事フリーソフトや思って舐めてた、すごいなこれ…
遠近法ツール>逆変換からパースに沿って四隅選択するだけで正面画に変換されよる pic.twitter.com/dU0XOdWiBN— はとむぎもこもこ (@htmg_mokomoko) July 6, 2016
で GIMP が紹介されていたがこれをffmpegで行う。
ffmpeg -i "Cmq2kPgVUAQFwEe.jpg" -vf crop=614-118:1088-99:118:99,perspective=0:0:595-118:127-99:228-118:1088-99:614-118:893-99 perspective.jpg
読みやすくした物。コメントが入っているので以下のコマンドでは実行できない。
-vf crop=614-118:1088-99:118:99,118:99は出力解像度を決める左上の座標 perspective=0:0:左上の座標:x0:y0 595-118:127-99:右上の座標:x1:y1 228-118:1088-99:左下の座標:x2:y2 614-118:893-99右下の座標:x3:y3
計算結果。
-vf crop=496:989:118:99, perspective=0:0:左上の座標:x0:y0 477:28:右上の座標:x1:y1 110:989:左下の座標:x2:y2 496:794右下の座標:x3:y3
W, Hで読み替えると。
-vf crop=496:989:118:99, perspective=0:0:左上の座標:x0:y0 W-19:28:右上の座標:x1:y1 110:H:左下の座標:x2:y2 W:H-194右下の座標:x3:y3
オリジナルの画像の4隅の座標118×99、595×127、228×1088, 614×893。
解説すると修正する対象の4隅の座標を画像編集ツールなどで調べる必要がある。それぞれの座標は左上から順番に 118×99, 595×127, 228×1088, 614×893 となる。修正する部分だけを出力するには最初にcrop
フィルタで対象部分を切り取る。1、2引数が出力解像度。3、4引数が左からの座標指定。つまり1引数は右幅と左幅を引いて出力の横幅を計算し、同様に縦幅も計算している。次に3、4引数は左上の座標を指定して左上から出力解像度だけ切り取る。
次にperspective
フィルタでは、左上が 0x0 の位置になりそこから右上、左下、右下の座標は左上の座標が 0x0 になった分だけずらすことになる。そして出力ファイルを指定する。
ffmpeg -i Cmq2kPgVUAQFwEe.jpg -vf crop=614-118:1088-99:118:99,perspective=0:0:595-118:127-99:228-118:1088-99:614-118:893-99:1:1 perspective-destination.jpg
ffmpeg -i Cmq2kPgVUAQFwEe.jpg -vf perspective=118:99:595:127:228:1088:614:893:1:1 no-crop-perspective-destination.jpg
ffmpeg -i Cmq2kPgVUAQFwEe.jpg -vf perspective=118:99:595:127:228:1088:614:893:1:1,crop=614-118:1088-99:118:99 perspective-destination-crop.jpg