阅读更多

【编者按】Instagram是全球知名的社交网络之一,用户数量高达数亿人。日前,Instagram推出了一款新视频应用Hyperlapse。它是一种延时摄影技术或功能,用户们可以利用该应用将长时间拍摄的视频压缩成一段很短的视频,从而创建出“高质量的延时视频”并导入Instagram。

 

对于这样一款应用,很对业界人士认为它将很快被主流用户接受并对所有人乃至整个社会造成巨大的影响。很多人都会好奇,它是如何实现的?采用了哪些算法、技术原理?本文将为你一一揭秘! 

 

译文如下:

 

8月27号,Instagram正式推出了能让手机进行高质量延时摄影的应用—Hyperlapse,目前推出的是iOS版本并且加入了可缓解轻微抖动的算法。星空轨迹、云海泛波这些以前只能在探索频道才能看到的大片,现在都可以通过自己的手机来“自嗨”一番了。对于一般用户来说,手持安全快门的极限基本是1/30~1/20秒,对于动辄10多分钟乃至几小时的延时摄影来说,如何有效消除抖动,还原最清晰的图像是难点所在。 

 

打开Hyperlapse,它只有两个圆形按钮,一个用于对焦,一个用于开始录像,但是它真的就这样简单吗?它背后又藏有怎样的奥妙?延时摄影算法作者Alex Karpenko(2013年,Instagram收购了初创公司Luma)接下来将会从算法和技术原理的角度来为大家进行讲解。 

 

影片稳定(Cinema Stabilization) 

 

要想来一段流畅顺滑的视频,影片的稳定与否起着决定性作用。比方说电影拍摄,我们所看到的那些完美的第一人称视角运动影片,都是拍摄者戴着高端动作分离器来完成的,把多余的抖动从中分离然后计算,最后进行镜头补偿等专业处理。但是对于手机用户而言,最高端最便捷的设备就是手中的爱机了。因此我们为它开发了Cinema系统,利用的硬件是手机内建的陀螺仪,用来测量和消除抖动。陀螺仪的原理就是:一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。因此如果T2时间的镜头方向(轴方向)与T1时间有差别,那么T1T2之间的影片就可能是抖动时产生的,我们要做的就是找出这些缺陷影片,进行去粗存精。 

 

下面是Cinema稳定算法的示意图。



 

输入:

  • 陀螺仪记录的信息
  • 影片帧数据

输出:

 

正确的镜头方向(镜头校正)。简单来说,就是排除抖动或外力震动等干扰因素后,得到的正确镜头方向数据(源方向)。 

 

然后,去粗后的镜头方向数据会作为筛选条件,进入第二个处理环节-影片筛选(StabilizationFilter),该流程如下所示: 


每个输入帧都会根据去粗镜头方向数据进行修正处理,然后输出稳定影片帧数据。

 

下面的这段视频说明了Cinema算法是如何进行镜头清抖处理的。在最终输出的影片中,外围白线范围内为可视区域,被拉伸变形的帧永远不会超出既定的白线边缘,因为我们的稳定算法在计算时,除了提供修正处理,还会考虑变形造成的过渡不连贯问题,避免在最终影片中出现诸如白边超界等突兀问题。我们采用的方法是拉伸修剪,简单说我们把一个图片旋转了某个角度,那么边角地方可能会出现留白情况,稳定算法就会计算这个留白位置,给出缓冲范围,然后把图片进行拉伸,把留白填满,从而变得“圆满”。 


点击查看视频

 

镜头方向计算采用离线计算模式,同时稳定筛选器将以30fps帧速率进行高速图像加成。此外,我们还混合使用了FilterKit,它构建于OpenGL之上,在实时图像处理方面也进行了优化处理。 

 

Hyperlapse回放稳定(Hyperlapse Stabilization) 

 

在Hyperlapse中,提供了一个进行回放速率调整的滑块按钮。可调(快进)范围是1X到12X倍速。 

 

在Cinema算法中,我们只会按需进行镜头重算,因此被重算的帧才会被进行拉伸补白处理。经过该有选择性的处理后,在更长延时摄影中,即使输入的不稳定视频帧数量可能会有所增加,最终输出的都是过渡自然、平滑的视频。具体可参见下面的示例影片:


点击查看视频 

 

自适应缩放(Adaptive Zoom) 

 

如前所述,我们会利用图像放大来抵消图像转向的留白问题。一般情况下,这是以牺牲分辨率为代价的。然而,在Cinema中,会根据抖动量来进行智能放大处理。请看下面的示例: 


点击查看视频 

 

左边的视频只出现了少量的抖动,因为是固定拍摄的。在该情况下,我们只需进行微调放大处理即可,杀鸡焉用牛刀嘛。右边的视频是行走状态下拍摄的,抖动就比较厉害了。因此,放大的缓冲量会有所增加以足够抵消抖动影响。由于放大后,可视范围变小,因此在分辨率和稳定变换之间需要作一个权衡。我们的战略是以分辨率为主。在高回放速率下(例如12x),我们会考虑每个可提速的因素进行调整。 

 

