视频稳像笔记

来源:互联网 发布:移动端一键复制文字js 编辑:程序博客网 时间:2024/04/30 02:23

算法原理

视频稳像(Video Stabilization),又称电子增稳,是指利用相关的算法,对视频设备采集的原始视频序列进行处理,去除其中的抖动。视频稳像的目的,一方面是为了让人眼观感舒适,有利于人工观测、判别等,另一方面也作为诸多其他后续处理的预处理阶段,如检测、跟踪和压缩。

经典的稳像算法一般包含3个步骤:
1. 全局运动估计
    全局运动指视频中背景的运动。全局运动估计要获得准确的运动信息,排除局部运动等各种干扰的影响。主要途径有微分方法(包括KLT光流法)和特征点对应法。
2. 运动补偿
    运动补偿是指对全局运动进行修正,使主观运动与抖动分离,是视频稳像的实质所在。运动补偿分为基于参数滤波和基于轨迹平滑两类。基于参数滤波是指把描述运动的参数看成需要的主观运动和加性抖动的叠加,采用一定的滤波器使得加性噪声运动被抑制,如采用Kalman 滤波;基于轨迹平滑则将摄像机的运动轨迹看成带噪声的运动轨迹,使用约束优化方法获得平滑运动分量。
3. 图像生成


算法使用

较新版本的Matlab提供videostabilize_pm例程。该例程使用FAST特征在相邻两帧之间进行匹配,然后使用estimateGeometricTransform函数求解变换矩阵。
estimateGeometricTransform函数编写优秀,其使用SVD分解计算误差最小的变换矩阵,并借助MSAC(M-estimator Sample Consensus)算法剔除错误匹配外点。
例如,求解仿射变换的代码如下:

function T = computeAffine(points1, points2)numPts = size(points1, 1);constraints = zeros(2*numPts, 7);constraints(1:2:2*numPts, :) = [zeros(numPts, 3), -points1, -ones(numPts,1), points2(:,2)];constraints(2:2:2*numPts, :) = [points1, ones(numPts,1), zeros(numPts, 3), -points2(:,1)];[~, ~, V] = svd(constraints, 0);h = V(:, end);T = coder.nullcopy(eye(3));T(:, 1:2) = reshape(h(1:6), [3,2]) / h(7);T(:, 3)   = [0; 0; 1];

OpenCV提供videostab类专门用于视频稳像,还有相应例程全面选择比较各种特征点和轨迹平滑算法。

Feng Liu所做的研究适用于更为复杂的情况,比如相机缺乏视差(parallax)的情况。他们采用了更为精致的移动模型和矩阵优化方法,使得视频轨迹适用于相机平移、摇动、变焦等复杂情况。demo效果优秀

Microsoft的方法基于三维场景重建,可以在快放时仍然保持大范围场景的观赏性,主要适用于第一人称大抖动的场景稳定(用“重建”这个词可能更恰当),比如滑雪视频。


基于摄影显著性区域的L1运动补偿算法

Auto-Directed Video Stabilization with Robust L1 Optimal Camera Paths
该算法通过选取显著性区域并基于专业摄影镜头准则对镜头路径进行稳定性控制。通过将平滑路径打断为静止、线性、抛物线各段分别优化,避免了各段的混叠,可以实现真正静止的镜头而不是带有微小残留的移动。此外,还可以消除(由人手持相机走动导致的)低频弹动。该算法使用线性规划求解各种约束,比如“裁剪框应包含于视频帧内部”。
从摄影学的观点上说,最好的观看体验应通过三种方式传达:静止相机、三脚架上的扫视、摄影手推车推拍。方式之间通过剪辑和过渡效果切换。我们希望算法输出的相机路径符合摄影学原则,对应上述三种方式的是路径的一阶导数、二阶导数、三阶导数为零。为了得到三种方式的组合而不是混叠,我们将该优化问题转化为L1最小化问题。L1优化结果具有“稀疏性”,更容易使某些系数降为0,寻找恰好满足上述约束的解,从而使大部分所得路径是静止的。与之不同的是,L2最小化将在平均(平方和)意义下满足约束,这会导致不为零的小幅移动始终存在。之所以会有这一区别,是因为L1范数的最优解更容易出现在坐标轴的拐点处(不可导点),而L2范数的最优解是在可导点。
I1,I2,...,In为视频帧序列,Ft(x)为相邻两帧(It1,It)之间特征点x的移动关系。以仿射变换Ft表示

Ft=A(x;pt)=(atctbtdt)(x1x2)+(dxtdyt)

也可以等价表示为参数向量pt=(dxt,dyt,at,bt,ct,dt)
Ct=Ct1FtCt=F1F2...Ft
表示以第一帧为基点的移动路径。增稳后的路径为
Pt=CtBt
其中Bt是待求的稳定矩阵。
优化目标为
O=ω1|D(P)1|+ω2|D2(P)1|+ω3|D3(P)1|

如果无约束,该目标的优化结果会是平凡的Pt=I
1. 最小化|D(P)|1

|D(P)|=t|Pt+1Pt|=t|Ct+1Bt+1CtBt|=t|CtFt+1Bt+1CtBt|t|Ct|Ft+1Bt+1Bt|

在已知Ct下,只需最小化t|Rt|=t|Ft+1Bt+1Bt|
代入仿射变换|Rt(p)|=|M(Ft+1)pt+1pt|
2. 最小化|D2(P)|1
|D2(P)|=t|DPt+2DPt+1|=t|Pt+22Pt+1+Pt|

由于我们用的是加性误差模型而不是乘性(我没明白),转而最小化:
|Rt+1Rt|=|Ft+2Bt+2(I+Ft+1)Bt+1+Bt|

3. 最小化|D3(P)|1
|Rt+22Rt+1+Rt|=|Ft+3Bt+3(I+2Ft+2)Bt+2+(2I+Ft+1)Bt+1Bt|

我们添加以下合理的约束:
1. 变换Bt不能太强,应保留原始视频画面的运动趋势:
lbUptub
其中
0.9at,dt1.1
0.1bt,ct0.1
0.05bt+ct0.05
0.1atdt0.1
2. 裁剪框不能超出画面边缘:
(00)(1001cxi0cyi00cxi0cyi)pt(wh)

使用线性规划方法(单纯形)可以有效求解这一问题。此外,还可以进一步添加约束以使得显著性特征点位于裁剪框内

0 0