如何使用 ffmpeg 去扭曲 180 度或 360 度鱼眼视频?

How to de-warp 180 degree or 360 degree fisheye video with ffmpeg?

假设我有来自具有 180 度或 360 度鱼眼镜头的 IP 摄像机的视频,我想以某种方式对图像进行扭曲变形。理想情况下,我可以 select 输入图像的某个矩形区域并将其反扭曲为 "normal" 外观的输出视频,但将视频反扭曲为某种 Equirectangular 或 Equi 也是可以接受的-Angular 立方体贴图投影。输入视频看起来像这样

我知道有两个过滤器可用于此

  1. lenscorrect 滤镜 - 我认为这是正确的路线,但我能找到的所有使用此滤镜的示例仅适用于 "minor" 鱼眼镜头,我对于带有 360 度鱼眼镜头的视频,似乎无法使它正常工作,它根本没有足够的去扭曲。

  2. v360 过滤器。我认为这一定是正确的过滤器,但它似乎适用于 360 度视频而不是 360 度鱼眼镜头?我不知道有什么区别,但我无法让它发挥作用。当我尝试获取我的输入视频并通过等距柱状投影对其进行映射时,我得到了一些像这样的奇怪输出

我已经尝试了十几种不同的参数组合,但其中 none 似乎给了我想要的输出,这是一个反扭曲图像。有人可以帮助我使用过滤器图形参数来使用这个过滤器吗?

有什么我想念的吗?这些过滤器中的任何一个都是正确的前进方向吗?

编辑 -

我一直在试验 v360 过滤器,我想我已经接近了。我想做的是将一个 fisheye 输入映射到一个等距柱状输出,所以我试过这个

ffmpeg -i input.mp4 -vf v360=fisheye:equirect:id_fov=360 output.mp4

这应该意味着我的输入是一个具有 360 度对角线视野的鱼眼镜头,我希望我的输出是一个等距柱状投影,但这就是我得到的

ffmpeg -i input.mp4 -vf v360=fisheye:equirect:ih_fov=360:iv_fov=360 output.mp4

对角线 FOV 与水平或垂直 FOV 不同。 并且您的相机具有 360 度的水平和垂直 FOV。

使用 FFMPEG,正确的命令行是可能(见下面的注释)是这样的:

ffmpeg -i input_file -vf v360=fisheye:equirect:id_fov=180 output_file

或:

ffmpeg -i input_file  -vf v360=input=fisheye:id_fov=180:output=equirect:pitch=-90 -y output_file

无论文件是图片还是视频。

发生这种情况是因为世界上没有相机可以拥有 360x360 的 FOV,为此您需要两个相机; 360 是覆盖 zenith/nadir 周围的方位角,但相机不向后看,因此 FOV 仅为 180(尽管我有相机和 phone 的鱼眼插件,可以将 FOV 提高到235°).

您的命令行错误:

  • 使用 id_fov 代替 ih_fov 和 iv_fov,并使用 360 值,您实际上指定 horizontal/vertical FOV = 254°,因为“id_fov”是 DIAGONAL fov (360/SQR(2) = 254)

  • 你的相机可能有 180°horizontal/vertical FOV,而不是 360°

FFMPEG 结果使用 id_fov=360:

使用 ih_fov=254:iv_fov=254:

(同上)

使用 ih_fov=180:iv_fov=180:

这些结果中可能 none 是正确的:您应该尝试确定相机的真实 horizontal/vertical FOV,并将其用于 ih_fov 和 iv_fov.

转换为等距柱状后,您可以在此处上传图片进行查看:

https://spano.pyrik.dev/

要在 Google Cardboard 等 VR 查看器中查看它们,您需要添加一些 EXIF 数据,如 this scripts 中所做的那样。


XDV360,我的“全景相机”附带的应用程序,允许将鱼眼转换为等距柱状(视频和图像);它仅限于向上(天顶)或向下(最低点)的相机,但你的情况属于这个限制,所以没关系。你可以在网上找到Android版,PC版在这里:

https://windowsdraw.altervista.org/XDV360_201672719.zip