视频稳定使用点特征匹配

这个例子展示了如何稳定从抖动的平台捕获的视频。一种稳定视频的方法是跟踪图像中的显著特征,并将其作为锚点来抵消所有与之相关的扰动。然而,这个过程必须在知道第一个视频帧的显著特征的情况下进行。在这个例子中,我们探索了一种视频稳定的方法,没有任何这样的工作先验知识。它而不是自动搜索在视频序列中的“背景平面”,并使用其观测失真来校正照相机运动。

这种稳定的算法包括两个步骤。首先,我们决定使用视频序列的所有相邻帧之间的仿射变换图像estimateGeometricTransform用于两个图像之间的点对应的函数。其次,我们弯曲视频帧以实现稳定的视频。我们将使用计算机视觉工具箱™,用于算法和显示。

步骤1。从电影文件中读取帧

在这里,我们在视频序列的第一个两帧读取。我们看他们的强度图像,因为颜色是没有必要的稳定算法,并且由于采用灰度图像提高速度。下面,我们显示通过侧两个框架侧,我们产生红蓝彩色合成以说明它们之间的逐像素差。有明显大的垂直和水平的两个帧之间的偏移量。

文件名='shaky_car.avi';hVideoSrc = VideoReader(文件名);IMGA = rgb2gray(im2single(readFrame(hVideoSrc)));%读出的第一帧划分成IMGAIMGB = rgb2gray(im2single(readFrame(hVideoSrc)));%读第二帧分成IMGB图;imshowpair(IMGA,IMGB,“蒙太奇”);标题([“框架A”,repmat(' '[1 70]),“框架B”]);

图;imshowpair(IMGA,IMGB,'ColorChannels',“红蓝”);标题(“彩色合成(A帧=红色,B帧=青色)”);

步骤2。从每个帧中收集显著点

我们的目标是确定一个转变,将在两帧之间的失真校正。我们可以使用estimateGeometricTransform功能这一点,它会返回一个仿射变换。作为输入,我们必须提供一套两帧之间的对应点的这个功能。产生这些书信中,我们从两个帧兴趣先收集点,然后选择它们之间可能的对应关系。

在这一步中,我们为每一帧生成这些候选点。为了使这些点在另一帧中有最好的机会有对应的点,我们想要在突出的图像特征(如角)周围的点。为此,我们使用detectFASTFeatures功能,它实现的最快角点检测算法之一。

来自两个帧中的检测点示于下图。观察有多少人支付相同的图像特征,如沿树线点,大路标的角落,和汽车的角落。

ptThresh = 0.1;pointsA = detectFASTFeatures (imgA,'MinContrast',ptThresh);pointsB = detectFASTFeatures(IMGB,'MinContrast',ptThresh);%显示图像A和B中的角。图;imshow(IMGA);持有;情节(pointsA);标题(“角在A”);

图;imshow (imgB);持有;情节(pointsB);标题(“角在B”);

步骤3。选择点之间的对应

接下来我们选择上面得到的点之间的对应关系。对于每一个点,我们提取了一个快速的Retina关键点(FREAK)描述围绕着它。我们点之间使用匹配的成本是汉明距离,因为FREAK描述符是二元的。在帧A和帧B点被推定匹配。注意,不存在唯一性约束,因此,从帧B点可以在帧A对应的多个点

%提取FREAK描述符的角落[featuresA,pointsA] = extractFeatures(IMGA,pointsA);[featuresB,pointsB] = extractFeatures(IMGB,pointsB);

匹配这是在当前和以前帧中的功能。由于FREAK描述符是二进制中,matchFeatures函数使用汉明距离找到对应的点。

indexPairs = matchFeatures(featuresA,featuresB);pointsA = pointsA(indexPairs(:,1),:);pointsB = pointsB(indexPairs(:,2),:);