综合 

 

台上10分钟,台下10年功。每当你进行滑块调整时,Hyperlapse在背后默默地进行了如下处理:

 

  1. 来自解码器的视频帧会工作于新的回放速率。
  2. Cinema稳定器会即刻工作于一后台线程,根据新的回放速率和放大量进行智能放大计算和镜头方向重算。
  3. 在当前速率下,镜头重算数据和球形插值一起工作,输出修正后的帧。
  4. 一旦出现新的镜头方向数据,旧的数据会被替换。

以上步骤,都不会影响任何的播放体验,可以说是无声无息地完成的。

 

笔者之体验:

 

随即,笔者也下载了这款应用,试用后给我的感觉是简洁、方便。但心急吃不了热豆腐。使用时建议尽量延长录像时间(2分钟以上),并且选择动静变化较大的场景,例如:晚上熙熙攘攘的十字路口、川流不息的商业街道,最后得到的效果会令人赞叹。否则,如果在办公室那样安静的环境,录取了几十秒就迫不及待地去看效果,那么结果是会平淡甚至稍感失望的。

 

如果还想更多了解它对抖动帧的处理,不妨在录像时故意进行大幅度抖动或平移,然后选取几个原场景参照物(如灯管边缘,马路边缘)作为参考。对比下,最后输出的视频里,视野与抖动之间是什么关系,抖动与最后输出的平滑视频又有怎样的差别。

 

英文出自: Instagram-engineering 

 

 

  • 大小: 39.9 KB
  • 大小: 42.5 KB
  • 大小: 225 KB
  • 大小: 222.9 KB
  • 大小: 346.6 KB
