本文将简要介绍360度视频的拼接,以及AMD是如何优化代码以支持实时运行。首先,我们先看看整体的软件层次结构,然后再看看整体的Radeon Loom拼接管道。
我们在OpenVXTM之上构建了Radeon Loom拼接框架。将OpenVX作为基础非常重要,原因有几个。OpenVX是Khronos Group设计的计算机视觉应用跨平台加速的开放标准(其同时支持OpenGL,OpenCLTM,Vulkan和许多其他标准)。OpenVX能够实现性能和功耗优化的计算机视觉处理,这对实时用例(如对象和场景重建,虚拟现实和增强现实,视觉检测等)十分关键。
OpenVX非常适合这个任务,因为它允许底层架构高效地运行计算图(或管道),这是硬件可以执行的最佳方式。关于硬件如何获得效率的细节不需要暴露在顶层。
AMD对OpenVX的实现包括一个Graph Optimizer,而它在概念上作用就像整个管道的编译器。我们已经在Github上完全开源了Graph Optimizer。
另外,OpenVX规范的设计使得每个实现都能够决定如何处理每个工作负载。例如,处理可能是无序的,一片片地分布在本地存储器中,又或者说全部或部分由专用硬件处理。这意味着随着硬件和软件驱动程序的优化,拼接代码可以自动利用这一点,类似于3D游戏可以通过新硬件和新驱动程序实现更高的帧速率和更高的分辨率。
无论你是在实时拼接还是离线拼接(在批处理模式下),大部分步骤都是相同。我们首先解释离线管道。我们从相机设备开始,拍摄一组视频,根据设备相机的不同可能储存在SD卡或micro SD卡中。完成拍摄后,将所有文件复制到PC上,然后启动一个应用程序进行拼接(我主要是简要介绍,因此省略了一些步骤)。下面是管道的大概示例图:
在我们继续说下去之前,最好解释一下输出结果。要获得球形图像以供头显观影,我们需要创建一个球体的平面投影:
360度视频播放器应用程序可以将上面的扁平等量矩形图像扭曲成一个球体,如下所示:
这是最常见的方法,我们将其称之为等量矩形投影(Equirectangular Projection)。
管道的第一步是将相机编码成的视频解码为标准格式,如H.264。接下来是将颜色空间转换为RGB。诸如H.264之类的视频编解码器以YUV格式(通常为YUV4:2:0)存储数据以获得更好的压缩。请注意,最初的Radeon Loom管道为8位,我们正在设计的未来版本支持8位元每像素以上的数据。
下一步是镜头校正,这取决于相机所使用的镜头。校正镜头的变形,从而使直线在水平方向和垂直方向都呈现为直线。在完成镜头校正之后,我们需要将图像变换成等量矩形投影的缓冲区。我们将在后面讨论如何,以及在哪里计算所有这些参数,但步骤基本上如下所示:
鱼眼镜头和圆形镜头会产生更多需要校正的失真。以下是将校正图像变形为等量矩形大小的中间缓冲区示例:
这时,如果你将各层整合在一起(如下所示),你将会得到一张拼合的图像。然而,我们中间跳过了部分内容:处理重叠区域,并且调整每个图像之间以及重叠区域之间的曝光。
Radeon Loom具有混合模块,用于测缝和曝光补偿,以及多波段混合,这是为了在相机图像之间取得均衡的高质量拼接,从而最大限度地减少拼接的可见度。
我们现在已经向大家介绍了360度视频拼接管道的简单示例。我们同时探讨了如何使用OpenVX作为高效基础和运行时引擎来控制令GPU保持忙碌的逐帧和逐步处理,从而最大限度地帮助提高性能。
在下一篇博文中,我们将进一步介绍测缝和曝光混合,以及Radeon Loom API。接下来,我们将探讨如何添加你自己的OpenVX模块,通过自己的算法来自定义拼接。
如果你是一名360度视频开发者,你无需等待我们最终的Radeon Loom SDK。你可以登陆GPUOpen官网下载Radeon Loom Stitching Library的beta预览版
评论 (0)