ffmpeg で魚眼レンズをアンラップしてオーバーラップするにはどうすればよいですか?

ffmpeg で魚眼レンズをアンラップしてオーバーラップするにはどうすればよいですか?

私は insta 360 x3 を使用しており、Linux 上でスタジオ ツールを使用せずにビデオのエクスポートを自動化したいと考えています。

以下はカメラのビデオ形式のスクリーンショットです (Insta360 x3 カメラのスクリーンショット):

Insta360 x3 カメラのスクリーンショット


私は以下のコマンドでffmpegを使用してビデオフィードをアンラップしています:(このstackoverflowの回答から引用

ffmpeg -y -i input.lrv -vf v360=dfisheye:e:yaw=-90 -c:v libx265 -b:v 40000k -bufsize 5000k -preset ultrafast -c:a copy -t 10 test.mkv

コマンドは機能し、適切に機能しますが、レンズの 1 つに、輪郭がぼやけた広い視野があります。この結果、次の画像が生成されます。

ffmpeg コマンド実行後の Insta360 x3 カメラのスクリーンショットの画像: ffmpeg コマンド後の Insta360 x3 カメラのスクリーンショットの画像


ffmpeg コマンドを変更して、両方のレンズを数ピクセル重ねてぼやけを除去したり、重なり合った視野を切り取ったりする方法はありますか?

答え1

使用しているコマンドはデフォルトのパラメータを使用します。つまり、カメラの FOV が 180 で、完全に水平であると想定しています。

いくつかの実験を行った後このサイト実際の FOV は 193° であることがわかりましたが、それだけでは十分ではありません。もちろん、カメラを完全に水平に保持することは不可能なので、ピッチとロールを補正する必要があります。

私が受け取った最終的なコマンドは次のとおりです。

ffmpeg -i dfisheye.jpg -filter_complex "[0:v]v360=input=dfisheye:output=equirect:pitch=-22:roll=-20:ih_fov=193:iv_fov=193[out_v]" -map "[out_v]" out.gif

または、構文を使用して:

ffmpeg -y -i input.lrv -vf v360=dfisheye:e:pitch=-22:roll=-20:ih_fov=193:iv_fov=193 -c:v libx265 -b:v 40000k -bufsize 5000k -preset ultrafast -c:a copy -t 10 test.mkv

取得した画像は次のとおりです。

ここに画像の説明を入力してください

混乱しないように注意してください翻訳フォフそしてiv_fovフォフ

カメラに適した FOV が見つかると、すべての写真でその FOV は同じになりますが、PICTH と ROLL は写真ごとに異なることに注意してください。完全に水平の写真は次のようなグリッドに収まることを考慮してください。

正距円筒図法

ピッチとロールを補正していない画像:

生

答え2

このスクリプトは、レンズの周辺減光によるステッチ エッジの暗さを修正しません。出力ファイルをNEW.mp4写真拡張子に変更してもNEW.jpg、削除せずに写真が渡されることはありませんlibx264 -preset ultrafast

値 H はビデオの高さです。入力ビデオの高さに設定する必要があります。FOV はカメラの FOV に設定する必要があります。

C 値は、2 つの画像が重なり合う部分のブレンドのピクセル数です。

@echo off

REM split the input and pitch one to level them - hstack the two streams to the output

set "FOV=189.1"       :: Horizontal and vertical field of view of the fisheye lenses in degrees, normal 189.1
set "H=1920"    ::Height of video
set "C=2"   :: Width of interpolation band in degrees, must be smaller or equal than (FOV-180 ), normal is 2
set "RL=0"  ::Roll (neg cockwise/counter clockwise pos) angle to change perspective in Left Equirectangular image
set "PL=0"  ::Pitch (pos down/up neg) angle degrees to boundary to change perspective in Left Equirectangular image
set "YL=0"  ::Yaw (pos left/right neg) angle degrees to change perspective in Left Equirectangular image, normal is -1
set "RR=0"  ::Roll (neg cockwise/counter clockwise pos) angle to change perspective in Right Equirectangular imag, normal 1
set "PR=0"  ::Pitch (pos down/up neg) angle degrees to boundary to change perspective in Right Equirectangular image
set "YR=0"  ::Yaw (pos left/right neg) angle degrees to change perspective in Right Equirectangular image MUST NOT BE POSITIVE AS GREATER THAN 180 NOT POSSIBLE

REM  Create the mergemap file

ffmpeg -f lavfi -i nullsrc=size=%H%x%H% -vf "format=gray8,geq='clip(128-128/%C%*(180-%FOV%/(%H%/2)*hypot(X-%H%/2,Y-%H%/2)),0,255)',v360=input=fisheye:output=e:ih_fov=%FOV%:iv_fov=%FOV%" -frames:v 1 -y mergemap.png

REM Convert file Dual_Feye to equirectangular projection

ffmpeg -i %1 -i %FF%mergemap.png -lavfi "[0]format=rgb24,split[a][b];[a]crop=ih:iw/2:0:0,v360=input=fisheye:output=e:ih_fov=%FOV%:iv_fov=%FOV%:yaw=%YL%:pitch=%PL%:roll=%RL%[c];[b]crop=ih:iw/2:iw/2:0,v360=input=fisheye:output=e:yaw=180+%YR%:pitch=%PR%:roll=%RR%:ih_fov=%FOV%:iv_fov=%FOV%[d];[1]format=gbrp[e];[c][d][e]maskedmerge" -c:v libx264 -preset ultrafast -q:v 1 -y NEW.mp4

関連情報