主要内容

愿景。TemplateMatcher

在图像中定位模板

描述

在图像中定位模板。

  1. 创建愿景。TemplateMatcher对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

创建

描述

例子

tMatcher=愿景。模板米atcher返回一个模板匹配器对象,tMatcher.该对象通过在图像内部以单像素增量的方式移动模板来执行模板匹配。

tMatcher=愿景。模板米atcher(名称,值使用一个或多个名称-值对设置属性。将每个属性名用引号括起来。例如,tMatcher =愿景。TemplateMatcher ('Metric','Sum of absolute differences')

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

用于模板匹配的度量,指定为“绝对差异和”“差异平方和”,或“最大绝对差”

输出类型,指定为“度量矩阵”“最佳匹配位置”

指定搜索条件以查找两个输入之间的最小差值,指定为“详尽”“三步走”.如果将此属性设置为“详尽”时,对象逐像素搜索最小差值。如果将此属性设置为“三步走”,目标使用逐步减小的步长来搜索最小的差异。的“三步走”方法在计算上比“详尽”方法,但有时找不到最优解。属性设置时将应用此属性OutputValue财产“最佳匹配位置”

启用度量值输出,指定为真正的.属性设置时将应用此属性OutputValue财产“最佳匹配位置”

度量值的大小,指定为奇数。大小N的,N——- - - - - -N度量值为奇数的矩阵。例如,如果矩阵大小为3乘3,则将此属性设置为3..属性设置时将应用此属性OutputValue财产“最佳匹配位置”BestMatchNeighborhoodOutputPort财产真正的

通过输入启用ROI规范,指定为真正的.将此属性设置为真正的定义用于执行模板匹配的感兴趣区域(Region of Interest, ROI)。如果将此属性设置为真正的,则必须指定ROI。否则将使用整个输入图像。

启用一个标志的输出,该标志指示ROI的任何部分是否在输入图像之外,指定为真正的.当您将此属性设置为真正的时,对象返回一个ROI标记。当设置为时,该标志,表示ROI的一部分位于输入图像的外部。属性设置时将应用此属性ROIInputPort财产真正的

定点属性

定点运算的舍入方法,指定为“地板”“天花板”“收敛”“最近的”“圆”“简单”,或“零”

当整数输入超出范围时采取的操作,指定为“包装”“饱和”

产品数据类型,指定为同样作为输入的“自定义”

乘积字和分数长度,指定为一个比例numerictype(定点设计师)对象。此属性仅在设置AccumulatorDataType财产“自定义”

累加器数据类型,指定为“一样的产品”同样作为输入的,或“自定义”

累加器单词和分数长度,按比例指定numerictype(定点设计师)对象。此属性仅在设置AccumulatorDataType财产“自定义”

使用

描述

例子

位置= tMatcher (T返回(xy最佳模板相对于图像左上角的位置坐标在图像矩阵之间匹配,,和模板矩阵,T.对象通过在图像内部以单像素增量的方式移动模板来计算位置。

位置numberOfValuesnumValid) = tMatcher (TROI返回最佳模板匹配的位置位置,度量值围绕最佳匹配numberOfValues,和一个逻辑标志numValid.这适用于您设置OutputValue财产“最佳匹配位置”BestMatchNeighborhoodOutputPort财产真正的

位置numberOfValuesnumValidROIvalid) = tMatcher (TROI也返回一个逻辑标志,ROIvalid指示是否ROI是否超出了输入图像的边界.这适用于您设置OutputValue财产“最佳匹配位置”,BestMatchNeighborhoodOutputPortROIInputPort,ROIValidityOutputPort属性真正的

位置ROIvalid) = tMatcher (TROI也返回一个逻辑标志ROIvalid表示指定的ROI是否超出了输入图像的边界.这适用于您设置OutputValue财产“最佳匹配位置”,以及ROIInputPortROIValidityOutputPort属性真正的

输入参数

全部展开

输入图像,指定为二维灰度或真彩色图像。

输入模板,指定为二维灰度或真彩色图像。

输入ROI,指定为四元向量,[xy宽度高度,其中前两个元素表示矩形ROI左上角的坐标。

输出参数

全部展开

最佳模板匹配的位置,返回为格式为xy).坐标表示模板相对于图像左上角的中心。有关详细信息,请参见算法

度量值矩阵,作为矩阵返回。一个numValid指示最佳匹配周围的邻域扩展到度量值矩阵的边界之外numberOfValues

有效邻域,返回为真正的.一个numValid指示最佳匹配周围的邻域扩展到度量值矩阵的边界之外numberOfValues

有效的ROI邻域,返回为真正的.一个ROIvalid表示感兴趣区域超出了输入图像的边界。

对象的功能

要使用对象函数,请指定System对象™作为第一个输入参数。例如,释放名为system的对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

一步 运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 使内部状态复位系统对象

例子

全部折叠

这个例子展示了如何从视频流中去除摄像机运动的效果。

介绍

在本例中,我们首先定义要跟踪的目标。在这种情况下,它是汽车的后面和牌照。建立了一个动态搜索区域,该区域的位置由最后已知的目标位置确定。然后我们只在这个搜索区域内搜索目标,这减少了寻找目标所需的计算次数。在每个后续视频帧中,我们确定目标相对于前一帧移动了多少。我们使用这些信息来消除不必要的平移摄像机运动,并生成稳定的视频。

初始化

创建一个System对象™从多媒体文件中读取视频。我们将输出设置为只有强度的视频。

%输入需要稳定的视频文件。文件名=“shaky_car.avi”;hVideoSource = VideoReader(文件名);

创建一个模板匹配器System对象来计算视频帧中目标的最佳匹配位置。我们使用这个位置来查找连续视频帧之间的转换。

hTM =愿景。模板米atcher(“ROIInputPort”,真的,...“BestMatchNeighborhoodOutputPort”,真正的);

创建一个System对象来显示原始视频和稳定视频。

hVideoOut =愿景。放像机(“名字”“视频稳定”);一轮hVideoOut.Position (1) = (0.4 * hVideoOut.Position (1));一轮hVideoOut.Position (2) = (1.5 * (hVideoOut.Position (2)));hVideoOut.Position(3:4) = [650 350];

这里我们初始化处理循环中使用的一些变量。

pos. template_origin = [109 100];% [x y]左上角post .template_size = [22 18];%(宽高)Pos.search_border = [15 10];最大水平和垂直位移地板pos.template_center = ((pos.template_size-1) / 2);pos.template_center = (pos. template_origin + pos.template_center - 1);W = hVideoSource.Width;%宽度(像素)H = hVideoSource.Height;%高度(像素)W-pos.search_border(1)+4:W -pos.search_border(1)+4:W -pos.search_border(1)+4:W -pos.search_border(1)+4:W= [1:pos.search_border(2)+4 H-pos.search_border(2)+4:H];sz = [W, H];TargetRowIndices =...pos.template_orig (2) 1: pos.template_orig (2) + pos.template_size (2) 2;TargetColIndices =...pos.template_orig (1) 1: pos.template_orig (1) + pos.template_size (1) 2;搜索区域= pos. template_origin - pos.search_border - 1;Offset = [0 0];目标= 0(18、22);首次= true;

流处理循环

这是主处理循环,它使用我们上面实例化的对象来稳定输入视频。

hasFrame(hVideoSource) input = rgb2gray(im2double(readFrame(hVideoSource)));找到目标在输入视频帧中的位置如果firstTime Idx = int32(pos.template_center_pos);MotionVector = [0 0];首次= false;其他的IdxPrev = Idx;ROI = [SearchRegion, pos.template_size+2*pos.search_border];Idx = hTM(输入、目标ROI);MotionVector =双(Idx-IdxPrev);结束[Offset, SearchRegion] = updatesearch(sz, MotionVector,...SearchRegion、抵消、pos);%转换视频帧以抵消摄像机运动imtranslate(input, Offset,“线性”);Target =稳定化(TargetRowIndices, TargetColIndices);%为显示添加黑色边框稳定器(:,BorderCols) = 0;稳定化(BorderRows,:) = 0;TargetRect = [pos. template_origin - offset, pos.template_size];SearchRegionRect =[搜索区域,pos.template_size + 2*pos.search_border];%在输入时绘制矩形以显示目标和搜索区域输入= insertShape(输入,“矩形”, (TargetRect;SearchRegionRect),...“颜色”“白色”);%显示输入图像上的偏移(位移)值txt = sprintf (”(% f + 05.1, % + 05.1 f)”,抵消);input = insertText(input(:,:,1),[191 215],txt,“字形大小”, 16岁,...“输入TextColor”“白色”“BoxOpacity”, 0);%显示视频hVideoOut([输入(::1)稳定]);结束

结论

使用MATLAB®命令行中的计算机视觉工具箱™功能,很容易实现复杂的系统,如视频稳定。

附录

本例中使用了下面的helper函数。

算法

模板匹配器的典型用法是在大图像中寻找小区域。该区域由模板图像指定,模板图像可以与输入图像一样大,但通常比输入图像小。

对象输出相对于图像左上角的最佳匹配坐标。(xy位置的坐标对应于模板的中心。当使用奇数像素的模板时,对象使用模板的中心。当使用偶数像素的模板时,对象使用位于中心的左上角像素作为位置。下表显示了对象如何输出位置(疯狂的),奇数和偶数模板:

模板中像素的奇数 模板中的像素数为偶数

扩展功能

介绍了R2012a