编者按:GoPro等第一人称摄像设备已经几乎成为了极限运动者的标配,但拍摄过程中的抖动常会让画面非常糟糕。微软Hyperlapse技术实现了将第一人称录像转化成稳定而流畅的视频。该成果的论文已发表在SIGGRAPH
2014大会。

微软研究院研究员Johannes
Kopf头戴GoPro在攀登舒克桑山(Mount
Shuksan)

可以头戴的GoProiON这些第一人称摄像设备如今几乎成为了极限运动者的标配,无论是远足、登山还是漂流,一段从第一人称视角出发记录下主人公全程见闻的录像都会是日后弥足珍贵的回忆。但是,由于行进过程无可避免中的跑动和攀爬,有时剧烈抖动的画面就会令观看者顿时兴致全无。更糟糕的是当你想把全过程的视频快进,以免视频太过冗长让人失去兴趣时,抖动却会被进一步放大。

有类似苦恼的,还有微软研究院研究员Johannes
Kopf
。Johannes是一名登山爱好者,一直想和朋友们分享自己从大本营出发到登顶的全过程。但当他试图将用GoPro拍摄下的录像快进浓缩成较短的视频时,他意识到自己想要和朋友们分享的愿望要落空了,因为市面上没有一种修复抖动的软件能让抖动的画面稳定下来。传统的抖动修复技术是将画面边缘的像素删除,来使得前后画面连贯起来。但面对第一人称的头戴式录像,晃动使得画面发生跳跃,要得到可以观看的视频就需要全新的解决思路。

于是Johannes与微软交互视觉媒体组(Interactive
Visual Media
Group
)合作,开始了名为“Hyperlapse”的全新技术的研发,它能将抖动的第一人称录像转化成具有延时摄影效果、且稳定而流畅的视频。效果请见演示视频:

Johannes和同事们采取的方法是,首先根据原始视频,通过算法还原相机在拍摄过程中的运动轨迹,以及相机相对于每一帧画面中物体的距离和角度。接着,优化并模拟出一条相比原来更顺滑的相机运动轨迹,并从原始视频中抓取、拼接像素来重建在这条新轨迹下的场景,从而输出一段延时摄影效果的稳定、流畅的视频。

相机运动路径的还原与重构

日前,该项成果的论文已经被在温哥华召开的SIGGRAPH
2014
接受。SIGGRAPH是由ACM
SIGGRAPH(美国计算机协会计算机图形专业组)主办的计算机图形与交互技术年度顶级会议。下面的视频更详细地介绍了背后的技术原理:

Johannes表示这绝不是这项技术的终点。他和同事们已经设计了一系列新算法来让加快渲染新视频的过程和减轻对计算机运算能力的负荷,最终他们计划将这项技术产品化,将其以Windows
应用的形式呈现给普通用户。

——————————————————————————————————————————————

相关阅读:

Hyperlapse: Technology that
can dramatically smooth motion in first-person
videos

微软研究院在2014年SIGGRAPH的成果展示

2014年SIGGRAPH官方网站

欢迎关注:

微软亚洲研究院官方网站:http://www.msra.cn/zh-cn/default.aspx

微软亚洲研究院人人网主页:http://page.renren.com/600674137

微软亚洲研究院微博:http://t.sina.com.cn/msra

微软Hyperlapse技术:让第一人称摄像稳定而流畅的更多相关文章

  1. Microsoft Hyperlapse——让第一人称视频更快更流畅

    Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...

  2. 微软HoloLens技术解谜

    HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的 ...

  3. 微软开放技术(中国)携 CKAN 和 OData 技术引入基于 Azure 的开放数据平台

    今天,微软开放技术(中国)通过微软公有云Azure引入一个全新的开放数据平台,该平台基于开源数据门户解决方案 CKAN,以及由微软开放技术(中国)特别针对中国市场优化的ODATA插件来增强其国际化和本 ...

  4. 微软的技术态度 -- 从其对于CRT的设计考虑说起

    很多人从C语言学习过来的人都知道,在编写程序时用到的像printf这样的函数,是作为该语言标准库函数提供的,这也是C语言标准中规定的内容.因此,操作系统必须对其保持一定程度上的透明,也就是说,作为一个 ...

  5. 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库

     发布于 2014-02-10 作者 陈 忠岳 持续集成 (CI) 的历史源远流长, 其宗旨在于软件团队在敏捷环境中不断将他们的工作整合为持续构建.管理 CI 进程的工具已存在一段时间.过去几年中 ...

  6. 【转】265行JavaScript代码的第一人称3D H5游戏Demo

    译文:http://blog.jobbole.com/70956/ 原文:http://www.playfuljs.com/a-first-person-engine-in-265-lines/ 这是 ...

  7. 微软RPC技术学习小结

    RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种.由于这项技术在自己所在项目(Window ...

  8. 微软的技术态度 -- 从其对于CRT的设计考虑说起(Thought on the CRT - What Microsoft Prefers)

    很多人从C语言学习过来的人都知道,在编写程序时用到的像printf这样的函数,是作为该语言标准库函数提供的,这也是C语言标准中规定的内容.因此,操作系统必须对其保持一定程度上的透明,也就是说,作为一个 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 代码工程地址: https://g ...

随机推荐

  1. 数据类型操作简单对比(R和Python)

    一.R方面 R中类型:向量(vector).数据框.矩阵.列表 数据处理转换时:数值型num.因子(factor).字符型等等 1)matrix feature:1.二维数组2.每个元素必须有相同的数 ...

  2. JAVA初学者——算数运算符

    Hello!大家好,我是浩宇大熊猫,又是学习java的一天,开开森森~ 运算符:也就是对常量或者变量进行操作的符号 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式,不同的 ...

  3. mysql脚本文件

    DELIMITER $$ -- USE `dev_seal_chip_sell_ms_v1`$$; DROP FUNCTION IF EXISTS `GET_ORDER_STATUS`$$ CREAT ...

  4. PAT Advanced 1049 Counting Ones (30) [数学问题-简单数学问题]

    题目 The task is simple: given any positive integer N, you are supposed to count the total number of 1 ...

  5. Postgresql的导表

    背景 前面已经介绍了常用的备份与恢复了,接下来介绍一下导表. 正文 很多情况,会有把数据导出的需求,轻重缓急总会有特别紧急的情况,但是又不是专业干db的人,还是记录下来,以防不时之需. 针对于导表,个 ...

  6. MySQL笔记(二)——查询数据

    数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单的查询数据库中存储的数据,还应该是根据需要对数据进行筛选,以及确定数据以什么样的格式显示.本篇笔记主要介绍单表查询,子查询,连接查询. ...

  7. \_\_getattribute\_\_

    __getattribute__ 一.__getattr__ 不存在的属性访问,触发__getattr__ class Foo: def __init__(self, x): self.x = x d ...

  8. Python笔记_第二篇_面向过程_第二部分_4.常用模块的简单使用_import语句的解释

    1. import语句.from...import语句.from...import*语句 解释:注意一定要在体同一级目录下 1.1 引入模块 格式:import module[,module2,... ...

  9. 画张自己能理解的dotnet core 微服务图

  10. 吴裕雄--天生自然 PYTHON3开发学习:字典

    dict = {'} dict1 = { 'abc': 456 } dict2 = { 'abc': 123, 98.6: 37 } dict = {'Name': 'Runoob', 'Age': ...