Distortion Correction

因为最近在搞畸变相关的东西,找了一些畸变的资料来研究,这个章节翻译自Oculus_SDK_OverView的5.6.2节,翻译中有一些个人添加的辅助信息,以括号标识,”注:”开头,以粗体表示,例如(注:以下为个人翻译,水平有限,欢迎指正).

在rift内部的光学透镜可以放大图像,来增大视场角.因此也产生一个径向的”枕型”畸变,如下图左图所示的那样扭曲的图像:

对于Oculus Rift DK,这样的畸变需要使用软件的办法实现”桶型”畸变来校正已经扭曲的图像,如上图中的右图.当这2种畸变同时生效时,”桶型”畸变将会抵消镜片所产生的畸变,图像中的线条将会变成直线.
“枕型”畸变和”桶型”畸变都可以用以下畸变函数来建模:
R = k0 * r + k1 * r^3 + k2 * r^5
这里可以看出,源采样半径’R’是基于原始半径’r’以及固定系数k0,k1,k2计算得出.这些固定系数与”桶型”畸变正相关.由于畸变的影响,像素被拉向镜片的中心,位移的增加,半径也随着增大.在Oculus SDK World示例当中,由以下像素着色器实现:

Texture2D Texture : register(t0);
SamplerState Linear : register(s0);
float2 LensCenter;
float2 ScreenCenter;
float2 Scale;
float2 ScaleIn;
float4 HmdWarpParam;
// Scales input texture coordinates for distortion.
float2 HmdWarp(float2 in01)
{
float2 theta = (in01 - LensCenter) * ScaleIn; // Scales to [-1, 1]
float rSq = theta.x * theta.x + theta.y * theta.y;
float2 rvector= theta * (HmdWarpParam.x + HmdWarpParam.y * rSq +
HmdWarpParam.z * rSq * rSq + HmdWarpParam.w * rSq * rSq * rSq);
return LensCenter + Scale * rvector;
}
float4 main(in float4 oPosition : SV_Position, in float4 oColor : COLOR,
in float2 oTexCoord : TEXCOORD0) : SV_Target
{
float2 tc = HmdWarp(oTexCoord);
if (any(clamp(tc, ScreenCenter-float2(0.25,0.5), ScreenCenter+float2(0.25, 0.5)) - tc))
return 0;
return Texture.Sample(Linear, tc);
};

这个着色器设计用来运行在一个屏幕一半的四边形上,输入的纹理跨越了左、右眼.输入的纹理坐标,以参数oTextCoord传入,范围从(0.0)到(1,1),其中(0,0)表示Oculus屏的左上角,(1,1)表示右下角.这就表示左眼的视图范围是(0,0)到(0.5,1),右眼的视图是从(0.5,0)到(1.1).
用HmdWarp来实现畸变功能,但是为了计算半径,需要把纹理坐标转换到[-1,1]的顶点坐标当中(注:这个转换过程需要看一下这篇文章).这就意味着有一些变量用来缩放和中心的坐标,来正确的应用畸变,这些变量如下:

  • ScaleIn - 重新调整输入的纹理坐标到[-1,1]单元坐标反问,修正长宽比.
  • Scale - 重新调整输出坐标,使它回到纹理坐标的范围内,并且增大缩放以支持”outside of the screen”
  • lensCenter - 将纹理坐标移到镜头中心周围的畸变函数.
  • HmdWarpParam - 存储畸变系数.
  • ScreenCenter- 在纹理坐标中,半屏纹理的中心.用来防止像素从一直眼睛泄漏到另一只眼睛中.
    下图以数值说明左眼畸变功能的坐标范围.如蓝色矩形所示,如左眼的视图坐标那样.我们可以看到,畸变的中心向右移动了一部分,IPD变得更窄了.在7英寸的屏幕和64mm的IPD下,视图右移了0.1453个坐标单元(当然,不同情况下这个值就不一样了).

    该图还说明了如何通过畸变函数映射采样坐标.一个畸变单元坐标点(0.5,0.6),如图绿色十字标识.它的半径是~0.61(注:这个0.61是0.5^2+0.6^2).这个也许会被映射到半径为0.68的畸变位置,如上图所示的红色十字.着色器会将像素往畸变的中心移动.如上图中的红色十字移动到绿色十字.位移量随着你的移动而增加.
    从这方面讨论来看,在整个游戏场景运行期间”桶型”畸变需要在后台一直运行.这里有几个影响渲染情况:

  • 原始场景渲染需要在渲染目标上完成.

  • 因为像素向中心畸变,渲染目标的场景需要大于最终的视图
  • 视场角和图片缩放需要适配于畸变.
    现在我们来讨论畸变缩放,渲染目标和视场角的调整,必须使Rift内的图像看起来是正确的.

