CMP投影

立方体投影格式(Cubemap projection format,CMP)是通过将球面内容投影在立方体模型上后将各个面展开,然后拼接为矩形的一种投影方式。

和ERP不同,CMP采用正方体进行投影,内容会投影到6个面上,如图1所示。

图1 CMP投影

6个面编号PX、PY、PZ、NX、NY、NZ,P表示沿坐标轴正方形,N表示沿坐标轴负方向。

表1 CMP face index

Face index Face label 说明
0 PX 正面,沿x轴正方向
1 NX 背面,沿x轴负方向
2 PY 上面,沿Y轴正方向
3 NY 下面,沿Y轴负方向
4 PZ 右面,沿Z轴正方向
5 NZ 左面,沿Z轴负方向
>5 null

每个面都对应一个uv平面,uv平面是2x2的正方向平面(等于单位球体的直径),u和v的取值[-1,1]。

假定每个面都是AxA的正方形,则对于某个面f上的坐标(m,n),其对应(u,v)计算方式为:

由(u,v)可按表2求3D坐标(X,Y,Z),

表2 由(f,u,v)计算(X,Y,Z)

f X Y Z
0 1.0 -v -u
1 -1.0 -v u
2 u 1.0 v
3 u -1.0 -v
4 u -v 1.0
5 -u -v -1.0

对于3D到2D的投影变换,给定(X,Y,Z)可以按表3求得(f,u,v),

表3 由(X,Y,Z)计算(f,u,v)

条件 f 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|

Frame Packing

CMP投影到6个面上,但是这6个面要拼成一个矩形2D平面才能编码。360Lib对CMP提供了2种面的拼接方式,分别为3x4和2x3形式,

图2 CMP frame packing

图2.1是原始360图像ERP投影的结果,红色虚线是经度。图2.2是图像按照CMP投影后6个面按3x4拼接的结果,其中有6个灰色的面是无效的,即表1中索引大于5的面,红色虚线是面的边界。图2.2是图像按照CMP投影后6个面按2x3拼接的结果,红色虚线是面的边界。

6个面拼接的时候还可以按照90、180、270度旋转,如图3中面1,2,3均逆时针旋转了270度。

图3 frame packing旋转

CMP是直接透视投影,均匀性仍然较差,由于透视投影过程不改变立体角的大小,这表现在对应于球面上等立体角的两点,投影到立方体上后会出现中心区域密度高而边缘区域密度低的现象。

/********************
face order:
PX: 0
NX: 1
PY: 2
NY: 3
PZ: 4
NZ: 5
********************/
Void TCubeMap::map2DTo3D(SPos& IPosIn, SPos *pSPosOut)
{pSPosOut->faceIdx = IPosIn.faceIdx;POSType u, v;POSType pu, pv; //positin in the plane of unit sphere;u = IPosIn.x + (POSType)(0.5);v = IPosIn.y + (POSType)(0.5);pu = (POSType)((2.0*u)/m_sVideoInfo.iFaceWidth-1.0);pv = (POSType)((2.0*v)/m_sVideoInfo.iFaceHeight-1.0);//map 2D plane ((convergent direction) to 3D ;switch(IPosIn.faceIdx){case 0:pSPosOut->x = 1.0;pSPosOut->y = -pv;pSPosOut->z = -pu;break;case 1:pSPosOut->x = -1.0;pSPosOut->y = -pv;pSPosOut->z = pu;break;case 2:pSPosOut->x = pu;pSPosOut->y = 1.0;pSPosOut->z = pv;break;case 3:pSPosOut->x = pu;pSPosOut->y = -1.0;pSPosOut->z = -pv;break;case 4:pSPosOut->x = pu;pSPosOut->y = -pv;pSPosOut->z = 1.0;break;case 5:pSPosOut->x = -pu;pSPosOut->y = -pv;pSPosOut->z = -1.0;break;default:assert(!"Error TCubeMap::map2DTo3D()");break;}
}Void TCubeMap::map3DTo2D(SPos *pSPosIn, SPos *pSPosOut)
{POSType aX = sfabs(pSPosIn->x);POSType aY = sfabs(pSPosIn->y);POSType aZ = sfabs(pSPosIn->z);POSType pu, pv;if(aX >= aY && aX >= aZ){if(pSPosIn->x > 0){pSPosOut->faceIdx = 0;pu = -pSPosIn->z/aX;pv = -pSPosIn->y/aX;}else{pSPosOut->faceIdx = 1;pu = pSPosIn->z/aX;pv = -pSPosIn->y/aX;}}else if(aY >= aX && aY >= aZ){if(pSPosIn->y > 0){pSPosOut->faceIdx = 2;pu = pSPosIn->x/aY;pv = pSPosIn->z/aY;}else{pSPosOut->faceIdx = 3;pu = pSPosIn->x/aY;pv = -pSPosIn->z/aY;}}else{if(pSPosIn->z > 0){pSPosOut->faceIdx = 4;pu = pSPosIn->x/aZ;pv = -pSPosIn->y/aZ;}else{pSPosOut->faceIdx = 5;pu = -pSPosIn->x/aZ;pv = -pSPosIn->y/aZ;}}//convert pu, pv to [0, width], [0, height];pSPosOut->z = 0;pSPosOut->x = (POSType)((pu+1.0)*(m_sVideoInfo.iFaceWidth>>1) + (-0.5));pSPosOut->y = (POSType)((pv+1.0)*(m_sVideoInfo.iFaceHeight>>1)+ (-0.5));
}

