主要内容

视频稳定使用点特性匹配

这个例子展示了如何稳定视频中从一个战战兢兢的平台。稳定视频的一种方法是跟踪图像的显著特征,使用这个作为一个锚点来抵消扰动相对于它。然而,这个过程必须与知识的引导,这样的显著特征在于第一视频帧。在这个例子中,我们探索的方法没有任何此类视频稳定工作先天的知识。它不是自动搜索“背景平面”的视频序列,并利用其观察到的畸变对相机运动。

这个稳定算法包括两个步骤。首先,我们确定仿射图像视频序列的所有相邻帧之间的转换使用estgeotform2d函数应用于点两个图像之间的对应关系。第二,我们经视频帧来实现稳定的视频。我们将使用计算机视觉工具箱™,这两个算法和显示。

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

我们这里读前两帧的视频序列。我们阅读强度图像因为颜色不是必要的稳定算法,因为使用灰度图像提高了速度。下面我们并排显示两帧,我们生产red-cyan颜色组合来说明pixel-wise区别它们。显然有很多垂直和水平两个坐标系之间的偏移量。

文件名=“shaky_car.avi”;hVideoSrc = VideoReader(文件名);imgA = im2gray (im2single (readFrame (hVideoSrc)));%第一帧读入imgAimgB = im2gray (im2single (readFrame (hVideoSrc)));%第二帧读入imgB图;蒙太奇({imgA, imgB});标题([“帧”repmat (' '50 [1]),B帧的]);

图包含一个坐标轴对象。坐标轴对象与标题B帧一帧包含一个类型的对象的形象。

图imshowpair (imgA imgB ColorChannels =“red-cyan”);标题(的颜色组合(A =红、帧B =青色)”);

图包含一个坐标轴对象。坐标轴对象与标题颜色组合(A =红、帧B =青色)包含一个类型的对象的形象。

步骤2。收集每一帧的凸点

我们的目标是确定正确的转换两帧之间的失真。我们可以使用estgeotform2d函数,它将返回一个仿射变换。作为输入,我们必须为这个函数提供一组点两帧之间的通讯。为了生成这些通讯,我们首先收集两帧的兴趣点,然后选择可能它们之间的通讯。

在这一步我们生产这些候选点每一帧。有最好的机会,这些点会有相应的点在其他框架,我们希望点突出的图像特征,如角落。我们使用detectFASTFeatures函数,它实现一个最快的角点检测算法。

发现点框架如下图所示。观察其中许多封面相同的图像特征,如点沿着树线,大路标的角落,角落里的汽车。

ptThresh = 0.1;pointsA = detectFASTFeatures (imgA MinContrast = ptThresh);pointsB = detectFASTFeatures (imgB MinContrast = ptThresh);%显示角落中发现图像A和B。图imshow (imgA)情节(pointsA)标题(在一个角落的)

图包含一个坐标轴对象。坐标轴对象与标题角落包含2图像类型的对象,线。一个或多个行显示的值只使用标记

图imshow (imgB)情节(pointsB)标题(“B角落”)

图包含一个坐标轴对象。标题角落的坐标轴对象B包含2类型的对象形象,线。一个或多个行显示的值只使用标记

步骤3。选择对应点之间

接下来我们选择对应点之间的派生。对于每一个点,我们提取快速视网膜关键点(反常)描述符围绕它。匹配的成本我们使用点之间的汉明距离,因为反常的描述符是二进制。点在坐标系和B帧匹配的公认。请注意,没有唯一性约束,所以分帧B可以对应多个点在坐标系。

%提取反常的描述符的角落[featuresA, pointsA] = extractFeatures (imgA pointsA);[featuresB, pointsB] = extractFeatures (imgB pointsB);

匹配特性被发现在当前和前一帧。自狂描述符都是二元的,matchFeatures函数使用的汉明距离找到对应点。

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

