cubemap实现将全景图分割为立方体6个面的6副图像


实现将2:1全景图(矩形球面投影equirectangular)划分成即将要进行的cubemap所需要的6个纹理面,附件代码只是一个简单的划分例子,仅供入门参考,集成开发环境是vs2010,可以直接打开运行看效果。如果想实现更为复杂的功能,则需要在此基础上修改完善。
资源截图
代码片段和文件信息
#include 
#include 
#include 
#include 
#include //为了在一个窗口显示多幅图像而加的头文件
//#include “split.h“

using namespace cv;
using namespace std;


const float M_PI = 3.1415926;
// Define our six cube faces.
// 0 - 3 are side faces clockwise order
// 4 and 5 are top and bottom respectively
float faceTransform[6][2] =
{
{0 0}
{M_PI / 2 0}
{M_PI 0}
{-M_PI / 2 0}
{0 -M_PI / 2}
{0 M_PI / 2}
};

// Map a part of the equirectangular panorama (in) to a cube face
// (face). The ID of the face is given by faceId. The desired
// width and height are given by width and height.
inline void createCubeMapFace(const Mat &in Mat &face int faceId = 0 const int width = -1 const int height = -1)
{

float inWidth = in.cols;
float inHeight = in.rows;

// Allocate map
Mat mapx(width height CV_32F);//(in.size() CV_32F);董帆修改了width和height的位置
Mat mapy(width height CV_32F);//(in.size() CV_32F);

// Calculate adjacent (ak) and opposite (an) of the
// triangle that is spanned from the sphere center
//to our cube face.
const float an = sin(M_PI / 4);
const float ak = cos(M_PI / 4);

const float ftu = faceTransform[faceId][0];
const float ftv = faceTransform[faceId][1];

// For each point in the target image
// calculate the corresponding source coordinates.对目标图像的每个点计算相应的源坐标系
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {

// Map face pixel coordinates to [-1 1] on plane
float nx = (float)y / (float)height - 0.5f;
float ny = (float)x / (float)width - 0.5f;

nx *= 2;
ny *= 2;

// Map [-1 1] plane coords to [-an an]
// thats the coordinates in respect to a unit sphere
// that contains our box.
nx *= an;
ny *= an;

float u v;

// Project from plane to sphere surface.
if(ftv == 0) {
// Center faces
u = atan2(nx ak);
v = atan2(ny * cos(u) ak);
u += ftu;
} else if(ftv > 0) {
// Bottom face
float d = sqrt(nx * nx + ny * ny);
v = M_PI / 2 - atan2(d ak);
u = atan2(ny nx);
} else {
// Top face
float d = sqrt(nx * nx + ny * ny);
v = -M_PI / 2 + atan2(d ak);
u = atan2(-ny nx);
}

// Map from angular coordinates to [-1 1] respectively.
u = u / (M_PI);
v = v / (M_PI / 2);

// Warp around if our coordinates are out of bounds.
while (v < -1) {
v += 2;
u += 1;
}
while (v > 1) {
v -= 2;
u += 1;
}

while(u < -1) {
u += 2;
}
while(u > 1) {
u -= 2;
}

// Map from [-1 1] to in texture space
u = u / 2.0f + 0.5f;
v = v / 2.0f + 0.5f;

u = u * (inWidth - 1);
v = v * (inHeight - 1);

// Save the result for this pixel in map
mapx.at(x y) = u;
mapy.at(x y) = v;
}
}

// Recreate output image if it has wrong size or type.
i

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      87552  2016-11-18 15:26  OpencvTest00DebugOpencvTest.exe

     文件    1031696  2016-11-18 15:26  OpencvTest00DebugOpencvTest.ilk

     文件    1321984  2016-11-18 15:26  OpencvTest00DebugOpencvTest.pdb

     文件   73793536  2016-11-18 15:25  OpencvTest00ipchopencvtest-1b3049e4opencvtest-296a8017.ipch

     文件     164249  2016-07-10 06:46  OpencvTest00OpencvTestitmap360.jpg

     文件        682  2016-11-18 15:26  OpencvTest00OpencvTestDebugcl.command.1.tlog

     文件      26462  2016-11-18 15:26  OpencvTest00OpencvTestDebugCL.read.1.tlog

     文件        372  2016-11-18 15:26  OpencvTest00OpencvTestDebugCL.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink-cvtres.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink-cvtres.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.4068-cvtres.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.4068-cvtres.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.4068.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.4068.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6240-cvtres.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6240-cvtres.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6240.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6240.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6752-cvtres.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6752-cvtres.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6752.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6752.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6928-cvtres.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6928-cvtres.write.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6928.read.1.tlog

     文件          2  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.6928.write.1.tlog

     文件       2126  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.command.1.tlog

     文件       4904  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.read.1.tlog

     文件        798  2016-11-18 15:26  OpencvTest00OpencvTestDebuglink.write.1.tlog

     文件        406  2016-11-18 15:26  OpencvTest00OpencvTestDebugmt.command.1.tlog

............此处省略34个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)