c++ - OpenCV 等角旋转

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

由于我对投影和旋转矩阵的数学理解(几乎为零),我目前坚持使用 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 角度,将不胜感激!

谢谢!

最佳答案

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

要执行等距柱状映射的旋转,您可以遵循以下过程:

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

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

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

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

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

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

关于c++ - OpenCV 等角旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47536782/

相关文章:

c++ - Windows:构建同一 DLL 的 32 位和 64 位版本

c++ - opencv ubuntu 12.04 Cmake错误: Source directory does not appear to contain CmakeLists. txt

python - 使用 pyproj 投影 NumPy 坐标数组

javascript - OpenLayers - 获取几何投影

c++ - 使用 ReadFile 对内存位置的访问无效

c++ - 为什么在同一个类上使用不同的(shared_ptr 和普通)指针构造函数会得到不同的结果?

c++ - clang 3.1 看不到 unique_ptr?

c++ - "operations.hpp"中的 OpenCV 2.4.2 编译问题

java - 是否可以通过 Java 在 Android 中进行全景图像拼接?

javascript - 使用 D3 更改 shapefile 投影以进行可视化