@jiehanwang
2017-06-30T00:48:32.000000Z
字数 7580
阅读 9253
图形学
计算机视觉
陀螺仪
作者介绍:王汉杰,腾讯WXG微信事业群员工,毕业于中国科学院计算技术研究所,获博士学位,研究方向为计算机视觉。
文中图示1,6,9,10,12,15,16,17为Gif图,纸质版请前往链接
本文对视频的防抖原理作一描述,并给出实践中的填坑经历。视频由手机拍摄,实时处理,需要利用其陀螺仪信息。Video Stablization, 即视频增稳,又名视频防抖、稳拍等。合作者:morajiang,summychai,hongwenxie,mattzhu。
视频增稳的算法主要包括三个部分。第一部分是记录、计算各帧的相机姿态。第二部分是给出虚拟相机平滑路径的规划。第三个部分是视频帧的Warp显示。
就第一部分而言,通常采用两种方法来计算视频帧的变换。第一种方法是基于视觉[1-5],第二种方法是基于陀螺仪[6-8]。基于视觉的方法通常使用Homography矩阵表示,基于陀螺仪的方法则使用四元数表示。基于视觉的方式处理速度相对较慢,而且严重依赖于特征点检测,并不适合在手机上作为一个实时应用,这是我们的工作中经历的第一个坑!第二种方法需要在拍摄视频的同时记录相应的陀螺仪数据,而目前大部分手机都具有陀螺仪设备,所以手机视频防抖适合采用第二种方法。
就第二部分而言,其最佳路径可以理解为拍摄时平稳的相机姿态变化,表现为拍摄画面流畅,没有剧烈抖动的场景变化。因为手机视频多为手持拍摄,所以真实的相机姿态存在抖动、不平稳的现象。于是,在真实相机姿态变化过大的情况下,需要进行调整,得到虚拟相机姿态。实际操作过程中,就是要对实际相机拍摄到的场景画面进行变换,得到虚拟相机拍摄的画面。由此带来了图像变换的问题。下图来自文献1,以三帧为例,每一帧中的白色框为最后得到的虚拟相机拍摄的画面。这个操作将原来晃动的三帧图像变成了几乎静止的画面。但是付出的代价是要裁掉白框以外的其余部分。
Grundmann等人1将路径规划问题形式化为线性规划问题,该优化问题存在三个约束:Inclusion,Proximity和Saliency。Inclusion约束了在裁边一定的情况下,变换之后的帧画面必须可见,不能出镜。Proximity约束了平滑的路径要保持拍摄者原有的意图,可见的帧画面要高于预定的一个比例,即,裁掉尽量少的边。第三个约束偏向艺术,作者只是作了介绍,在实现部分并没有采用。Liu等人[2]提出Predicted Adaptive Path Smoothing (PAPS)的算法对路径进行平滑。他们利用雅各比迭代进行求解。Bell等人[8]践行Inclusion原则,将接近出镜的区域分等级,称为outer region和inner region。Inner Region属于可接受范围,允许正常变换,而outer region属于危险区域,越接近惩罚越高。第二部分的算法是视频稳定最核心的部分,也是和其他应用相比独有的部分。
就第三部分而言,需要根据每一帧图像的变换矩阵,对图像进行变换、显示。在确保运行效率的同时,尽可能清晰地显示图像。
从相邻两帧的角度出发,视频防抖的目标就是通过图像映射变换,将其中一帧图像和另外一帧图像对齐,期间将不可避免地产生这两帧边界的裁剪。处理视频防抖一般有四个境界,如图3所示。第一个境界中的映射变换是只对画面作平移操作,第二个境界加入了绕Z轴的旋转,第三个衍变成为单应矩阵的变换,第四个境界加入了修正因手机摄像头导致的物体形变(Rolling Shutter效应,下文将作介绍)的功能。
由于手机重量轻,用户拍摄随意,通常会边走动边拍摄,其画面抖动程度可想而知。尤其是随着屏幕的增大,小抖动带来的不适感越来越重。而手机中的陀螺仪忠实地记录着用户的手抖历程。下图是手机中陀螺仪数据采集所基于的坐标系。
试想,如果陀螺仪绕Z轴顺时针转动,相对于手机屏幕,拍摄的画面等同于逆时针转动。那么只要对拍摄的画面顺时针转动,在屏幕上观察,这个画面就保持静止。“就是这么简单”,在遇到一系列坑之前,大家都是这么想的。
首先摆在眼前的问题是,如何将陀螺仪获取的三维手机位姿,和平面图像的转动、平移联系起来。视频画面体现在屏幕上是平面的,在不考虑三维建模的情况下,其抖动主要体现在绕Z轴的转动和沿水平和竖直方向的平移,以及下文将会提到的因为卷帘门效应(Rolling Shutter)带来的画面扭曲。从专家处获悉,相机内参能够实现根据陀螺仪姿态计算图像的抖动数值。直观地理解,从图4中可以推测,绕X轴的转动在视频帧画面上的表现应该是上下平移,而绕Y轴的转动在视频帧画面上的表现是左右平移,绕Z轴转动则是画面的反方向转动。因此,只需要知道绕这三个轴转动的角度,就可以着手处理视频,去其抖动。并且手机陀螺仪对这三个角度的测量和计算是十分精确的。
这三个角度称为欧拉角。我们的方法的第一步是将欧拉角转换成四元数,第二步进行平滑运算,第三步将四元数转换R矩阵以描述每帧画面的变换,第四步结合R矩阵和相机内参矩阵生成可供图像变换用的T矩阵。其中第四步需要知晓相机的内参。以下代码片段是用来将欧拉角转换成四元数。四元数能够以四维空间的视角对三维空间中相机的姿态做平滑的矫正。具体可以参考这个链接。
//欧拉角-->四元数
Quaternion EulerToQuaternion(float roll, float pitch, float hdg)
{
Quaternion q_ret;
float cosRoll = cos(roll * 0.5);
float sinRoll = sin(roll * 0.5);
float cosPitch = cos(pitch * 0.5);
float sinPitch = sin(pitch * 0.5);
float cosHeading = cos(hdg * 0.5);
float sinHeading = sin(hdg * 0.5);
q_ret.q0 = cosRoll * cosPitch * cosHeading + sinRoll * sinPitch * sinHeading;
q_ret.q1 = sinRoll * cosPitch * cosHeading - cosRoll * sinPitch * sinHeading;
q_ret.q2 = cosRoll * sinPitch * cosHeading + sinRoll * cosPitch * sinHeading;
q_ret.q3 = cosRoll * cosPitch * sinHeading - sinRoll * sinPitch * cosHeading;
return q_ret;
}
第二步将在第三章进行详细解说,它的结果是输出每一帧的真实相机姿态向虚拟相机姿态的转换四元数。在四元数平滑结束后,第三个步骤将每一帧的变换四元数转成R矩阵,以供第四步的矩阵运算用。相机内参可以表示如下,并通过相机标定和利用OpenCV相关库计算得到。
在得到相机内参之后,根据第三步得到的R矩阵,可以计算出图像的变换矩阵:
为了确定用陀螺仪计算得到的与用图像本身通过计算机视觉计算的转换矩阵的差异不大,我们做了如下实验。定义用陀螺仪计算得到的变换矩阵为,定义用图像方法得到的为。实验分别采用同一段视频根据这两个矩阵进行变换,取其中的Y轴偏移作为观察,得到实验结果如图5所示。为了更好地显示,陀螺仪的采样率和图像保持一致,均为30帧每秒。这种方法还可以用来校正陀螺仪和视频画面在时间轴上的差异。
因为CMOS相机在拍摄视频时采取逐行扫描的方式,所以高频率抖动相机(快于一帧刷新时间)会使得同一帧内的景物出现扭曲的效应,称之为Rolling Shutter效应,简称RS效应。图6是RS效应的一个示例,可以发现窗户发生了极大的扭曲。您还可以试试在高铁上拍摄飞驰而过的电线杆。
Rolling Shutter的解决方法通常可以采用文献[12]中的方法进行。我们也是这样处理,首先将图像分成m条,然后在各帧之间平滑第1条图像的R矩阵,最后再将本帧内的其他R矩阵统一对齐到第1条。为了得到平滑的结果,不致使一帧内的各条之间过渡太过生硬,加上高斯平滑。下图同样来自文献[12]。
这里,陀螺仪数据发挥了重要的作用。我们知道,图像刷新频率低于陀螺仪数据采集频率。iPhone中陀螺仪的数据采集频率一般为100Hz,图像的刷新视不同的机型而定,在iPhone 6中大约20ms左右刷新一帧图像。值得一提的是,这和图像30帧/秒的帧率是不同的概念。确定的帧率在任何机型上都是一样的,而图像的刷新视机器的性能而定。图8展示了在1帧图像刷新的同时可以采集3帧陀螺仪数据的样例。这三帧陀螺仪数据可以确定图像帧的第1条、第m/2条和第m条的R矩阵。中间其他图像条的R矩阵可以通过插值估计。
图9从左到右依次是:原始剧烈抖动的视频,没有经过RS矫正的增稳视频,经过RS矫正的增稳视频。从下面第二段视频很容易看出,画面的右半部分基本稳定,而左半部分还是处于抖动状态。这是因为在没有经过RS矫正的样例中,所有的图像条都采用第1条图像的陀螺仪数据,导致了最左边的图像条(即,第m条)和陀螺仪数据在时间轴上完全不吻合。注意到,iPhone是沿着Y轴刷新图像的,右边先于左边。
视频Zoom的时候,相机内参也会相应改变。但是,只要对矩阵稍作修改,将X和Y的焦距乘以Zoom倍数即可。
由于四元数在三维空间角度处理中的优异特性,在获得欧拉角以后,路径积累和平滑都是在四元数这个空间下进行。因为2.2节已经给出了两帧之间的变换四元数的获取和计算,所以很容易扩展到所有帧的原始路径的积累。其输出就是所有帧的,用四元数表示的,相机姿态变化。
Youtube的算法1应用了计算量巨大的线性规划。微软的离线[2]算法努力地去解一个最优化方程
其实,使用什么平滑方法并不重要,重要的而且具有挑战的是如何对平滑进行约束。不加约束的美展示出来是这样的:
可以发现,基本上每一帧画面都有部分出镜。这是因为真实相机姿态已经被平滑方法进行了大幅度的调整,而该姿态指向的场景是用户不曾拍摄的,因而出现了大片的无内容区域。为了增稳,这种方法已经违背了用户的拍摄意愿,把增稳变成了执念,违背了“一切以用户价值为依归”的理念。所以,防抖应该局限在一定范围内,既要尽可能地减少因为出镜导致的画面内容减少,又要保证画面的平滑运动。这里用到的方法有两种:
自适应空间域裁边,对运动幅度小的视频保持小的裁边,对运动幅度大的视频,以牺牲画面内容来保证视频的平滑流畅。
自适应时间域平滑,对运动幅度小的帧采用较宽的平滑窗口,对运动幅度大的帧则采用较窄的平滑窗口。这样,对于大幅度、高频率晃动的镜头,平滑窗口只可能包括本帧,因此算法不会对这一帧的相机姿态做出调整,因而也就没有画面出镜的风险。下图为一段视频自适应窗口变化的示例。本方法不仅不会因为突然地晃动产生黑色空白区域,还能处理同时具有稳定和不稳定拍摄内容的视频,且平滑的窗口变化能够带来平滑的处理结果。
上文的第一种方法属于空间域的处理,裁剪的大小和平滑的程度形成了一种权衡。第二种方法属于时间域的处理,对抖动视频做出了不遗余力的挽救。如果说后者是一种方法,前者可能是一种哲学。二者在同一个框架下做迭代。本着先方法,后哲学的亲民态度,首先对窗口进行自适应计算,然后再对裁边进行有节制的自适应调整。下面是一个简要的流程图:
图14. 平滑策略流程图
Warp方法采用了从虚拟相机姿态向真实相机姿态的逆向映射的方法,并结合双线性插值保证变换后的图像具有清晰的视觉效果。整体用IOS的shader实现,效率高,能够实时运行视频增稳。
下面给出视频增稳的一些应用场景和结果。
1 M. Grundmann, V. Kwatra, and I. Essa, "Auto-directed video stabilization with robust L1 optimal camera paths," in CVPR 2011, 2011, pp. 225-232.
[2] S. Liu, L. Yuan, P. Tan, and J. Sun, "Bundled camera paths for video stabilization," ACM Transactions on Graphics (TOG), vol. 32, p. 78, 2013.
[3] M. Grundmann, V. Kwatra, and I. Essa, "Cascaded camera motion estimation, rolling shutter detection, and camera shake detection for video stabilization," in Patent, ed: Google Patents, 2016.
[4] F. Liu, M. Gleicher, H. Jin, and A. Agarwala, "Content-preserving warps for 3D video stabilization," ACM Transactions on Graphics (TOG), vol. 28, p. 44, 2009.
[5] S. Liu, L. Yuan, P. Tan, and J. Sun, "SteadyFlow: Spatially Smooth Optical Flow for Video Stabilization," in 2014 IEEE Conference on Computer Vision and Pattern Recognition, 2014, pp. 4209-4216.
[6] A. Karpenko, D. Jacobs, J. Baek, and M. Levoy, "Digital video stabilization and rolling shutter correction using gyroscopes," CSTR, vol. 1, p. 2, 2011.
[7] B. Poling and G. Lerman, "Enhancing feature tracking with gyro regularization," Image and Vision Computing, vol. 50, pp. 42-58, 2016.
[8] S. Bell, A. Troccoli, and K. Pulli, "A non-linear filter for gyroscope-based video stabilization," in European Conference on Computer Vision, 2014, pp. 294-308.
[9] B. D. Lucas and T. Kanade, "An iterative image registration technique with an application to stereo vision," 1981.
[10] C. Tomasi and T. Kanade, "Detection and tracking of point features," 1991.
[11] G. Thalin, "Deshaker–video stabilizer," Online at: http://guthspot. se/video/deshaker. htm, 2011.
[12] M. Grundmann, V. Kwatra, D. Castro, and I. Essa, "Calibration-free rolling shutter removal," in 2012 IEEE International Conference on Computational Photography (ICCP), 2012, pp. 1-8.