由于我对投影和旋转矩阵的数学理解(几乎为零),我目前坚持使用 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 vectorv2
。计算具有角度 x、y 和 z 的旋转矩阵
R
(查看公式 here )。对该矩阵进行转置,得到从新图像到旧图像的逆旋转。我们将这个逆旋转矩阵命名为Rt
。计算
v1 = Rt * v2
。然后计算v1
的纬度lat1
和经度lon1
。在坐标
i1 = image.height * lat1/180
和j1 = image.width * lon1/360
处找到原始图像中的颜色。这可能不是整数坐标。您可能必须在几个像素之间进行插值才能获得您的值(value)。这是新图像中(i2, j2)
位置像素的颜色。
您需要了解如何在球体上的 3D vector 及其纬度和经度角度之间进行转换,但这应该不难找到。此处描述的算法应该很容易实现。
如果我有任何错误,请告诉我,因为我还没有亲自测试过。
关于c++ - OpenCV 等角旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47536782/