vr视频六面体变换

article/2025/5/14 6:01:30

本文会对facebook的开源filter:vf_transform.c 做代码级分析,解释vr视频是如何做六面体转换的。

转换的关键其实就是输入vr视频到六面体的映射(也就是下图中蓝色图像映射到红色图像):


假设每个正方形的像素是512x512个,那么对于(x, y)这个像素值来说,想得到这个值,我只需要从原点,拉一条直线连接到(x, y)并沿着这条直线一直打到球面上,得到的像素值就是(x, y)这个点的值。描述这条直线靠极坐标就可以了

变换的过程其实就是将六面体每个面每个点都找到对应球面上的点。


从代码分析开始前,我还是先把之前文章里两张图贴过来,一个是全景vr视频,一个是转出的六面体视频:



六面体六个面的方向是:

右,左,上

下,前,后


代码中最关键的函数就是建立六面体到柱面的映射关系函数: generate_map。里面最关键的是transform_pos,输入六面体输出图像对应的坐标,根据计算结果可以计算出柱面对应坐标。其他h_subdivisons,increase_pixel_weight等等都是用于平滑作用,类似插值的道理,比较简单,就不赘述了。这里主要分析transform_pos这个函数。以常用的LAYOUT_CUBEMAP_32为例。


首先,根据输入的“输出像素坐标”,判断当前像素点处于输出图像的哪个面(face),上下左右前后。我们以“前”面为例。

输入为一个正面的像素点。我们把这个面放到一个三维坐标系中(采用左手坐标系),这个正方形的面距离原点的距离为0.5,x取值范围-0.5~0.5,y取值范围-0.5~0.5。为了让这个面的中心对准z轴,这里需要对输入的x,y坐标做一次转换:

qx = x - 0.5;

qy = y - 0.5;

这个转换对于不同面是不同的,这就是为什么代码中对不同face的vx和vy有不同的数组。如下图:



根据当前点位于当前面的位置,我们可以得到这个点在极坐标中的水平方向和垂直方向角度。

斜边长度:d = sqrtf(tx * tx + ty * ty + tz * tz);

水平方向角度(范围0~1):*outX = -atan2f (-tx / d, tz / d) / (M_PI * 2.0f) + 0.5f;

垂直方向角度(范围0~1):*outY = asinf (-ty / d) / M_PI + 0.5f;


归一化到(0~1)的目的,就是为了方便计算这个像素点在输入视频中的位置:

in_x = (int) (out_x * in_w);

in_y = (int) (out_y * in_h);


至此,一个立方体上的像素到球面上的点对应关系建立完毕。其他处理都比较直观,就不做赘述了。这个原理明白了,其他各种方式的变换也就可以自己实现了。之后有时间再写正四棱锥的映射。

最后留下一些提醒,为了在手机端播放,expand_coef是不可以为1的,必须略大于1,这是因为opengl ES在手机端实现vr一般都是2Dtexture,需要多一些内容做插值,如果仅仅把正方形内容准备齐全,在播放的时候会有缝。



文章来源:https://blog.csdn.net/defence006/article/details/52459543
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/7lRJbA5P.shtml

相关文章

学生角度看傅里叶变换,拉普拉斯变换,z变换(一)

学生角度看傅里叶变换,拉普拉斯变换,z变换(一) 学生角度看傅里叶变换,拉普拉斯变换,z变换(一) 离散和连续信号的表示 信号的脉冲表示响应与卷积 傅里叶变换 为什么需要傅里叶变换ejw…

树莓派GPIO引脚介绍

在已经安装好GPIO库的情况下,命令行输出gpio readall即可列出IO引脚的定义和编号,显示如下(替换为图) 编号规则可参考树莓派GPIO控制 Python配置GPIO安装参考: sudo apt-get install python-dev sudo apt-get insta…

树莓派GPIO引脚控制红绿灯与轰鸣器

参考: https://blog.csdn.net/weixin_44415639/article/details/114600919 https://blog.csdn.net/chenbo163/article/details/78716269 https://blog.51cto.com/u_11643026/4291142 这里文章用的编程引脚是物理引擎代号BOARD 1、GPIO控制包安装 参考&#xff1…

树莓派教程 : 树莓派各版本引脚定义

树莓派Zero W/WH(Raspberry Pi Zero W/WH) GPIO针脚定义

树莓派各版本引脚及参数

