exponenta event banner

Совпадение шаблонов

В этом примере показано, как использовать 2-D нормализованную взаимную корреляцию для сопоставления шаблонов и отслеживания цели. В примере используется предопределенный или заданный пользователем целевой объект и количество аналогичных целевых объектов для отслеживания. График нормализованной взаимной корреляции показывает, что, когда значение превышает установленный порог, цель идентифицируется.

Введение

В этом примере для отслеживания целевого шаблона в видео используется нормализованная взаимная корреляция. Алгоритм сопоставления шаблонов включает в себя следующие шаги:

  • Входной видеокадр и шаблон уменьшаются в размере, чтобы минимизировать объем вычислений, требуемых алгоритмом согласования.

  • Нормализованная взаимная корреляция в частотной области используется для поиска шаблона в видеокадре.

  • Местоположение шаблона определяется путем нахождения максимального значения взаимной корреляции.

Инициализация параметров и создание шаблона

Инициализируйте необходимые переменные, такие как пороговое значение для взаимной корреляции и уровень разложения для разложения гауссовой пирамиды.

threshold = single(0.99);
level = 2;

Подготовьте устройство чтения видеофайлов.

hVideoSrc = VideoReader('vipboard.mp4');

Укажите целевое изображение и количество похожих целей для отслеживания. По умолчанию в примере используется предопределенный целевой объект и найдено до 2 аналогичных шаблонов. Можно установить значение false для переменной useDefureTarget, чтобы указать новый целевой объект и количество аналогичных целевых объектов для сопоставления.

useDefaultTarget = true;
[Img, numberOfTargets, target_image] = ...
  videopattern_gettemplate(useDefaultTarget);

% Downsample the target image by a predefined factor. You do this
% to reduce the amount of computation needed by cross correlation.
target_image = single(target_image);
target_dim_nopyramid = size(target_image);
target_image_gp = multilevelPyramid(target_image, level);
target_energy = sqrt(sum(target_image_gp(:).^2));

% Rotate the target image by 180 degrees, and perform zero padding so that
% the dimensions of both the target and the input image are the same.
target_image_rot = imrotate(target_image_gp, 180);
[rt, ct] = size(target_image_rot);
Img = single(Img);
Img = multilevelPyramid(Img, level);
[ri, ci]= size(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; zeros(r_mod-rt, c_mod)];

% Compute the 2-D FFT of the target image
target_fft = fft2(target_image_p);

% Initialize constant variables used in the processing loop.
target_size = repmat(target_dim_nopyramid, [numberOfTargets, 1]);
gain = 2^(level);
Im_p = zeros(r_mod, c_mod, 'single'); % Used for zero padding
C_ones = ones(rt, ct, 'single');      % Used to calculate mean using conv

Создайте объект System для вычисления локального максимального значения нормализованной взаимной корреляции.

hFindMax = vision.LocalMaximaFinder( ...
            'Threshold', single(-1), ...
            'MaximumNumLocalMaxima', numberOfTargets, ...
            'NeighborhoodSize', floor(size(target_image_gp)/2)*2 - 1);

Создайте объект System для отображения отслеживания шаблона.

sz = get(0,'ScreenSize');
pos = [20 sz(4)-400 400 300];
hROIPattern = vision.VideoPlayer('Name', 'Overlay the ROI on the target', ...
    'Position', pos);

Инициализация окна рисунка для печати нормализованного значения взаимной корреляции

hPlot = videopatternplots('setup',numberOfTargets, threshold);

Поиск шаблона в видео

Создайте цикл обработки для выполнения сопоставления шаблонов во входном видео. В этом цикле используются созданные выше системные объекты. Цикл останавливается при достижении конца входного файла, который обнаруживается VideoReader объект.

while hasFrame(hVideoSrc)
    Im = rgb2gray(im2single(readFrame(hVideoSrc)));

    % Reduce the image size to speed up processing
    Im_gp = multilevelPyramid(Im, level);

    % Frequency domain convolution.
    Im_p(1:ri, 1:ci) = Im_gp;    % Zero-pad
    img_fft = fft2(Im_p);
    corr_freq = img_fft .* target_fft;
    corrOutput_f = ifft2(corr_freq);
    corrOutput_f = corrOutput_f(rt:ri, ct:ci);

    % Calculate image energies and block run tiles that are size of
    % target template.
    IUT_energy = (Im_gp).^2;
    IUT = conv2(IUT_energy, C_ones, 'valid');
    IUT = sqrt(IUT);

    % Calculate normalized cross correlation.
    norm_Corr_f = (corrOutput_f) ./ (IUT * target_energy);
    xyLocation = step(hFindMax, norm_Corr_f);

    % Calculate linear indices.
    linear_index = sub2ind([ri-rt, ci-ct]+1, xyLocation(:,2),...
        xyLocation(:,1));

    norm_Corr_f_linear = norm_Corr_f(:);
    norm_Corr_value = norm_Corr_f_linear(linear_index);
    detect = (norm_Corr_value > threshold);
    target_roi = zeros(length(detect), 4);
    ul_corner = (gain.*(xyLocation(detect, :)-1))+1;
    target_roi(detect, :) = [ul_corner, fliplr(target_size(detect, :))];

    % Draw bounding box.
    Imf = insertShape(Im, 'Rectangle', target_roi, 'Color', 'green');
    % Plot normalized cross correlation.
    videopatternplots('update',hPlot,norm_Corr_value);
    step(hROIPattern, Imf);
end

snapnow

% Function to compute pyramid image at a particular level.
function outI = multilevelPyramid(inI, level)

I = inI;
outI = I;

for i=1:level
    outI = impyramid(I, 'reduce');
    I = outI;
end

end

Резюме

В этом примере показано использование Computer Vision Toolbox™ для поиска определяемого пользователем шаблона в видео и его отслеживания. Алгоритм основан на нормализованной взаимной корреляции частотной области между целью и тестируемым изображением. В окне видеопроигрывателя отображается входное видео с идентифицированными целевыми местоположениями. На рисунке также показана нормализованная корреляция между целью и изображением, которое используется в качестве метрики для соответствия цели. Как можно видеть всякий раз, когда значение корреляции превышает пороговое значение (обозначенное синей линией), цель идентифицируется во входном видео, и местоположение помечается зеленой ограничивающей рамкой.

Приложение

В этом примере используются следующие вспомогательные функции.