Distortion Correction相关推荐

  1. Geometric Distortion Correction 畸变矫正

    径向畸变 顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在短焦镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种.以下分 ...

  2. 我为中国第一张火星照片做鱼眼矫正

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|CVer 以下是昨日发布的内容.今天把代码整理了一下,放 ...

  3. ADAS辅助驾驶_自动驾驶_技术点列表

    0 ADAS 汽车电子及ADAS安全部分相关测试标准 汽车总线特性简述 短距离车间通信V2X简述 先进驾驶辅助系统ADAS接口协议ADASIS v2简介 ADAS在车载导航设备上的应用 先进驾驶辅助系 ...

  4. 摄像头图像桶形畸变校正测试

    from: http://blog.csdn.net/hyanglu1573/article/details/12876727 1        桶形畸变原理 如果摄像头使用短焦距广角镜头,那么得到的 ...

  5. 机器人学习--Hans Moravec在斯坦福博士论文1980年-Obstacle Avoidance and Navigation in the Real World by a Seeing Ro

    Hans Moravec,占用栅格地图的发明人. Obstacle Avoidance and Navigation in the Real World by a Seeing Robot Rover ...

  6. Tango+Daydream,刀剑合璧的Android VR开发

    Tango+Daydream,刀剑合璧的Android VR开发 2017-01-03 随着ASUS在CES2017上宣布了全球第一款同时具有Tango和Daydream两种能力的ZenFone AR ...

  7. 计算机视觉知识基础_我见你:计算机视觉基础知识

    计算机视觉知识基础 My introduction to Computer Vision happened in 2017 when I was doing Self-driving Car Nano ...

  8. 第二季4:HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID)函数的分析

    以下内容源于朱有鹏课程与海思相关SDK文档的解读,如有侵权,请告知删除. 速览点 1.标题函数(提取码1111)在SDK/package/mmp/sample/venc/sample_venc.c中, ...

  9. python 实现显著性检测_强!汽车车道视频检测:python+OpenCV为主实现

    1 说明: ===== 1.1 完整版:汽车车道动态视频检测讲解和注释版代码,小白秒懂. 1.2 python+OpenCV+moviepy+numpy为主的技术要点. 1.3 代码来源: https ...

最新文章

  1. Java 文件上传下载管理器(控制台)
  2. Mongodb副本集--Out of memory: Kill process 37325 (mongod)
  3. 修改hosts立刻生效不必重启
  4. Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)
  5. java 类隔离_Java类装载体系中的隔离性
  6. 性能优化8--内存泄露
  7. 7安装sql cent os server_CentOS7 安装并使用SQL Server
  8. Oracle复习(知识点、练习题、实验)
  9. 梯度下降、牛顿法、拟牛顿法详细介绍
  10. matlab求微分方程的系数,Matlab中系数为离散值的微分方程求解【编辑完成求解答】...
  11. 【janino】janino 加载自定义函数报错 CompileException xxx cannot be invoked in static context
  12. 横流式冷却塔计算风量_10T-1000T冷却塔厂家批发零售
  13. 数据结构学习(一)数组
  14. python链接MySQL数据库
  15. js 前端导出报错 格式不正确_js-xlsx 实现前端 Excel 导出(支持多 sheet)
  16. 微信小程序style的动态样式使用-三元表达式
  17. 【微信公众号开发】微信支付-退款通知
  18. (转)eclipse 打开pom.xml文件很慢 设置pom.xml打开方式
  19. 路径规划的二次规划方法-知识总结
  20. 百度SEO快排系统都有哪些类别?【系统之间的区别】

热门文章

  1. 怎么用xshell等ssh连接方式连接自己的本地虚拟机
  2. 二叉树的遍历及解题思路
  3. (中缀)表达式转换成前缀表达式、后缀表达式
  4. checkbox选中和不选中 jqu_运用jQuery无法设置checkbox选中即没有变成选中状态
  5. 14种异常检测方法汇总(附代码)!
  6. 舆情监测专题报告写作内容及格式参考模板
  7. win7安装Edge提示“无法连接到Internet。如果使用防火墙,请将MicrosoftEdgeUpdate.exe加入允许列表中“
  8. mysql取汉字首拼_MYSQL 获取每个汉字的拼音首字母
  9. vue-cli调用高德地图api
  10. memcached的常用命令