斜めから撮った写真や動画をまっすぐから見たように修正する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 が紹介されていたがこれを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。

crop、perspective フィルタの出力例

解説すると修正する対象の4隅の座標を画像編集ツールなどで調べる必要がある。それぞれの座標は左上から順番に 118×99, 595×127, 228×1088, 614×893 となる。修正する部分だけを出力するには最初に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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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