下面示出了相同的颜色复合以上给出的,但添加的图像是从在红色帧A的点,以及从在绿色帧B的点。黄线点,以显示通过上述程序所选择的对应关系之间画出。许多这些对应的是正确的,但也有异常的显著数量。

图;showMatchedFeatures(IMGA,IMGB,pointsA,pointsB);传奇(“一个”,“B”);

步骤4.估算从嘈杂的对应变换

许多在上一步中获得的点对应的是不正确的。但是,我们仍然可以得到几何的稳健估计使用M估计采样一致性(MSAC)算法,这是RANSAC算法的变体在两个图像之间的变换。该MSAC算法的实现estimateGeometricTransform函数。当给定一组点对应时,这个函数将搜索有效的点对应。然后,它将从中导出使第一个点集的输入与第二个点集的输入匹配得最接近的仿射变换。这个仿射变换将是一个3×3矩阵的形式:

[A_1 A_3 0;A_2 A_4 0;t_x t_y 1]

的参数 一个 定义缩放,旋转,并且变换剪切作用,而参数 t 是转换的参数。此变换可用于翘曲图像,使得它们的相应的特征将被移动到相同的图像位置。

仿射变换的一个限制是,它只能改变成像平面。因此,它是不适合于找到截取的3-d场景的两个帧,如与此视频从移动的汽车采取之间的一般的失真。但它确实下,我们将简短描述特定条件下工作。

[TForm的,pointsBm,pointsAm] = estimateGeometricTransform(pointsB pointsA,“仿射”);imgBp = imwarp(IMGB,TForm的,'OutputView'imref2d(大小(imgB)));pointsBmp = transformPointsForward(tform, pointsBm.Location);

下面是一个彩色合成表示帧A覆盖有重新投影的帧B,用重新投影的点对应沿。结果是优秀的,与内围对应近正好重合。图像的核都很好地对准,使得所述红色青色复合变得几乎纯粹的黑色和白色在该区域。

注意内点对应如何都在图像的背景,而不是在前台,这本身就是不对齐。这是因为背景的特点是遥远,以至于他们表现得好像他们是在无限远平面。因此,即使在仿射变换限制为仅改变成像平面,这里是足以对准两个图像的背景平面。此外,如果我们假定背景平面没有移动或帧之间显著改变,那么这个变换实际上捕获相机运动。因此修正,这将稳定视频。此条件下将持有只要帧之间的相机的运动是足够小,或者,相反地,如果视频帧速率是足够高的。

图;显示匹配特征(imgA、imgBp、pointsAm、pointsBmp);传奇(“一个”,“B”);

步骤5.变换逼近和平滑

给定一组视频帧 T , = 0 , 1 , 2 ,我们现在可以使用上述过程以估计所有帧之间的失真 T T + 1 作为仿射变换, H 。因此帧的累积失真 相对于第一帧将是所有前述帧间变换的产物,或

H c u u l 一个 t v e , = H j = 0 - 1

我们可以使用所有的仿射六个以上参数变换,但是,对于数值的简单性和稳定性,我们选择重新适应矩阵作为一个简单的尺度旋转平移变换。一个比例系数,一个角度,和两个翻译:比较充分仿射变换的六本只有四个自由参数。这种新的变换矩阵的形式为:

[S * COS(ANG)S * -sin(ANG)0;S * SIN(ANG)S * COS(ANG)0;t_x t_y 1]

我们通过拟合出现如下这种转换过程上面获得的变换 H 带刻度旋转,平移等价, H 年代 R t 。为了显示转换转换的错误是最小的,我们用两个转换重新设计了框架B,并将下面的两幅图像显示为一个红-青色复合。由于图像是黑白的,显然不同重投影之间的像素差异是可以忽略的。

