主要内容

模式匹配

这个例子展示了如何使用二维归一化互相关进行模式匹配和目标跟踪。该示例使用预定义的或用户指定的目标以及要跟踪的类似目标的数量。归一化互相关图表明,当值超过设定的阈值时,目标被识别。

介绍

在本例中,您使用归一化互相关来跟踪视频中的目标模式。模式匹配算法包括以下步骤:

  • 对输入的视频帧和模板进行缩小,以减少匹配算法所需的计算量。

  • 在频域使用归一化互相关来寻找视频帧中的模板。

  • 模式的位置是通过寻找最大的互相关值来确定的。

初始化参数并创建模板

初始化所需的变量,如互相关的阈值和高斯金字塔分解的分解级别。

阈值=单(0.99);水平= 2;

准备一个视频文件读取器。

hVideoSrc = VideoReader (“vipboard.mp4”);

指定要跟踪的目标图像和相似目标的数量。默认情况下,该示例使用一个预定义的目标,并找到至多2个类似的模式。您可以将变量useDefaultTarget设置为false,以指定一个新的目标和要匹配的类似目标的数量。

useDefaultTarget = true;[Img, numberOfTargets, target_image] =...videopattern_gettemplate (useDefaultTarget);按预定义的因子对目标图像进行下采样。你这样做%以减少互相关所需的计算量。target_image =单(target_image);target_dim_nopyramid =大小(target_image);target_image_gp = multilevelPyramid(target_image, level);target_energy =√总和target_image_gp(:)。^ 2));旋转目标图像180度,并执行零填充%目标和输入图像的尺寸是相同的。Target_image_rot = imrotate(target_image_gp, 180);[rt, ct] = size(target_image_rot);Img =单(Img);Img = multilevelPyramid(Img, level);(ri, ci) = (Img)大小;R_mod = 2^nextpow2(rt + ri);C_mod = 2^nextpow2(ct + ci);Target_image_p = [target_image_rot zeros(rt, c_mod-ct)]; / /设置目标图像target_image_p = [target_image_p;0 (r_mod-rt c_mod)];%计算目标图像的二维FFTtarget_fft = fft2 (target_image_p);%初始化处理循环中使用的常量变量。target_size = repmat(target_dim_nopyramid, [numberOfTargets, 1]);获得= 2 ^(水平);Im_p = 0 (r_mod, c_mod,“单一”);%用于零填充c_1 = 1 (rt, ct,“单一”);%用于使用conv计算平均值

创建一个System对象来计算归一化互相关的局部最大值。

hFindMax =愿景。LocalMaximaFinder (...“阈值”、单(1)...“MaximumNumLocalMaxima”numberOfTargets,...“NeighborhoodSize”, floor(size(target_image_gp)/2)*2 - 1);

创建一个System对象来显示模式的跟踪。

深圳= get (0,“拉”);Pos = [20 sz(4)-400 400 300];hROIPattern =愿景。放像机(“名字”“在目标上覆盖ROI”...“位置”、pos);

初始化图形窗口,用于绘制归一化互相关值

hPlot = videopatternplots (“设置”、numberOfTargets阈值);

在“视频”中搜索模板

创建一个处理循环,对输入视频执行模式匹配。这个循环使用上面实例化的System对象。当您到达输入文件的末尾时,循环将停止,这将由VideoReader对象。

hasFrame(hVideoSrc) Im = rgb2gray(im2single(readFrame(hVideoSrc)));减少图像大小以加快处理速度Im_gp = multilevelPyramid(Im, level);%频域卷积。Im_p(1:ri, 1:ci) = Im_gp;%在img_fft = fft2 (Im_p);Corr_freq = img_fft .* target_fft;corrOutput_f = ifft2 (corr_freq);corrOutput_f = corrOutput_f(rt:ri, ct:ci);%计算图像能量和块运行瓦片的大小%的目标模板。IUT_energy = (Im_gp) ^ 2;IUT = conv2(IUT_energy, c_1,“有效”);IUT = sqrt (IUT);%计算归一化互相关。norm_Corr_f = (corrOutput_f) ./ (IUT * target_energy);xyLocation = step(hFindMax, norm_Corr_f);%计算线性指数。* * * * * * * * * * * * * * * * * * * * *...xyLocation (: 1));norm_Corr_f_linear = norm_Corr_f (:);norm_Corr_value = norm_Corr_f_linear (linear_index);检测= (norm_Corr_value >阈值);Target_roi = 0 (length(detect), 4);ul_corner =(收益。* (xyLocation(检测:)1))+ 1;Target_roi (detect,:) = [ul_corner, fliplr(target_size(detect,:))];%绘制边框。国际货币基金组织(Imf) = insertShape (Im,“矩形”target_roi,“颜色”“绿色”);%绘制标准化互相关图。videopatternplots (“更新”、hPlot norm_Corr_value);步骤(hROIPattern,国际货币基金组织(Imf);结束snapnow函数用于计算特定层次的金字塔图像。函数outI = multilevelPyramid(inI, level) I = inI;outI =我;i=1:level outI = impyramid(i,“减少”);我= outI;结束结束

总结

这个例子展示了使用计算机视觉工具箱™在视频中找到用户定义的模式并跟踪它。该算法基于目标与被测图像的归一化频域互相关。视频播放器窗口显示已识别的目标位置的输入视频。图中还显示了目标和图像之间的归一化相关性,该相关性被用作匹配目标的度量。从图中可以看出,当相关值超过阈值(蓝色线表示)时,在输入视频中就会识别出目标,并以绿色边界框标记位置。

附录

本例中使用了以下辅助函数。