ACP投影

ACP(Adjustedcubemap projection format)投影是CMP的改进。

在2D转3D的计算过程中,对公式(1)(2)计算的(u,v)进行改进,

在3D转2D的计算过程中,计算得到的(u,v)再进一步处理,

将公式(3)(4)的变换用f(x)表示,公式(5)(6)的变换用g(x)表示(其中x为u或v),则f(x)和g(x)变换如下:

EAC和HEC投影

EAC(Equi-angular cubemap projection)和HEC(Hybrid equi-angular cubemap projection)和ACP类似,就是(u,v)的转换函数不同,

EAC的(u,v)计算为:

HEC和EAC类似,对于所有面的u的计算使用公式(7)(8),对于顶面和底面的v的计算使用公式(7)(8),不过对于其他4个面的v的正向和逆向变换如下:

感兴趣的请关注微信公众号Video Coding

360视频:CMP和ACP投影相关推荐

  1. 360视频:金字塔棱台投影TSP

    金字塔棱台投影(Truncated square pyramid projection format,TSP)投影模型是棱台.TSP的投影平面如图1所示,投影后的六个面组成矩形平面,矩形内的坐标(x, ...

  2. 360°视频的视频编解码器性能评估中的常见测试条件和软件参考配置

    这几天一直阅读提案,发现状态不是很好,就把几篇我觉得很有用的提案摘录到这里.带(*)标识的地方是我还没懂的地方= =. 首先这篇提案是JVET common test conditions and e ...

  3. 360视频云Web前端HEVC播放器实践剖析

    360视频云前端团队围绕HEVC前端播放及解密实现了一套基于WebAssembly.WebWorker的通用模块化Web播放器,在LiveVideoStackCon2019深圳的演讲中360奇舞团We ...

  4. 精仿B站源码+自动采集360视频

    介绍: 精仿B站源码+自动采集360视频 精仿哔哩哔哩还原度高达90% 响应式设计无需担心网页卡顿问题 整体简洁明了让你的视觉效果达到极致,追寻探索化的中心欢迎您的使用 采用了无数据库全本地化设计(无 ...

  5. 360视频加速器官方版

    360视频加速器 v1.0 官方版 软件大小:42.3MB 软件语言:简体中文 软件类别:网络加速 软件授权:官方版 更新时间:2014-12-31 应用平台:/Win8/Win7/WinXP 360 ...

  6. unity 360视频_如何将360视频与Unity集成

    unity 360视频 Since the introduction of the new Video Player component in Unity 5.6, we've had a lot o ...

  7. 360视频质量评估标准:WS-PSNR及对应代码实现部分

    本文转载自http://blog.csdn.net/lin453701006/article/details/78109934,在原作者的基础上修改了部分结构以及添加代码实现部分,在此对原作者表示感谢 ...

  8. 360°视频相机调研

    Google Jump 可以拍3d全景视频 16个摄像头环状分布 水平360°画面,垂直120°画面 omnidirectional stereo (ODS) video(全景立体视频) mosaic ...

  9. 360视频:赤道圆柱投影ECP

    ​赤道圆柱投影(Equatorial cylindrical projection,ECP)和ERP类似也使用圆柱体投影,但是ECP将球体分为三个部分进行投影:赤道.北极和南极. 图1 ECP投影和f ...

最新文章

  1. 欢乐纪中某A组赛【2019.7.11】
  2. 程序员接私活平台_程序员去哪儿接私活?我系统总结了15个国内平台,绝对靠谱...
  3. javascript Dom总结
  4. 《程序员面试宝典》精华 底层部分
  5. 百位云计算专家齐聚湖畔大学,阿里云MVP全球闭门会聚焦数字化转型
  6. Windows Server 2012 之部署Windows Server 更新服务(1)
  7. Icon图标格式(用于生成*.ico图标)
  8. Python基于HRHet的跌倒检测系统(源码&教程)
  9. 【Java】 小数位数 | 小数多少位 | 忽略无效0
  10. 《东周列国志》第八十四回 智伯决水灌晋阳 豫让击衣报襄子
  11. JsPlumb获取线数据
  12. 【软件测试】什么样的项目适合做自动化测试?自动化测试有需要那些技术?
  13. java excel 批注_Java 添加、修改、读取、复制、删除Excel批注
  14. 有限新息率FRI信号模型
  15. “12306”的架构到底有多牛逼?
  16. 王垠:机器与人类视觉能力的差距(3)
  17. java 使用 Amazon SES 发送电子邮件
  18. 湖北省创新型中小企业培育申报流程方法及申报时间要求指南
  19. html 中写注释吗,html 注释
  20. Android后台开启服务默默拍照

热门文章

  1. python+ opencv实现摄像头实时人脸识别并实现汉字标框
  2. linux mysql 登录报1045_【mysql】linux登录MySQL_报错ERROR_1045_(28000)解决办法
  3. 灵活搭建50方局域网视频会议基本系统
  4. 修改无法启动的容器中的配置文件(elasticsearch)
  5. 01.ingest pipeline的使用简介
  6. WebRTC 报错:Failed to set remote offer sdp: Called with SDP without DTLS fingerprint
  7. STM32 使用 SHT2x 温湿度传感器
  8. Android 使用Alarm机制创建长时间在后台运行的定时任务
  9. 小程序发送短信验证码完整工具
  10. linux权限可被登录用户读取,Linux 用户及权限详解