%提取物比例和旋转部分子矩阵。H = tform.T;R = H (1:2, 1:2);%计算THETA从平均值的两个可能的arctangentsTHETA =平均值([ATAN2(R(2),R(1))ATAN2(-R(3),R(4))]);从平均两个稳定的平均值计算的计算%规模比例尺=均值(R([1 4])/cos();%翻译保持不变:平动= H(3,1:2);%重新构建新的S-R-T变换:HsRt =[[比例尺*[cos(theta) -sin(theta)];罪(θ)因为(θ)];翻译],[0 0 1]];tformsRT = affine2d(HsRt);imgBold = imwarp(IMGB,TForm的,'OutputView'imref2d(大小(imgB)));imgBsRt = imwarp(IMGB,tformsRT,'OutputView'imref2d(大小(imgB)));图(2),CLF;imshowpair(imgBold,imgBsRt,'ColorChannels',“红蓝”),轴图像;标题(“彩色复合仿射和S-R-T变换输出”);

步骤6。运行完整的视频

现在,我们将上面的步骤平滑的视频序列。为了可读性,估计两个图像之间的变换的上述方法已被放置在MATLAB®功能cvexEstStabilizationTform。这个函数cvexTformToSRT还将一般仿射转换转换为标度-旋转-平移转换。

在每一步中,我们计算转换 H 本帧之间。我们符合这个作为一个S-R-T变换, H 年代 R t 。然后,我们结合这个累计变换, H c u u l 一个 t v e ,描述自第一帧以来的所有相机运动。平滑视频的最后两帧在视频播放器中显示为红-青色合成。

有了这个代码,您还可以拿出提前退出条件,使循环过程中,整个视频。

%重置视频源文件的开头。读(hVideoSrc,1);hVPlayer = vision.VideoPlayer;%创建视频浏览器%处理在视频的所有帧movMean = rgb2gray(im2single(readFrame(hVideoSrc)));IMGB = movMean;imgBp = IMGB;correctedMean = imgBp;II = 2;Hcumulative =眼(3);hasFrame(hVideoSrc)&&二<10%在阅读新框架IMGA = IMGB;%Z ^ -1imgAp = imgBp;%Z ^ -1IMGB = rgb2gray(im2single(readFrame(hVideoSrc)));movMean = movMean + IMGB;从帧A%估计变换帧B,并配合作为S-R-TH = cvexEstStabilizationTform (imgA imgB);HsRt = cvexTformToSRT (H);Hcumulative = HsRt * Hcumulative;imgBp = imwarp (imgB affine2d (Hcumulative),'OutputView',imref2d(大小(IMGB)));%显示与上次校正帧彩色合成步骤(hVPlayer,imfuse(imgAp,imgBp,'ColorChannels',“红蓝”));correctedMean = correctedMean + imgBp;II = II + 1;结束correctedMean = correctedMean /(II-2);movMean = movMean /(II-2);%在这里,您拨打的释放方法上的对象,关闭所有打开的文件%释放内存。释放(hVPlayer);

在计算过程中,我们计算了原始视频帧和修正视频帧的平均值。这些平均值在下面并排显示。左边的图像显示了原始输入帧的平均值,证明了在原始视频中有很大的失真。然而,右侧校正帧的平均值显示的是几乎没有失真的图像核心。虽然前景细节已经模糊(作为汽车前进运动的必然结果),这表明了稳定算法的有效性。

图;imshowpair(movMean,correctedMean,“蒙太奇”);标题([“原始输入均”,repmat(' '[1 50]),“修正序列平均”]);

参考

[1] Tordoff,B;穆雷,DW。“指导取样和共识的运动估计。”欧洲会议N计算机视觉,2002年。

[2]李,KY;闯,YY;陈,BY;Ouhyoung,M.“视频稳定使用强大的功能轨迹。”国立台湾大学,2009年。

[3]Litvin,;康拉德,J;卡尔,WC。使用卡尔曼滤波和马赛克的概率视频稳定。IS&T/SPIE Symposium on Electronic Imaging, Image and Video Communications and Proc., 2003.

[4]松下,Y;地平线,E;唐,X;深,HY。“全帧视频稳定。”微软亚洲研究院。CVPR 2005年。