【问题标题】:OpenCV Equirectangular RotationOpenCV Equirectangular 旋转
【发布时间】:2017-11-28 16:46:33
【问题描述】:

由于我对投影和旋转矩阵的数学理解(几乎为零),我目前坚持使用 OpenCV 在 360° 图像上实现等角旋转。

这种轮换的结果将与您在此处看到的完全相同:https://www.youtube.com/watch?v=l1N0lEKIeLA

我在这里找到了一些代码:https://github.com/FoxelSA/libgnomonic/wiki/Equirectangular-rotation_v0.1 但我没有成功将它应用到 opencv

如果有人知道如何将其应用于 OpenCV Mat 和 Pitch、Yaw、Roll 角度,我们将不胜感激!

谢谢!

【问题讨论】:

  • 到目前为止做了什么? (这不是要求别人为你编码,是吗?)
  • 这是一个棘手的问题。我认为这有点类似于询问如何在 OpenCV 中过滤颜色(多种解决方案,但有内置函数)。我希望有人能指出我已经忽略的 OpenCV 的某些功能已经做到了这一点,或者如何调整 OpenCV 来执行此任务。

标签: c++ opencv map-projections rotational-matrices


【解决方案1】:

这里不讨论偏航、俯仰和滚动,而是讨论欧拉角 x、y 和 z。

要执行 equirectangular 映射的旋转,您可以按照以下步骤操作:

  • 在结果图像中考虑坐标(i2, j2)。我们将尝试找到在此处放置的颜色。这些坐标对应于球体上纬度lat2 = 180 * i2 / image.height 和经度lon2 = 360 * j2 / image.width 的点。计算对应的3D向量v2

  • 用角度 x、y 和 z 计算旋转矩阵 R(查看公式 here)。对该矩阵进行转置以获得从新图像到旧图像的反向旋转。我们将这个逆旋转矩阵命名为Rt

  • 计算v1 = Rt * v2。然后计算v1的纬度lat1和经度lon1

  • 在坐标i1 = image.height * lat1 / 180j1 = image.width * lon1 / 360 处查找原始图像中的颜色。这可能不是整数坐标。您可能必须在几个像素之间进行插值才能获得您的值。这是新图像中(i2, j2) 位置像素的颜色。

您需要了解如何在球体上的 3D 矢量及其纬度和经度角之间进行转换,但这应该不难找到。这里描述的算法应该很容易实现。

如果我犯了任何错误,请告诉我,因为我自己没有测试过。

【讨论】:

  • 这很好,但我主要是希望 OpenCV 具有专门用于执行部分(或全部)这些步骤的功能。将旋转矩阵应用于原始图像以获取旋转图像似乎是 OpenCV 中可能已经可用的(复杂)操作,但到目前为止我还没有在文档中找到任何内容。话虽如此,感谢您概述了整个过程和所涉及的坐标转换。如果没有任何 OpenCV 算法,这个答案应该非常适合我自己编写。
  • @TaviKohn 我认为您不会在 OpenCV 中找到现成的解决方案。但是,它确实有一些工具可以让您更方便地实现自己的算法:矩阵乘积已经存在,remap 函数可以让您避免自己插值像素的繁琐任务。
  • 太棒了!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2020-03-17
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多