我使用的是正确的 undistort 例程吗?照片是广角还是鱼眼?

Am I using the correct undistort routine? Is photo wide-angle or fisheye?

我正在尝试不失真的图像。我有下面的图像,使用 undistort 函数有结果。鱼眼模块不起作用。这是因为我的图像不是鱼眼而是广角吗?在任何一种情况下,如何减少透视失真?

仅供参考,我丢失了这个镜头的规格,但从校准程序中获得了它的内在特性。

输入图片: 输出图像

图像似乎只是广角,而不是鱼眼。鱼眼相机拍摄的图像通常有黑色的圆圈边框,看起来就像是从一个圆孔里看到的一样。见下图c)(来自OpenCV doc):

区分广角和鱼眼的一般方法是看FOV角度。

给定相机内在参数(cameraMatrix 和 distCoeffs,来自校准例程),您可以通过调用 getOptimalNewCameraMatrix() 计算出具有最大 FOV 且无失真的新相机内在矩阵。则x方向的FOV角(通常大于y方向)为arctan(cx/fx)+arctan((width-cx)/fx),其中fx为x方向的焦距,cx为x方向的坐标主点,width是图像宽度。

根据我的经验,当FOV<80°时,应该使用布朗畸变模型(k1, k2, k3, p1, p2)。当80°

Fisheye 模型在非常大的 FOV 情况下比 Rational 模型表现更好,因为它具有更高阶的径向参数。但是当FOV角度不是很大的时候,Rational模型是更好的选择,因为它有切线参数。

你提供的无失真图片看起来还不错。但如果你更关心精度,你应该在校准中检查重投影误差、对极误差(多相机),甚至关键点(棋盘角、圆形质心或任何取决于你的校准模式的特征)的共线误差程序。