一、树莓派引脚 图片来源 注:本表格适用于各版本,并且兼容26Pin的树莓派B,树莓派B为26Pin,其引脚对应于上表的前26Pin。 二、树莓派参数 1.树莓派各版本比较: 2.树莓派3B参数 表格来源 名称参数备注SOC博通 BCM28…

树莓派4b 引脚图

树莓派 4B 详细资料

树莓派引脚远程控制

最近和树莓派群里朋友合作想做个开源RPILINK系统满足群里一些朋友的需求,虽然不少地方还不完善至少开了个头,先记录下来功能,以后有空会陆续会完善技术方面记录。 Rpilink系统是一个将树莓派设备连接到一起的数据平台,树莓派之间可以通过用户的配置进行数据交换和命令的执行…

树莓派4B的引脚控制简单demo

淘宝上的店家提供了很多示例程序,这里只拿一种来演示下,借此熟悉下如何用c或者python环境去操作树莓派。前提配置见我的之前的系列博客 树莓派4B基础软硬件环境搭建_jiugeshao的专栏-CSDN博客 树莓派4B上多版本python切换(一)_j…

树莓派的GPIO端口详解

首先上一张端口图 GPIO(GeneralPurposeI/OPorts)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO是个比较重要的概念,用户可…

树莓派管脚编码c语言,树莓派IO引脚定义 | 北岛夜话

我们使用树莓派的很重要一个原因是想通过它来进行一些智能控制,比如控制舵机、LED灯、继电器或者用来进行串口、SPI通信等,这些都需要通过控制树莓派的输入输出引脚(IO引脚)来实现的。前面的文章我们说过树莓派的输入输出引脚有26针和40针的区别,今天这篇文章我们具体看看它…

树莓派GPIO引脚详解

树莓派的GPIO引脚还是小有点复杂,有些是共用的。需要在启动时切换不同的设备树文件来设置不同的模式。详情参考: UART at Raspberry Pi GPIO PinoutRaspberry Pi UART pinshttps://pinout.xyz/pinout/uart

树莓派引脚编号说明

目前,树莓派引脚编号方式有三种: 1,基于引脚的物理位置进行编号; 2,C语言GPIO库wiringPi约定的编号方式; 3,Python语言GPIO库RPi.GPIO约定的编号方式。 如果我们要基于wiringPi库用C语言对树…

树莓派4b引脚图

感觉树莓派4B的引脚分布排序和树莓派3B的引脚排序差不太多,或者我需要的电源和串口应该是一样的。 转载自:树莓派4b引脚图_0欣欣0的博客-CSDN博客_树莓派4b引脚图

树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:https://blog.csdn.net/qq21497936/article/…

树莓派4B引脚定义及运行实例

一、树莓派引脚定义 学习如何用树莓派驱动LED灯时需要先了解树莓派管脚GPIO的编码方式,树莓派的管脚编码方式与51单片机的管脚编码有些不一样,在树莓派的GPIO上分为两种编码方式,分别为BCM和wiringPi编码,不同的编码方式在编写程…

树莓派 串口如何使用 以及树莓派引脚对照表

本文档为个人博客文档系统的备份版本、作者:小游、作者博客:点击访问 树莓派引脚图如下: 默认情况下,树莓派的串口有两个一个分配给蓝牙,另一个是miini串口,不过这个串口几乎不能正常使用(树莓…

树莓派引脚介绍与GPIO的初步认识与应用

树莓派引脚介绍与GPIO的初步认识 一.认识GPIO二.Python GPIO三.应用 一.认识GPIO 所谓GPIO,就是“通用输入/输出”接口,树莓派系统中已经编译自带了GPIO的驱动。 树莓派GPIO的编号方式: 1. 功…

树莓派:树莓派的各个引脚

由于第一次接触树莓派,,,emmmm,仔细写,奥里给 3.3V、5V(VCC):显然是电源正极啦 GND:接地用,负极负极负极 SDA.0、SDA.1:这个是 I2C&#xff08…

Raspberry Pi 引脚说明

除了供电针脚(包括 GND,3.3V 和 5V ),所有的GPIO针脚均可被用于数字输入或输出。 标记为 SCL(串行时钟)和SDA(串行数据)的针脚可被用于 I2C。 标记为 MOSI,MISO 和SCKL 的针脚可以用于连接高速…