【问题标题】:Am I using the correct undistort routine? Is photo wide-angle or fisheye?我是否使用了正确的不失真例程?照片是广角还是鱼眼?
【发布时间】:2021-11-23 20:19:18
【问题描述】:

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

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

输入图像: 输出图像

【问题讨论】:

  • 那个镜头看起来严重失焦,曝光不足。我怀疑有人能说出图片中的内容。
  • 这些是带通滤波的~835nm + 并且针对红外跟踪进行了优化。我感兴趣的边缘看起来很清楚。我可以看到顶部是弯曲的边缘,底部是直的。关键点未显示。如果您需要其他内容来回答这个问题,请告诉我。
  • 我还会发布一张照明更好的新图片。
  • 在#3下方上传了更好的照明。谢谢
  • 啊,红外线。好的。所以最新的图片,没有失真,对我来说看起来相当直接,没有用尺子或任何东西检查。 OpenCV 的“鱼眼”也只是 =180 是“超级鱼眼”,还没有在 opencv 中),但与 FoV 范围为 60- 的“常规”镜头相比,这些镜头的方程更合适90度

标签: c++ opencv fisheye


【解决方案1】:

图像看起来只是广角,而不是鱼眼。鱼眼相机的图像通常有黑色的圆圈边框,它们看起来像是透过一个圆孔看到的。见下图 c)(来自OpenCV doc):

区分广角和鱼眼的常规方法是检查FOV角度。

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

根据我的经验,当 FOV

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

您提供的未失真图片看起来相当不错。但是如果你更关心精度,你应该在校准时检查重投影误差、极线误差(多相机),甚至关键点的准线误差(棋盘角、圆心或任何取决于你的校准图案的特征)过程。

【讨论】:

  • 我希望你不介意我在这里问,但你的回答很有趣,它可能会回答我也有的问题。所以如果我想从相机矩阵和OpenCV校准返回的畸变系数中找出FOV,我需要在使用arctan公式之前使用getOptimalNewCameraMatrix()吗?
  • 你有解释arctan(cx/fx)+arctan((width-cx)/fx)公式的来源吗?
  • @Otter_warrior getOptimalNewCameraMatrix() 的焦距通常小于原始相机矩阵中的焦距(即使alpha 设置为 0),因此它会给你更大的 FOV。我觉得这样算出来的FOV更接近镜头的真实值。
  • @Otter_warrior 抱歉,我没有解释这个公式的来源。通常的公式是2*arctan(width*0.5/fx),但我认为考虑cx会更准确。
  • @Otter_warrior 我上面描述的FOV更接近镜头的物理值。但在实际应用中,这取决于如何使图像不失真,即initUndistortRectifyMap() 中的newCameraMatrix
猜你喜欢
  • 1970-01-01
  • 2020-06-29
  • 2011-01-29
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多