由于lenscorrection过滤器,似乎可以使用ffmpeg补偿鱼眼失真:
ffmpeg -i in.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-.25:k2=-.25" out.mp4
k1
和k2
有什么价值,特别是对于gopro?
有没有办法计算它们?
答案 0 :(得分:14)
我认为没有一个通用的设置来涵盖所有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 images找到的原始图片)。
答案 1 :(得分:4)
FFmpeg有一个lenscorrection
滤镜,可用于纠正视频中的径向失真。也就是说,没有更多的上下文 - 例如相机的型号和设置 - 很难提供更多信息。我怀疑它无论如何都需要一些反复试验。
PS:您是否尝试在WINE下运行相机的软件?它的某些版本显然具有预定义且易于访问的这种校正滤波器。
答案 2 :(得分:2)
我写了a post,介绍了使用ffmpeg校正失真的各种方法-我认为lensfun
或v360
滤镜比镜头校正滤镜更好。
也就是说,从理论上讲,您应该能够使用OpenCV- calibrateCamera函数来计算k1和k2的值。您可能希望使用标志CALIB_FIX_PRINCIPAL_POINT
(连同镜头校正假设的坐标一起将主点固定在图像的中心),CALIB_FIX_K3
(因为镜头校正不使用k3
),和CALIB_FIX_S1_S2_S3_S4
(因为镜头校正不考虑切向失真)。有可用的示例代码,您可以简单地对其进行修改。
但是,当我尝试时,由于无法找到在OpenCV中固定焦距的方法而卡住了,但是在镜头校正中,焦距被硬编码为图像对角线的一半。
答案 3 :(得分:1)
答案 4 :(得分:1)
对于GoPro 3 +,16:9(具有FOV宽屏)
ffmpeg -i input.mp4 -vf "lenscorrection=0.5:0.5:-0.335:0.097" output.mp4
答案 5 :(得分:1)