通过点对点映射Equirectangular到Cubic?

时间:2015-06-08 03:29:34

标签: c++ image opencv projection panoramas

我需要将equirectangular投影中的全景转换为6个立方面,然后转换为球形投影和背面,但是我需要跟踪每个投影中每个点的映射方式,如

  

Equirectangular Point(x,y)< --->立方面点(x,y)< --->球体点(x,y,z)

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

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

以下是全景图:A 360 degree equirectangular image

1 个答案:

答案 0 :(得分:1)

解决了,下面是将2d Panoramic转换为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;
}
  1. 想法是将X和Y轴上的-Pi到Pi的2d像素标准化
  2. 使用以下关系获得球形坐标
  3. x = R * cos(x)cos(y)+ R(添加此R以避免负值)

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

    z = R * sin(x)+ R

    类似的转换用于Cubic转换