如何使用ffmpeg去除180度或360度鱼眼视频的畸变?

5

假设我有来自IP摄像机的视频,它具有180度或360度的鱼眼镜头,我想以某种方式去除图像畸变。理想情况下,我将能够选择输入图像的某个矩形区域,并将其去除畸变转换为“正常”外观的输出视频,但也可以将视频转换为某种等距柱面投影或等角立方体贴图投影。输入视频如下所示

enter image description here

我知道两种可能用于此的滤镜

  1. lenscorrect 滤镜 - 我认为这是正确的方法,但我找到的所有示例都仅适用于“轻微”的鱼眼镜头,而且我似乎无法将其正确地应用于具有360度鱼眼镜头的视频,它不能完全去畸变。

  2. v360 滤镜。我以为这必须是正确的滤镜,但似乎它是用于360度视频而不是360度鱼眼镜头?我不知道有什么区别,但我无法让它起作用。当我尝试将输入视频映射到等距投影时,输出结果很奇怪,像这样

enter image description here

我已经尝试了十几种不同的参数组合,但似乎没有一个能给我想要的输出,即单个去畸变图像。有人可以帮我使用过滤器图参数吗?
我是否遗漏了什么?这些滤镜中的任何一个是正确的方法吗?
编辑 -
我一直在尝试使用v360过滤器,并且我认为我已经接近了。我想要做的是将鱼眼输入映射到等距投影输出,因此我尝试了这个:
ffmpeg -i input.mp4 -vf v360=fisheye:equirect:id_fov=360 output.mp4
这应该意味着我的输入是一个具有360度对角视野的鱼眼镜头,我希望我的输出是等距投影,但这就是我得到的结果

enter image description here


你第一个输出的是立方体贴图,这是一种比普通的等距投影更有效处理 360 度全景图的方式。 - Brad
请在id_fov=360的位置使用ih_fov=180和iv_fov=180。但是,您将在等距圆柱投影结果中仍然会得到2个黑暗区域,因为它们代表了您的相机无法看到的世界的非可见半部分。 - jumpjack
我投票关闭此问题,因为根据ffmpeg标签的解释:只有关于FFmpeg库、API或工具的编程使用的问题才是相关的。关于命令行工具的交互使用的问题应该在https://superuser.com/或https://video.stackexchange.com/上提问。请删除此内容。 - Rob
2个回答

2

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

对角线视场角并不等同于水平或垂直视场角。而你的相机具有水平和垂直 360 度视场角。


这正是我寻找了几周的东西,但我的照片/视频/VR语言不是很好,再加上英语不是我的母语 - 这使得理解手册变得困难。所以谢谢!然而,我在手册中读到的是设置对角线FOV会重置H和V。供您参考。 - Leo
这是错误的,世界上没有任何一台相机可以拥有360x360的视场角,你需要两个相机才能实现! 360是围绕天顶/天底覆盖的方位角,但相机并不朝向后方,因此FOV只有180(尽管我有一台相机和一个鱼眼附件可将FOV提高到235°)。 因此,命令是ffmpeg -i input_file -vf v360=fisheye:equirect:id_fov=180 output_file(无论文件是图像还是视频) - jumpjack

0
使用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的视场角,你需要两个相机才能实现;360是围绕天顶/天底覆盖的方位,但相机并不会看向后面,因此视场角只有180度(尽管我有一个相机和一个鱼眼附件可将视场角提高到235°)。

您命令行中的错误:

  • 在id_fov中使用ih_fov和iv_fov,并使用360值,实际上指定了水平/垂直FOV = 254°,因为"id_fov"是对角线FOV(360/SQR(2) = 254)

  • 您的相机可能具有180°的水平/垂直FOV,而不是360°

使用id_fov=360的FFMPEG结果:

ID_FOV=360

使用 ih_fov=254:iv_fov=254:

ih_fov=254:iv_fov=254

使用 ih_fov=180:iv_fov=180:

ih_fov=180:iv_fov=180:

这些结果可能都不是正确的:您应该尝试识别相机的实际水平/垂直FOV,并将其用于ih_fov和iv_fov。

一旦转换为等距投影,您可以在此处上传图像以查看它们:

https://spano.pyrik.dev/

如果您想在VR查看器(如Google Cardboard)中查看它们,您需要添加一些EXIF数据,就像在这些脚本中所做的那样。


XDV360是一款随我的“panocamera”附带的应用程序,可以将鱼眼图像和视频转换为全景图像; 它仅限于朝上(天顶)或朝下(地面)的摄像机,但您的情况在此范围内,所以没问题。 您可以在网上找到Android版本,在这里下载PC版本:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接