阅读更多

【编者按】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主要应用于嵌入是系统开发

  • 【ShortBrain】(十二)——Big Picture

    Story  The story's  title is Big picture.I'll introduct the  crazy story for you. There was the most famous dog. It's Athena. So why did Athena become the famous dog.Now I'll tell to you. The first...

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

    小冬冬历险记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 ...

  • Java高手是怎样炼成的?阿里p8都强烈推荐的高手真经!

    Java语言包括广泛的应用技术和应用领域。从应用技术或软件包来说,它包括Java标准版本软件包Java SE、Java企业版本软件包Java EE,以及Java微型版本Java ME。从软件开发及应用领域来说,它包括桌面应用编程、Web客户端编程、服务器编程、移动设备(如手机)编程以及机器人编程等。

  • C++实战之程序书法

     可能大家都没有想过这个问题。可能还有人会问,程序怎么还有书法的?不错,程序是有书法的。那就是---程序的版式。版式虽然不影响程序的功能,但是会大大影响程序的可读性和可维护性,程序的版式追求的是清晰、美观,这也是程序版式组成的重要因素。相信大家都写过字,好的书法可以让文章赏心悦目,如行云流水;差的书法则如蛇蝎爬行,索然无味。许多科班出身的程序员对此也是一知半解,请大家一定要好好学习,来弥补

  • 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这...

  • Java学习贴(转)

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

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

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

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

    转自:https://www.pinlue.com/article/2021/07/0906/5111642342746.html 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

  • 【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年前是完全不同的。但是,...

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

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

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

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

  • 如何防止Edit框中的Password不被非法获取

       Windows虽然是一个功能强大的操作系统,但其存在的一些先天性不足,给黑客留下了许多可乘之机,著名的BO程序就是利用Windows的这些漏洞来危害计算机的安全。笔者最近发现了一个很流行的专门获取Edit框Password的工具,甚至其源代码已在某报纸发表,这无疑是对Edit的Password功能的完全否定。本文将首先分析非法获取Password的原理,然后给出用Visual C++来实现保

  • 画好了一个杯子,哈哈!

     老师让我用CAD画个杯子,以前从来没接触过CAD,也不屑于用CAD的我,居然画了个那么丑的杯子出来,简易杯子(没手柄),简易方法:居于二维坐标下画了个“L”形,由于杯子是有厚度的,所以在设计的时候要留出一点高度,这一点高度也就是杯子底的圆心处咯,以这个高度为轴,用实体旋转命令输入360度,一个简单的杯子就出来了。需要注意的是:1.坐标的选择不好的话,杯子就是躺在你面前了2.实体旋转命

  • 在VB中用API实现多媒体

    在VB中用API实现多媒体主要是调用Windows的mmsystem.dll库。以下为调用API的声明(这些代码放在程序的声明部分中): 1.′播放CD和AVI所需要的声明。   Declare Function mciSendString Lib ″MMSYSTEM″(ByVal lpstrCommand as String,ByVal lpstrReturnStr as Any,By Val

  • 高德地图sdk的AMapNavi.getInstance为null解决办法

    问题,动态库没有全部导入,之前我只放到了armeabi下,可是没想到我手机是armeabi-v7a的。 最近做Android项目,先用的是百度地图,可是后来发现百度地图没有提供地图的View点击事件(它提供的是自定义的点击,不是Android的View的) 后来改用高德地图试了一下,发现有View点击事件,而且模块化做的比百度好。不过也有很坑的事,就是提供的代码范例里,全部是分开的,没有一...

Global site tag (gtag.js) - Google Analytics