360lib投影格式介绍(二) - 立方体贴图投影(CMP / ACP / EAC / SSP / TSP)
CubeMap Projection (CMP)
投影方式
在计算机图形学中,立方体投影是常用的环境映射方法之一,常用于游戏场景中的天空盒,相当于等距柱状投影的优化版,环境投影到立方体之后可分六个正方形纹理来存储;或者将立方体展开,存储于一个纹理中的六个区域内。
在全景图像及视频中,立方体投影将球形视频映射到它的外接立方体上,立方体的上下两个面分别对应两极区域,中间的四个面对应赤道区域, 如下图:
投影公式
同ERP类似,CMP也需要对二维采样点(m, n)进行一个变换得到uv平面上的点(u, v),变换公式如下:
其中,经纬度坐标系与三维笛卡尔坐标系转换公式如下:
⎧⎩⎨⎪⎪⎪⎪u=2(m+0.5)A−1v=2(n+0.5)A−1(1)
(1){u=2(m+0.5)A−1v=2(n+0.5)A−1
得到点(u, v)后,接下来根据CMP不同的面片,三维坐标与二维坐标间转换的对应关系也有所不同。
正方体各面 面索引号 X Y Z
前面(X轴正方向) 0 1.0 −v −u
后面(X轴负方向) 1 −1.0 −v u
上面(Y轴正方向) 2 u 1.0 v
下面(Y轴负方向) 3 u −1.0 −v
右面(Z轴正方向) 4 u −v 1.0
左面(Z轴负方向) 5 −u −v −1.0
反向将三维空间点转换为二维平面点,则可以根据三维点的坐标值(X, Y, Z)进行一些条件判断,确定该点所在的面及二维坐标(u, v),如下表所示:
条件判断 面索引号 u v
|X| ≥ |Y| and |X| ≥ |Z| and X >0 0 −Z/|X| −Y/|X|
|X| ≥ |Y| and |X| ≥ |Z| and X <0 1 Z/|X| −Y/|X|
|Y| ≥ |X| and |Y| ≥ |Z| and Y >0 2 X/|Y| Z/|Y|
|Y| ≥ |X| and |Y| ≥ |Z| and Y <0 3 X/|Y| −Z/|Y|
|Z| ≥ |X| and |Z| ≥ |X| and Z >0 4 X/|Z| −Y/|Z|
|Z| ≥ |X| and |Z| ≥ |Y| and Z <0 5 −X/|Z| −Y/|Z|
CMP共有六个面,每个面都有给定的索引号。在u-v平面坐标系中,每个面都是一个边长为2的正方形,u、v的取值可以是[-1, 1]内的任意值。对于立方体投影来说,从立方体面片上的二维平面点转换到三维空间中的对应点是比较简单的,根据具体的平面点(u, v)及该点所在面的索引号,可以从表1中得到其对应3D点坐标(X, Y, Z)。
投影效果
非紧凑型布局
在存储投影后的球面视频时,为了有效利用现有的平面视频压缩编码技术,需要将投影方式中的几何体展开并存到一个纹理中的多个区域内。对于有多个面存在的投影方式,可以有各种不同的方法将其展开并摆放为一个二维平面图像上。下图为常规的立方体展开方式示意图及一帧实际的效果图,分布为3行4列,则其图像横纵比为4:3。
这种布局的各个面之间保持了良好的图像连续性,即二维图像中的相邻区域在立方体上同样是相邻的,有利于视频编码。但这种布局存在六块灰色区域,是为了将该布局变为矩形而填充的无效像素。这些无效像素占整个二维平面图像像素数量的一半,因此会增加视频在存储时占用空间的大小,同时也会导致编码效率不太理想。
紧凑型布局
为了避免无效区域带来的各种影响,又出现了2行3列的布局方法,这样整个二维平面图像内都是有效像素。六个面在该布局中的排列方式有很多种可能,效果最好的是图2-3中的方法:将面索引号为4、0、5的三个面摆放在第一行,面索引号为2、1、3的三个面顺时针旋转90度后摆放在第二行,如下图左图所示。这样可以保证各行中的图像区域是保持连续的,在舍弃无效区域的同时,将图像内部不连续边的数量降低到只有一条,使得图像连续性最大化。在右图中可以很明显地看到真实效果只在图像中间有一条不连续边。这种布局方式处理后的平面图像横纵比为3:2。
Adjusted Cubemap Projection (ACP)
投影方式
ACP是在JVET-F0025会议上制定的针对CMP投影方式的改进,其在360Lib-3.0版本中代替CMP以改进cubemap投影方式,其投影面定义与CMP完全一样(见图2-1与表2-1)。 每个ACP面的uv平面定义也与CMP相同,其中uv平面中的每个面都是2x2大小的平面,u和v定义在[-1,1]的范围内。
投影公式
对于ACP中的2D到3D坐标转换,给定面f上的采样点(m,n),首先使用CMP投影方式的公式(1)计算(u,v)。
接下来根据以下公式来调整(u,v)计算(u’,v’):
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪u′=sgn(u)⋅0.34−0.342−0.09|u|−−−−−−−−−−−−√0.18v′=sgn(v)⋅0.34−0.342−0.09|v|−−−−−−−−−−−−√0.18(2)
(2){u′=sgn(u)·0.34−0.342−0.09|u|0.18v′=sgn(v)·0.34−0.342−0.09|v|0.18
最后,再利用上一节中CMP的正向求解表进行三维坐标(X, Y, Z)的求解。
对于3D到2D坐标转换,给定(X,Y,Z),根据上一节CMP的逆向求解表计算(u’,v’)和面f的索引号。然后再使用公式(3)来计算(u,v):
{u=sgn(u′)⋅(−0.36u′2+1.36|u′|)v=sgn(v′)⋅(−0.36v′2+1.36|v′|)(3)
(3){u=sgn(u′)·(−0.36u′2+1.36|u′|)v=sgn(v′)·(−0.36v′2+1.36|v′|)
最后,通过求解方程公式(1)来计算面f上的(m,n)。
将公式(1)中的正向调整函数表示为f(x),将公式(2)中的逆向调整函数表示为g(x)(x为u或v),下图为f(x)和g(x)的图像:
投影效果
下表对比了ACP与CMP的PSNR评分,可以看出有各类PSNR值有显著的下降,ACP有了明显的改进。
Metric Y U V
E2E-SPSNR-NN -11.3% -6.3% -6.4%
S-PSNR-I -11.2% -6.4% -6.6%
CPP-PSNR -11.2% -6.4% -6.6%
WS-PSNR -11.3% -6.3% -6.4%
CF-SPSNR-NN -34.2% -3.9% -4.2%
S-PSNR-I -11.0% -6.2% -6.4%
CPP-PSNR -10.8% -6.7% -7.0%
Dynamic Viewport -18.8% -11.1% -11.0%
Viewport 1 -15.4% -6.3% -7.1%
如下图是CMP与ACP的投影效果图对比,两幅图像基本上是一致的,仔细观察可以看出ACP在四个边角区域的图像扭曲比CMP更好一些。ACP主要在PSNR评分上有比较明显的提升,以此提高图像的质量。
Equi-Angular Cubemap projection (EAC)
这部分是由实验室老肖撰写的。
投影方式
等角立方体投影是对传统的立方体投影方式的一种优化。在球面映射到几何体表面的方法中,传统的放射型投影虽然简单,并且在应用到立方体投影中以后可以改善等距柱状投影中存在的像素分布极度不均匀及图像严重拉伸等问题,但由于立方体每个面的中心位置距离球体最近,越靠近边角的地方离球体越远,所以这些问题是依然存在的。
下图为立方体投影方式及其横截面示意图。可以看出,经过圆心和圆周上每一点的射线是以同样的角度向外发射的,但是在投影到正方形的边上时,越靠近中点对应的线段长度越短,越远离中点则对应线段越长,即圆上相同长度的弧映射到正方形上之后长度是不等的。因而导致对于球面上相同数量的像素点,投影到立方体边缘区域所分配到的采样像素数量会多于投影到中心区域时所分配的采样像素数量,即边缘区域稀疏,中心区域稠密。所以其分布依然是不均匀的。
针对这种情况,谷歌提出了一种对立方体投影的改进方法,即等角立方体投影,通过调整球面像素点对应的立方体上采样像素点的位置来改善这种不均匀的分布。等角立方体投影和传统立方体投影的对比,如下图所示:
投影公式
具体地,在二维平面内某一点到三维空间点的转换过程中,对于平面正方形上一点(u, v),立方体投影直接对照CMP中的正向转换表即可得到对应的三维坐标(X, Y, Z); 而在等角立方体投影中,首先要对点(u, v)进行调整,调整后得到坐标(u’, v’),然后再对照CMP中的正向转换表得到对应的三维坐标(X, Y, Z)。
平面坐标上一点(u, v)与相应的进行调整后的坐标(u’, v’)之间的转换关系如下:
⎧⎩⎨⎪⎪u′=tanu⋅π4v′=tanv⋅π4(4)
(4){u′=tanu·π4v′=tanv·π4
反过来,在三维空间点到二维平面点的转换过程中,针对坐标(X, Y, Z)先对照CMP逆向转换表得到面索引号和平面坐标(u’, v’),然后使用下面的公式得到调整前的平面正方形上的点(u, v):
⎧⎩⎨⎪⎪⎪⎪u=4π⋅arctan(u′)v=4π⋅arctan(v′)(5)
(5){u=4π·arctan(u′)v=4π·arctan(v′)
投影效果
等角立方体投影和传统立方体投影的对比如图12-2所示。传统方法的立方体面上的采样长度是由样本映射到立方体表面的位置决定的,所以长短不一。但等角立方体投影通过调整公式可以让采样长度近似相等,形成近似等角度的像素分布,虽然还是存在少量的失真和像素分布不均匀性,但效果已明显改善。等角立方体投影方式效果图如下图所示。
综上所述,与等距柱状投影相比,立方体投影对像素进行了更好的分配,使得两极和赤道区域的像素分布规律是基本一致的,同时也减少了两极的冗余,更进一步,减少了视频占用空间。该投影格式3x2的布局方法,相比于4x3的布局方法去掉了无效区域,在减小数据量的同时还维持了像素间的相邻关系,将视频的连续性最大化,有利于提升编码过程中帧内预测环节的成功率,提高压缩效率。同时,谷歌在立方体投影基础上做的优化,大幅改善了其像素分布的不均匀性,进一步减少了图像的失真。
Segmented Sphere Projection (SSP)
这部分是由实验室老肖撰写的。
投影方式
分段球面投影方式以北纬45度和南纬45度作为分段边界,将整个球面分为3段:北极段,赤道段和南极段。分段球面投影方式的示意图如下图所示:
球面纬度大于等于45度的北极段区域,和球面纬度小于-45度的南极段区域分别向赤道平面垂直投影,得到编号为0和1的圆平面,圆平面四周的其他矩形区域使用默认的灰色填充。赤道段的投影方式和ERP一样。为了使投影得到的各个平面的大小相同,将赤道段投影后所得到的平面分为4个大小相同的平面,编号从2至5。分段球面投影的布局方式较为简单,分布6行1列,其图像的纵横比为6:1。
每个投影面跨度90个经度,对应的球面区域如下表所示:
面索引号 纬度 经度
0
= 45
-180 ~ 180
1 <=-45 -180 ~ 180
2 -45 ~ 45 -180 ~ 90
3 -45 ~ 45 -90 ~ 0
4 -45 ~ 45 0 ~ 90
5 -45 ~ 45 90 ~ 180
投影公式
将一个面的尺寸表示为A×A。 在2D到3D转换中,根据点所属的面的编号不同,分别根据公式(6)(7)(8),将面上的点(m,n)映射到球体上的点(φ,θ):
对于编号f = 0的圆面上的点,运用以下公式:
⎧⎩⎨⎪⎪⎪⎪ϕ=arctan2(m+0.5−A2,n+0.5−A2)θ=π2⋅(1−rA)(6)
(6){ϕ=arctan2(m+0.5−A2,n+0.5−A2)θ=π2·(1−rA)
对于编号f = 1的圆面上的点,运用以下公式:
⎧⎩⎨⎪⎪⎪⎪ϕ=arctan2(m+0.5−A2,A2−n−0.5)θ=π2⋅(rA−1)(7)
(7){ϕ=arctan2(m+0.5−A2,A2−n−0.5)θ=π2·(rA−1)
对于公式(6)(7),其中r=(m+0.5−A2)2+(n+0.5−A2)2−−−−−−−−−−−−−−−−−−−−−−−−−−−√r=(m+0.5−A2)2+(n+0.5−A2)2, arctan2(y, x)计算y/x的反正切。
对于编号f = 2..5的方形平面上的点,运用以下公式:
⎧⎩⎨⎪⎪⎪⎪ϕ=π2⋅(m+0.5A+f−2)θ=π4−n+0.5A⋅π2(8)
(8){ϕ=π2·(m+0.5A+f−2)θ=π4−n+0.5A·π2
在3D到2D转换中,根据点所属的面的编号不同,分别根据公式(9)(10)(11),将球体上的点(φ,θ)映射到平面上的点(m,n)。
对于编号f = 0的圆面上的点 θϵ(π4,π2],ϕϵ(−π,π)θϵ(π4,π2],ϕϵ(−π,π), 运用以下公式:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪m=A2⋅[1+(π2−θ)⋅sinϕπ4]−0.5n=A2⋅[1+(π2−θ)⋅cosϕπ4]−0.5(9)
(9){m=A2·[1+(π2−θ)·sinϕπ4]−0.5n=A2·[1+(π2−θ)·cosϕπ4]−0.5
对于编号f = 1的圆面上的点 θϵ(−π2,−π4],ϕϵ(−π,π)θϵ(−π2,−π4],ϕϵ(−π,π), 运用以下公式:
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪m=A2⋅[1+(π2+θ)⋅sinϕπ4]−0.5n=A2⋅[1−(π2+θ)⋅cosϕπ4]−0.5(10)
(10){m=A2·[1+(π2+θ)·sinϕπ4]−0.5n=A2·[1−(π2+θ)·cosϕπ4]−0.5
对于编号f = 2..5的圆面上的点 θϵ(−π+(f−2)⋅π2,−π2+(f−2)⋅π2],ϕϵ(−π4,π4)θϵ(−π+(f−2)·π2,−π2+(f−2)·π2],ϕϵ(−π4,π4), 运用以下公式:
⎧⎩⎨⎪⎪⎪⎪m=2ϕπ⋅A+(4−f)⋅A−0.5n=A2−2θπ⋅A−0.5(11)
(11){m=2ϕπ·A+(4−f)·A−0.5n=A2−2θπ·A−0.5
投影效果
分段球面投影方式将ERP投影方式的极地区域投影存在的问题进行了优化,将球面两极附近的区域直接进行了垂直投影,投影方式简单并且投影效果较为平滑。赤道段的投影方式和ERP相同,保持了ERP的优点。但是分段球面投影所得到的平面存在两块不连续的区域,并且存在灰色默认区域,对存储空间有一定的浪费。
Truncated Square Pyramid projection (TSP)
投影方式
TSP是金字塔截体(Pyramidal Frustum)的一种特定情况,应用于方形金字塔(Square Pyramid),用一个平行于金字塔底平面将其塔尖平行削去,这样就得到了一个金字塔,如下图所示:
设TSP的底边和顶边长度为a和b,高度为h,则固体的体积为:V=h3⋅(a2+ab+b2)V=h3·(a2+ab+b2)
在360Lib中,TSP利用立方体几何体并将六个立方体面扭曲成紧凑的框架。如下图所示,定义了TSP投影方式中的(x,y)坐标。其中(x,y)的取值范围为(0.0, 1.0):
投影公式
给定立方体面f上的采样位置(m,n),(x,y)用以下公式计算:
⎧⎩⎨⎪⎪⎪⎪x=m+0.52W+0.5,mϵ[0,W)y=n+0.5H,nϵ[0,H)(12)
(12){x=m+0.52W+0.5,mϵ[0,W)y=n+0.5H,nϵ[0,H)
在TSP投影方式中,前面片对应于前立方面,后立方面被水平和垂直二次分割采样,而侧立方面被弯曲成梯形区域。坐标(u,v)可以从(x,y)由公式(13)得到:
{u=2x−1v=2y−1(13)
(13){u=2x−1v=2y−1
TSP投影方式的正向和反向映射方程如下表所示:
Face Forward (TSP to cube faces) Inverse (cube faces to TSP)
Right x′=16x−83,y′=y−2x+13−4xx′=16x−83,y′=y−2x+13−4x x=3x′+816,y=3x′−6x′y′+8y′8x=3x′+816,y=3x′−6x′y′+8y′8
Left x′=16x−133,y′=y+2x−24x−3x′=16x−133,y′=y+2x−24x−3 x=3x′+1316,y=2+6x′y′−3x′+38x=3x′+1316,y=2+6x′y′−3x′+38
Bottom x′=2−2x−y1−2y,y′=3−8y3x′=2−2x−y1−2y,y′=3−8y3 x=3y′−6x′y′−2x′+1316,y=38(1−y′)x=3y′−6x′y′−2x′+1316,y=38(1−y′)
Top x′=1−2x+y2y−1,y′=8−8y3x′=1−2x+y2y−1,y′=8−8y3 x=16−3y′−8x′+6x′y′16,y=8−3y′8x=16−3y′−8x′+6x′y′16,y=8−3y′8
Back x′=16x−112,y′=8y−32x′=16x−112,y′=8y−32 x=2x′+1116,y=2y′+38x=2x′+1116,y=2y′+38
投影效果
TSP投影效果图如下图所示,可以看到,TSP的投影宽高比为2:1,可以良好的适应目前视频存储格式的宽高比,便于编码,且整个图像均是有效像素。另一方面,虽然TSP的图像各面均是连续的,但是可以看出除了面0与面1之外的面图像没有扭曲外,面2,面3,面4,面5的图像均有严重的图像扭曲。
参考
JVET-H1004
360lib-4.0 Software Manual
Pei Qikai, Guo Juan, Lu Haiwen, Ma Guilong, Li Wensong, Zhang Xinyu. COP: A New Continuous Packing Layout for 360 VR Videos[C]. Virtual Reality. IEEE, March 18-22, 2018, Reutlingen, Germany
原文戳这里,转载请声明。
---------------------
作者:汤pp
来源:CSDN
原文:https://blog.csdn.net/qq_24635013/article/details/82463606
版权声明:本文为博主原创文章,转载请附上博文链接!
360lib投影格式介绍(二) - 立方体贴图投影(CMP / ACP / EAC / SSP / TSP)相关推荐
- OpenGL 核心技术之立方体贴图
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- 【OpenGL】笔记二十四、立方体贴图
1. 流程 之前我们使用了不少2D形式的贴图,那么现在有没有其他类型的贴图呢?当然有,比如立方体贴图,它就是由6个2D贴图组合而成的: 那么为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的 ...
- 【Unity Shader】 CubeMap(立方体贴图)
Unity Shader 立方体贴图 一.介绍CubeMap Shader中对CubeMap采样 Unity中如何制作CubeMap 二.Reflect CubeMap(反射立方体纹理用于环境映射) ...
- LearnOpenGL->立方体贴图
立方体贴图 立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map). 简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都 ...
- OPenGL笔记--给立方体贴图(纹理)
文章目录 一.前置知识 二.效果展示. 三.完整代码 附.给立方体每个面渲染不同的纹理 一.前置知识 经过前面的学习,我们已经知道了立方体怎么创建了,接下来学习怎么给立方体贴图: 为了将纹理正确的映射 ...
- 使用OpenGL 立方体贴图
openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.OpenGL 立方体贴图 二.使用步骤 1.代码 2.着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景,通常 ...
- LearnOpenGL 高级OpenGL—立方体贴图
文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...
- 立方体贴图 Cubemap
1. 立方体贴图 Cubemaps 1.1 创建立方体贴图 2. 天空盒 Skybox 2.1 加载天空盒 2.2 显示天空盒 2.3 优化 2.4 整体代码 3. 环境映射 Environment ...
- WebGL 利用FBO完成立方体贴图。
这篇主要记录WebGL的一些基本要点,顺便也学习下如何使用FBO与环境贴图.先看下效果图(需要支持WebGL,Chrome,火狐,IE11). 主要实现过程如下,先用FBO输出当前环境在立方体纹理中, ...
最新文章
- LNMP网站并发计算
- hibernate SQL查询COUNT函数
- python项目-这4个Python实战项目,让你瞬间读懂Python!
- Google Map V3--geocode与fitBounds方法的同步操作
- gn fast-gn_GN的完整形式是什么?
- wikioi 1163 訪问艺术馆 树形dp
- ESXi社区版NVMe驱动更新v1.1
- 信号及传播介质 综合布线系统
- 图论(5)邻接谱,邻接代数,图空间,托兰定理
- python 模拟登陆QQ空间
- SQLite3 编译
- PostgreSQL数据库WAL——RM_HEAP_ID日志记录动作
- 16 位 CPU 寄存器英文全称
- 55-将单链表原地逆置(三种方法)
- IM互通新方案-GTalk to VoIP回拨服务
- 字体设计编辑软件Glyphs 2 for mac中文版v2.6.6(1350)
- 数据库SQL实战-- 获取员工其当前的薪水比其manager当前薪水还高的相关信息
- 如何使自定义模块加入DNN搜索引擎(转)
- 第一讲:云计算的概念
- 图像语义分割及常用评价指标