Equirectangular to Cubic 点到点映射?

Posted

技术标签:

【中文标题】Equirectangular to Cubic 点到点映射?【英文标题】:Equirectangular to Cubic with point to point mapping? 【发布时间】:2015-06-08 03:29:34 【问题描述】:

我需要将 equirectangular 投影中的全景图转换为 6 个立方体面,然后再转换为球面投影并返回,但是我需要跟踪每个点在每个投影中的映射方式,例如

Equirectangular Point(x,y) 立方体面 Point (x, y) Sphere Point(x, y, z)

如何在 C++ 和 OpenCV 中实现这一点?

这些转换是必需的,因为我需要通过比较投影在球体上的两个全景图并排放置时关键点之间的角度来找出两个此类图像之间良好匹配的关键点。

这里是全景图:

【问题讨论】:

【参考方案1】:

已解决,下面是2d全景转3d球坐标的函数。

vector<int> getSphericalPoint3D(int x, int y, int cols, int rows)

    //introduce a radius to 
    static const int radius = 128;
    vector<int> point3D;
    // the center 
    double c_x = (double)cols / 2;
    double c_y = (double)rows / 2;

    double X = (((double)x - c_x) * CV_PI) / c_x;
    double Y = (((double)y - c_y) * CV_PI) / c_y;

    int x3D = round(radius * cos(X) * cos(Y)) + radius;
    int y3D = round(radius * cos(X) * sin(Y)) + radius;
    int z3D = round(radius * sin(X)) + radius;

    point3D =  x3D, y3D, z3D ;
    return point3D;

    这个想法是在 X 和 Y 轴上将 2d 像素从 -Pi 归一化到 Pi 使用以下关系获取球坐标

x = R * cos(x)cos(y) + R(加这个R是为了避免负值)

y = R * cos(x)sin(y) + R

z = R * sin(x) + R

类似的变换用于三次变换

【讨论】:

以上是关于Equirectangular to Cubic 点到点映射?的主要内容,如果未能解决你的问题,请参考以下文章

Haversine vs Equirectangular 逼近

Fisheye-Equirectangular 转换

统一录制 360° 视频不是 equirectangular

将 2:1 equirectangular 全景图转换为立方体贴图

尝试使用 Equirectangular Projection 将 2D 坐标转换为 3D 坐标。但失败了。我究竟做错了啥?

HDU-6216 A Cubic number and A Cubic Number[二分]