下图显示上述同样的颜色组合,但红色的点从坐标系,用绿色和B分帧。点之间画黄线上面显示选择的通讯程序。许多这样的对应关系是正确的,但也有相当数量的离群值。

图showMatchedFeatures (imgA imgB、pointsA pointsB)传说(“一个”,“B”)

图包含一个坐标轴对象。坐标轴对象包含4图像类型的对象,线。一个或多个行显示的值只使用标记这些对象代表一个B。

步骤4。估计转换从嘈杂的通讯

许多前一步获得的点对应的是不正确的。但是我们仍然可以获得一个健壮的估计的两幅图像之间的几何变换使用M-estimator样品一致(MSAC)算法,它是一个变种的RANSAC算法。MSAC算法的实现estgeotform2d函数。这个函数,当给定一组对应的点,将搜索有效的内围层通讯。从这些它会推导出仿射变换的内围层从第一个点集匹配最接近的内围层从第二集。这将3 x3的仿射变换矩阵的形式:

(a_1 a₂t_x;a_3 a_4 t_y;0 0 1]

的参数 一个 定义尺度、旋转和转换的剪切效应,而参数 t 是翻译参数。这个变换可用于变形的图像,这样相应的特性将移动到相同的图像的位置。

仿射变换的一个限制是它只能改变成像平面。因此不适合发现一般失真两帧之间的三维场景,例如这个视频从一个移动的汽车。但它工作在一定条件下,我们将描述不久。

[tform, inlierIdx] = estgeotform2d (pointsB pointsA,仿射的);pointsBm = pointsB (inlierIdx:);pointsAm = pointsA (inlierIdx:);imgBp = imwarp (imgB tform OutputView = imref2d(大小(imgB)));pointsBmp = transformPointsForward (tform pointsBm.Location);

下面是一个彩色合成显示帧reprojected B帧的覆盖,随着reprojected通讯。成绩优异,内围层通讯几乎完全重合。图像的核心都是一致的,这样red-cyan彩色合成几乎变成了纯粹的黑白。

注意内围层通讯都在后台的形象,不是在前台,这本身并不是一致的。这是因为背景特性足够遥远,他们表现得好像他们在无限遥远的飞机。因此,尽管仿射变换有限只改变成像平面,这足以使两图像背景的飞机。此外,如果我们假设背景帧之间的飞机没有移动或改变显著,那么这个变换实际上是获取摄像机运动。因此纠正这将稳定视频。这种情况将只要相机帧之间的运动足够小,或者,相反,如果视频帧速率足够高。

图showMatchedFeatures (imgA imgBp、pointsAm pointsBmp)传说(“一个”,“B”)

图包含一个坐标轴对象。坐标轴对象包含4图像类型的对象,线。一个或多个行显示的值只使用标记这些对象代表一个B。

第5步。转换近似和平滑

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

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

我们可以使用所有的六参数仿射变换,但数值简单和稳定,我们选择re-fit scale-rotation-translation变换矩阵的简单。这个只有四个自由参数相比,完全仿射变换的六:一个比例因子,一个角,两个翻译。这个新的变换矩阵的形式:

[s * cos (ang) s * sin (ang) t_x;* sin (ang)年代* cos (ang) t_y;0 0 1]

下面我们展示这个转换过程通过拟合above-obtained转换 H scale-rotation-translation等效, H 年代 R t 。显示转换的转换误差很小,我们reproject B帧转换和显示下面的两张图片作为red-cyan颜色组合。当图像出现黑白,显然pixel-wise reprojections之间的不同之处是微不足道的。

