由于lenscorrection过滤器,似乎可以使用ffmpeg补偿鱼眼失真:
ffmpeg -i in.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-.25:k2=-.25" out.mp4
和 有什么价值k1
,k2
特别是对于 gopro?有没有办法计算它们?
由于lenscorrection过滤器,似乎可以使用ffmpeg补偿鱼眼失真:
ffmpeg -i in.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-.25:k2=-.25" out.mp4
和 有什么价值k1
,k2
特别是对于 gopro?有没有办法计算它们?
我认为没有一个通用的设置可以涵盖所有 GoPro 型号和镜头。还考虑到人们可以使用一些定制/替换镜片。
我希望有一个示例图像,其中包含您必须使用的内容,但没关系...
希望以下内容在某种程度上对您有用
检查此链接GoPro Hero 3 settings
(适用于其他型号)。要大致了解最佳值k1
和k2
值,您应该找到最接近图像分辨率的纵横比然后......
H. FOV deg
将与相除V. FOV deg
并将结果与 相乘Diag. FOV deg
。
示例:图片尺寸为 1920 x 1080:这使其成为 16:9 宽屏。
GoPro 3 设置:16 x 9 宽屏 ::
H fov
= 69.5 ||V fov
= 118.2 ||Diag
= 133.6
所以118.2 / 69.5 * 133.6 = 227.216 etc
因为k1
结果现在是整数 227
(去掉小数点)。
因为k2
该值0.022
似乎是通用的(所有测试图像),所以您可以尝试k2=-.022
.
cx
并将它们保留为cy
: cx=0.5:cy=0.5:
。
例子:
ffmpeg -i in.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-0.227:k2=-0.022" out.mp4
结果:(通过GoPro Hero-2 视频的Google 图片找到的原始图片)。
FFmpeg 有一个lenscorrection
过滤器,可用于校正视频中的径向失真。也就是说,如果没有更多背景信息(例如相机的型号和设置),就很难提供更多信息。我怀疑无论如何这都需要一些反复试验。
PS:你试过在WINE下运行相机软件吗?它的某些版本显然预定义了这种校正过滤器并且易于访问。
对于 GoPro 3+,16:9 与 FOV Wide
ffmpeg -i input.mp4 -vf "lenscorrection=0.5:0.5:-0.335:0.097" output.mp4
我写了一篇关于使用 ffmpeg 校正失真的各种方法的帖子——我认为lensfun
orv360
过滤器是比 lenscorrection 过滤器更好的选择。
也就是说,理论上您应该能够使用 OpenCV- calibrateCamera函数计算 k1 和 k2 的值。您可能希望使用标志CALIB_FIX_PRINCIPAL_POINT
(以及将主要点固定在图像中心的坐标,如镜头校正所假定的那样)、CALIB_FIX_K3
(因为镜头校正不使用k3
)和CALIB_FIX_S1_S2_S3_S4
(因为镜头校正不考虑切向失真)。有可用的示例代码,您可以简单地修改来执行此操作。
然而,当我尝试时,我被卡住了,因为我找不到在 OpenCV 中固定焦距的方法,但在镜头校正中,焦距被硬编码为图像对角线的一半。