分段球面投影(Segmented sphere projection,SSP)将球面分为3个部分:北极、南极、赤道。图1是SSP投影示意图,球面上三个部分的分界线是北纬45度和南纬45度。北极和南极投影后的面是圆,索引分别为0和1,赤道投影方式和ERP相同,赤道投影后被划分为4个相同的正方形面,索引为2到5。投影后面的两极圆的直径和赤道正方形边长相等,因为它们纬度都跨了90度。

图1 SSP投影

Frame Packing

SSP有两者frame packing方式,一种如图1所示,映射后按垂直方向展开。图2是真实图像垂直展开的示例。

图2 SSP垂直展开

SSP还可以按照水平方向展开,如图3所示。

图3 SSP水平展开

展开后各面的定义如表1。

表1 SSP各面的定义

投影变换

2D-3D变换,假设面的直径是A,则2D平面上的点(m,n)按下面方式转换为球面上的

3D-2D变换,球面上的按下面方式转换为2D平面上的点(m,n),

Void TSegmentedSphere::map2DTo3D(SPos& IPosIn, SPos *pSPosOut)
{POSType u, v,square = m_sVideoInfo.iFaceHeight,width = m_sVideoInfo.iFaceWidth,pitch, yaw;//u = IPosIn.x;u = IPosIn.x + (POSType)(0.5);v = IPosIn.y + (POSType)(0.5);#if SVIDEO_SSP_PADDING_FIX
#elseif ((u < 0 || u >= m_sVideoInfo.iFaceWidth) && (v >= 0 && v < m_sVideoInfo.iFaceHeight * 2 / 3)){u = u < 0 ? m_sVideoInfo.iFaceWidth + u : (u - m_sVideoInfo.iFaceWidth);}else if (v < 0){v = -v;u = u + (m_sVideoInfo.iFaceWidth >> 1);u = u >= m_sVideoInfo.iFaceWidth ? u - m_sVideoInfo.iFaceWidth : u;}else if (v >= m_sVideoInfo.iFaceHeight){v = (m_sVideoInfo.iFaceHeight * 2 / 3 << 1) - v;u = u + (m_sVideoInfo.iFaceWidth >> 1);u = u >= m_sVideoInfo.iFaceWidth ? u - m_sVideoInfo.iFaceWidth : u;}
#endifPOSType pole_x, pole_y, pole_d;if (IPosIn.faceIdx == 0){pole_x = u - width / 2;pole_y = v - square / 2;pole_d = ssqrt(pole_x*pole_x + pole_y*pole_y);yaw = (pole_d > 0) ? acos(pole_y / pole_d) : 0;yaw = (pole_x < 0) ? S_PI*2 - yaw : yaw;pitch = S_PI_2 - pole_d * S_PI_2 / square;}else if (IPosIn.faceIdx == 1){pole_x = u - width / 2;pole_y = v - square / 2;pole_d = ssqrt(pole_x*pole_x + pole_y*pole_y);yaw = (pole_d > 0) ? satan2(pole_y, pole_x) + S_PI_2 : 0;pitch = pole_d * S_PI_2 / square - S_PI_2;}else if (IPosIn.faceIdx == 2){yaw = (POSType)(u*S_PI_2 / m_sVideoInfo.iFaceWidth - S_PI);pitch = (POSType)(S_PI_2 - (v + square / 2)*S_PI / square / 2);}else if (IPosIn.faceIdx == 3){yaw = (POSType)((u + square)*S_PI_2 / m_sVideoInfo.iFaceWidth - S_PI);pitch = (POSType)(S_PI_2 - (v + square / 2)*S_PI / square / 2);}else if (IPosIn.faceIdx == 4){yaw = (POSType)((u + 2*square)*S_PI_2 / m_sVideoInfo.iFaceWidth - S_PI);pitch = (POSType)(S_PI_2 - (v + square / 2)*S_PI / square / 2);}else if (IPosIn.faceIdx == 5){yaw = (POSType)((u + 3*square)*S_PI_2 / m_sVideoInfo.iFaceWidth - S_PI);pitch = (POSType)(S_PI_2 - (v + square / 2)*S_PI / square / 2);}else{assert(!"Face index Error!\n");}pSPosOut->faceIdx = IPosIn.faceIdx;pSPosOut->x = (POSType)(scos(pitch)*scos(yaw));pSPosOut->y = (POSType)(ssin(pitch));pSPosOut->z = -(POSType)(scos(pitch)*ssin(yaw));
}Void TSegmentedSphere::map3DTo2D(SPos *pSPosIn, SPos *pSPosOut)
{POSType x = pSPosIn->x;POSType y = pSPosIn->y;POSType z = pSPosIn->z;POSType len = ssqrt(x*x + y*y + z*z);POSType square = m_sVideoInfo.iFaceHeight;POSType yaw = (POSType)(satan2(-z, x)),pitch = (POSType)(sasin(y / len));pSPosOut->z = 0;if (y > len*ssqrt(2) / 2){pSPosOut->faceIdx = 0;pSPosOut->x = square * ssin(yaw) * (S_PI_2 - pitch) / S_PI_2 +m_sVideoInfo.iFaceWidth / 2 - 0.5;pSPosOut->y = square / 2 * (1 + scos(yaw) * 2 * (S_PI_2 - pitch) / S_PI_2) - 0.5;}else if (y < -len*ssqrt(2) / 2){pSPosOut->faceIdx = 1;pSPosOut->x = square * ssin(yaw) * (S_PI_2 + pitch) / S_PI_2 +m_sVideoInfo.iFaceWidth / 2 - 0.5;pSPosOut->y = square / 2 * (1 - scos(yaw) * 2 * (S_PI_2 + pitch) / S_PI_2) - 0.5;}else if (z >= 0 && x < 0){pSPosOut->faceIdx = 2;pSPosOut->x = (S_PI + yaw)*m_sVideoInfo.iFaceWidth / S_PI_2 - 0.5;pSPosOut->y = (S_PI_2 - pitch) * square / S_PI_2 - square / 2 - 0.5;}else if (z > 0 && x >= 0){pSPosOut->faceIdx = 3;pSPosOut->x = (S_PI + yaw)*m_sVideoInfo.iFaceWidth / S_PI_2 - m_sVideoInfo.iFaceWidth - 0.5;pSPosOut->y = (S_PI_2 - pitch) * square / S_PI_2 - square / 2 - 0.5;}else if (z <= 0 && x > 0){pSPosOut->faceIdx = 4;pSPosOut->x = (S_PI + yaw)*m_sVideoInfo.iFaceWidth / S_PI_2 - 2 * m_sVideoInfo.iFaceWidth - 0.5;pSPosOut->y = (S_PI_2 - pitch) * square / S_PI_2 - square / 2 - 0.5;}else if (z < 0 && x <= 0){pSPosOut->faceIdx = 5;pSPosOut->x = (S_PI + yaw)*m_sVideoInfo.iFaceWidth / S_PI_2 - 3 * m_sVideoInfo.iFaceWidth - 0.5;pSPosOut->y = (S_PI_2 - pitch) * square / S_PI_2 - square / 2 - 0.5;}
}

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

