斜めから撮った写真や動画をまっすぐから見たように修正する 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

オプション

  • 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 が紹介されていたがこれを 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
crop, perspective フィルタの出力例
オリジナルの画像の4隅の座標 118X99, 595X127, 228X1088, 614X893

解説すると修正する対象の4隅の座標を画像編集ツールなどで調べる必要がある。それぞれの座標は左上から順番に 118X99, 595X127, 228X1088, 614X893 となる。修正する部分だけを出力するには最初に crop フィルタで対象部分を切り取る。1, 2 引数が出力解像度。3, 4 引数が左からの座標指定。つまり 1 引数は右幅と左幅を引いて出力の横幅を計算し、同様に縦幅も計算している。次に 3, 4 引数は左上の座標を指定して左上から出力解像度だけ切り取る。

次に perspective フィルタでは、左上が 0X0 の位置になりそこから右上、左下、右下の座標は左上の座標が 0X0 になった分だけずらすことになる。そして出力ファイルを指定する。

sense で destination を指定

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

crop を使わない

ffmpeg -i Cmq2kPgVUAQFwEe.jpg -vf perspective=118:99:595:127:228:1088:614:893:1:1 no-crop-perspective-destination.jpg

crop を最後に使う

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

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)