来自: CSDN
0
0
评论 共 1 条 请登录后发表评论
1 楼 deific 2014-09-03 17:38
没有安卓版本啊,据说因为安卓的api太低级,没法用

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 这么去学好java 理解 j2se j2me j2ee

    要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发

  • 小冬冬历险记_火花隙历险记

    小冬冬历险记I wanted to build a spark gap transmitter-you know, for fun. However, things didn’t start off so great. Here is how it went down. 我想制造一个火花隙变送器,这很有趣。 但是,事情并没有开始那么好。 这是怎么回事。 My first plan was to ...

  • _findnext访问冲突 // 0xC0000005: 读取位置 0x0000000000000010 时发生访问冲突 // x86转到x64平台编译错误

    网上有很多出错的原因和解决办法,因人而异,但是我出错的原因,你可能没有了解过,高人指点我说,访问冲突一般是数组越界,指针那些。 我们要明白一点,很多变量在x86和x64位情况下大小是不一样的。我出错的原因就是用到了一个文件夹查找函数_findnext(long handle, struct _finddate_t *fileinfo),这个函数不用知道干嘛的,但是要知道的是:long型在x86和x64系统中大小均为4字节,但是指针在x86系统中大小为4字节,在x64系统中大小为8字节,然后这个函数内部可能是

  • Java研发方向如何准备BAT技术面试答案(上)

    最近因为忙于工作,没时间整理,本篇是下班后晚上抽空整理的,文中部分答案本来是想自己好好整理一份的,但是时间真的很紧,所以就整理了一下网络上的文章链接,挑了写的不错的文章,后续有时间补上来。 1.面向对象和面向过程的区别 面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

  • 学习的理论------java学习

          今天在网上遇见了个很久没见的朋友,聊了一会,听说他在做java,我说我也是哦,但是我是个新手,呵呵,他给我发了篇文章,恩,真的不错,虽然我好久之前看过,但是觉得每看一次真的觉得收益匪浅啊,拿来大家一起分享,希望朋友们看了也会有所收获!                   如何迅速成为Java高手         很多网友朋友问我学习Java有没有什么捷径,我说“没有,绝对没有!”。

  • ​为什么我会选择走 Java 这条路?

    ​本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的微信公众号【黄小斜】也将同步到我的个人博客 www.how2playlife.com 阅读本文大概需要 2.8 分钟。 最近有一些小伙伴问我,为什么当初选择走Java这...

  • 《第一行代码》个人笔记

    第一章 2003年 Andy Rubin等人创办了Android公司 2005年 谷歌收购了这家公司 2008年 谷歌推出了Android系统的第一个版本 1.1.1Android系统架构 Linux内核层 Android基于linux 2.6内核 这层为安卓设备的各种硬件提供了底层驱动 系统运行时层 通过C++为安卓系

  • 1024

    1024

  • Java学习贴(转)

    作者:冠状病毒biss 链接:https://www.nowcoder.com/discuss/445803?source_id=profile_create&channel=0 来源:牛客网 9 月 拿出了本科时的Java书,从任何语言输出 hello world 开始,开始了我的Java之旅。先花了一周草草看完了这本书,然后在b站找了一个黑马的57期培训班视频开始看。 10 月 这个月本科的舍友回来一起玩,当时自己压力很大,在网吧刷题、在酒吧刷题、吃饭的时候刷题,感觉都神经质了。这个月还是看黑

  • JAVA基础:如何才能成为Java开发高手

    转自:https://www.pinlue.com/article/2021/07/0906/5111642342746.html JAVA基础:如何才能成为Java开发高手   其实,我觉得程序设计这玩意是不能急噪的,不可能什么事都能一步登天,应该是一个循序渐进的过程。   如果不是很熟悉java,那么我建议从java的基本语法开始学起,然后再慢慢去掌握java的面向对象编程方法和思想,比如说类、对象、继承、封装、多态、覆盖、重载等等比较重要的知识点。这些都是基础,都是你以后往高深方面发展不能缺

  • 怎么学习Java能真正成为Java编程高手?

    学Java的人现在确实很多,一般选择入行做IT做编程开发的人,基本都把Java作为首选语言。有没有好的Java学习方法能从菜鸟直接变成高手?苏州学码思小编的答案是没有。Java学习没有诀窍,也没有捷径。只有脚踏实地学好Java知识,把理论知识灵活运用实践,多学,多问,多操作,只要这样才能真正成为Java编程高手。   Java学习忌虎头蛇尾。   很多Java初学者刚开始自信满满,买各种关于...

  • TC2.0函数说明

    分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母(A-Z,a-z)返回非0值,否则返回0 int isalnum(int ch) 若ch是字母(A-Z,a-z)或数字(0-9),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0 int i

  • 【C/C++】多进程:信号量的监听与处理函数

    文章结构:wait()的阻塞问题signal()函数讲解示例代码wait()的阻塞问题  之前的多进程:父进程监听子进程状态 wait()的使用文章中,父进程为了获取子进程的SIGSTOP、SIGTERM等信号时,由于调用了wait而导致主进程一直阻塞。在实际的开发中,主进程在等待子进程状态变化时还会有其它的事情要去执行,所以需要一种异步回调机制,让主进程可以在执行其它任务的时候,又可以监听到子进

  • 【TensorFlow学习笔记(一)】变量作用域

    TensorFlow中有两个作用域,一个是name_scope,一个是variable_scope。name_scope主要是给op_name加前缀,variable_scope主要是给variable_name加前缀。 variable_scope variable_scope变量作用域机制主要由两部分组成: v = tf.get_variable_scope(name, shape, dtyp...

  • java人职业规划(摘要)

          很多人刚毕业时充满活力,然而几年的摸爬滚打后,冲劲就会慢慢减弱甚至消失。再加上IT大环境的起伏不定,一旦无法跟上技术或者行业发展的步伐,便会迷茫。王洪超说:"以前晚上睡觉之前想事情,经常都不知道自己以后做什么。  这并不奇怪,工作的新鲜感褪程序员首先需要提高系统设计能力。从2000年以后,软件业的编程思维和模式、方法发生了翻天覆地的转变,与九十年代、甚至2000年前是完全不同的。但是,...

  • AMapNavi.getInstance(this) 返回值为null 的解决方法

    情景 : 高德3D地图中 AMapNavi.getInstance(this); 不返回 AmapNavi 对象 导致空指针异常  原因: 没有拷贝SDK中 解决办法: 将上图文件拷贝到lib目录下

  • 《高质量C++/C编程指南(林锐)》学习笔记

    1. 不可以将布尔变量直接和TRUE、FALSE、1、0进行比较。应该用if(flag)或者if(!flag)。     整型变量直接用”==“或者”!=“与0进行比较。 浮点变量不可以直接用”==“或者“!=”与数字比较。 指针变量用“==”和“!=”与NULL直接进行比较。 2. 可以使用诸如if(NULL == P)来避免if(NULL=P)类错误。 3. 在有循环嵌套的时候,尽量

  • 标准附录A:档次(profile)和级别(level)

    profile 和级别规定了比特流必须要遵守的一些限制要求。 每个profile 都规定了一个算法特征和限制的子集,任何遵守某个profile 的解码器都应该支持与其相应的子集。   每个级别都规定了一组对标准中语法成员(syntax element)所采用的各种参数值的限制。所有profile 都使用相同的一组级别定义,但是单独的一个实现可以对不同的profile 支持不同的级别。在给

  • Java程序员的4个职业发展方向,该如何把握黄金5年?

    在Java程序界流行着一种默认的说法叫“黄金5年”,意思是说,一个Java程序员从入职的时候算起,前五年我选择直接影响着整个职业生涯的发展方向和薪资走向。而这5年,也决定...

  • 草色遥看近却无

                    突然发现路边的树木,远望去略显绿色了,显然这已经是早春了! 不由想起了一首诗: 天街小雨润如酥, 草色遥看近却无。 最是一年春好处, 绝胜烟柳满皇都. [作者简介] 韩愈(768-824),字退之。唐代文学家、哲学家,当时古文运动的倡导者。河南河阳(今孟县)人,祖籍昌黎、世称韩昌黎,晚年任吏部侍郎,又称韩吏部。谥号“文”,又称韩文公,倡导古文...

Global site tag (gtag.js) - Google Analytics