%提取子矩阵规模和旋转部分tformAffine = tform.A;R = tformAffine (1:2, 1:2);%计算θ的意思是两个可能的但是θ=意味着([量化(R - R(3),(1)量化(R (2), (4))));%计算规模从平均两个稳定的平均计算规模=意味着(R ([1 - 4]) / cos(θ));%θ转换为度thetad = rad2deg(θ);%的翻译是相同的翻译= tformAffine (1:2, 3);%重建新的s-R-t转换并将它存储在一个simtform2d对象tformSRT = simtform2d(规模、thetad、翻译);imgBold = imwarp (imgB tform OutputView = imref2d(大小(imgB)));imgBsRt = imwarp (imgB tformSRT OutputView = imref2d(大小(imgB)));图(2)clf imshowpair (imgBold imgBsRt,“ColorChannels”,“red-cyan”),轴图像;标题(“仿射和相似输出彩色合成”);

图包含一个坐标轴对象。坐标轴对象标题彩色合成的仿射和相似输出包含一个类型的对象的形象。

步骤6。上运行完整的视频

现在我们上面的步骤适用于光滑的视频序列。可读性,上述过程估计两个图像之间的转换被放置在MATLAB®函数cvexEstStabilizationTform这个函数cvexTformToSRT也一般的仿射变换转换成相似(scale-rotation-translation)转换。

在每一步计算转换 H 在当前帧之间。我们符合这一作为s-R-t变换, H 年代 R t 。然后我们把这个累积变换, H c u u l 一个 t v e ,它描述了所有相机运动以来第一帧。平滑的最后两帧视频所示red-cyan复合视频播放器。

使用这段代码,你还可以拿出来提前退出条件使循环过程整个视频。

%重置视频源文件的开头读(hVideoSrc, 1);hVPlayer = vision.VideoPlayer;%创建视频查看器%处理所有视频帧movMean = im2gray (im2single (readFrame (hVideoSrc)));imgB = movMean;imgBp = imgB;correctedMean = imgBp;2 = 2;cumulativeTform = simtform2d;第二hasFrame (hVideoSrc) & & < 10%阅读的新框架imgA = imgB;% z ^ 1imgAp = imgBp;% z ^ 1imgB = im2gray (im2single (readFrame (hVideoSrc)));movMean = movMean + imgB;%估计转换从一个框架B帧,和适合作为s-R-ttformAffine = cvexEstStabilizationTform (imgA imgB);sRtTform = cvexTformToSRT (tformAffine);cumulativeTform = simtform2d (cumulativeTform。* sRtTform.A);imgBp = imwarp (imgB cumulativeTform OutputView = imref2d(大小(imgB)));%显示为彩色合成与最后修正框架步骤(hVPlayer imfuse (imgAp、imgBp ColorChannels =“red-cyan”));correctedMean = correctedMean + imgBp;2 = 2 + 1;结束correctedMean = correctedMean / (ii-2);movMean = movMean / (ii-2);%这里你叫释放对象的方法来关闭任何打开的文件%和释放内存。释放(hVPlayer);

数字视频播放器包含一个坐标轴对象和其他对象类型的uiflowcontainer, uimenu uitoolbar。坐标轴对象包含一个类型的对象的形象。

在计算中,我们计算均值的原始视频帧和纠正帧。下面这些平均值并排显示。左边的图像显示了原始输入帧的意思,证明有一个很大的失真在原始视频。右边的均值修正框架,然而,显示了图像核心几乎没有变形。虽然前景细节模糊(如汽车的前进运动的必要结果),这显示了稳定算法的有效性。

图蒙太奇({movMean, correctedMean})标题([“原始输入的意思”repmat (' '30 [1]),“修正序列的意思”])

图包含一个坐标轴对象。坐标轴对象与原始输入标题意思修正序列包含一个类型的对象的形象。

引用

[1]Tordoff, B;穆雷,DW。“指导采样和运动估计的共识。”欧洲一个n Conference n Computer Vision, 2002.

[2]李,肯塔基州;壮族,YY;陈,;Ouhyoung, M。“视频轨迹稳定使用健壮的特性。”National Taiwan University, 2009.

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

[4]松下,Y;Ofek E;唐,X;Shum HY。“帧视频稳定。”Microsoft® Research Asia. CVPR 2005.