360视频:分段球面投影SSP相关推荐

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

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

  2. HTML5播放器:视频分段播放

    2019独角兽企业重金招聘Python工程师标准>>> 本来想试试能不能越过Vip验证关卡,直接获取到视频资源地址的,但是发现拿到的地址只有几分钟的,或者十几分钟的! 想着这应该是视 ...

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

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

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

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

  5. JWPlayer Flash播放器如何实现视频分段载入播放从而节省带宽?

    近期由于一个项目的需要,对Flash版本的播放器JWPlayer做了一些改进以支持一些功能,这里把中间用到的一些思路和做法记录下. 首先一个功能是:客户的很多flv视频都是完整的一个大视频,希望JWP ...

  6. 360视频加速器官方版

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

  7. 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 ...

  8. html5音频剪辑,一种基于HTML5Canvas画布音视频分段剪辑方法与流程

    技术特征: 1.一种基于html5canvas画布音视频分段剪辑方法,其特征在于:包括如下步骤: 步骤一:首先使用者预先获取源音视频文件,然后使用者对音视频文件分段剪辑时,进入音视频文件分段剪辑主单元 ...

  9. 聊聊视频分段下载的思路

    很多优酷网的视频,都是被分拆成多段的.最近做项目,需要在线播放分段和下载视频.播放分段视频,其实就是常说的m3u的概念,把各个分段的地址做成一个播放列表,播放器把所有分段当作一个完整的视频.在播放过程 ...

  10. android 视频分段录制,短视频录制,分段,回删,美颜,时长限制,分辨率,码率,压缩

    更新记录 1.0(2019-10-30) Android版本上线,有疑问请联系QQ37894663 平台兼容性 Android iOS √ × 原生插件通用使用流程: 购买插件,选择该插件绑定的项目. ...

最新文章

  1. 有了它,不会JavaScript,也能写出各种精彩页面!
  2. http、https比较
  3. # 和 ## 的区别
  4. There is no public key available for the following key IDs:3B4FE6ACC0B21F32
  5. CTS(12)---android 兼容性测试 CTS 测试过程
  6. windows内置的linux安卓驱动多系统摆脱虚拟机(上)
  7. 拓端tecdat|Python用时变马尔可夫区制转换(Markov regime switching)自回归模型分析经济时间序列
  8. asp.net页面去调用通过SSL加密的webservice报错
  9. 计算大数阶乘--VB Script 版
  10. 脉冲耦合神经网络(PCNN)-pulse coupled neural network
  11. 汽车故障诊断技术【1】
  12. 如何自己制作身份证扫描件?
  13. Fujitsu DPK8310Tax 打印机驱动
  14. 深度:ATM互联网巨头加紧入局的中老年线上市场,你是选择流量收割还是内容为王?
  15. 全套汽车标志,好不容易找到的哦
  16. hbase snappy 安装_【hbase-部署】配置snappy压缩
  17. 亮度、对比度、直方图均衡化
  18. NI LabVIEW开发环境(2.生成installer安装程序exe)
  19. 读书笔记:大型网站技术架构-核心原理与案例分析
  20. Google Play开发者账号注册过程中的安全问题

热门文章

  1. 【Unity】游戏开发过程中的前后台切换技术
  2. 【模型选择】从0到1的数据价值实现需要数据分析师做些什么?
  3. linux系统下文件误删除该如何恢复?
  4. java求两点间的距离_java计算两点间的距离方法总结
  5. 思科模拟器配置默认路由(下一跳使用端口)
  6. 网页360浏览器极速模式能打开,兼容模式打不开
  7. 大学老师招聘面试:说课和答辩
  8. C语言中数组和字符串长度以及输入输出详解
  9. An effective intrusion-resilient mechanism for PLCs against data tampering attacks
  10. Swarm(bzz)节点服务器配置要求