В этом примере показано, как использовать 2-D нормированную перекрестную корреляцию для соответствия шаблона и отслеживания цели. В примере используется предопределенная или заданная пользователем цель и количество аналогичных целей, которые будут отслеживаться. Нормированный график перекрестной корреляции показывает, что, когда значение превышает установленный порог, цель идентифицируется.
В этом примере вы используете нормированную перекрестную корреляцию, чтобы отследить целевой шаблон в видео. Алгоритм соответствия шаблона включает следующие шаги:
Входы видеокадр и шаблон уменьшаются в размере, чтобы минимизировать количество расчетов, требуемых соответствующим алгоритмом.
Нормированная перекрестная корреляция в частотный диапазон используется для поиска шаблона в видеокадре.
Расположение шаблона определяется путем нахождения максимального значения перекрестной корреляции.
Инициализируйте необходимые переменные, такие как пороговое значение для перекрестной корреляции и уровень разложения для разложения Гауссова Пирамиды.
threshold = single(0.99); level = 2;
Подготовьте видео файла читателя.
hVideoSrc = VideoReader('vipboard.mp4');
Укажите изображение цели и количество аналогичных целей, которые будут отслеживаться. По умолчанию в примере используется предопределенный целевой объект и находится до 2 подобных шаблонов. Можно задать значение false переменной useDefaultTarget, чтобы задать новую цель и количество аналогичных целей, которые будут совпадать.
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
Создайте Системный объект, чтобы вычислить локальное максимальное значение для нормализованной перекрестной корреляции.
hFindMax = vision.LocalMaximaFinder( ... 'Threshold', single(-1), ... 'MaximumNumLocalMaxima', numberOfTargets, ... 'NeighborhoodSize', floor(size(target_image_gp)/2)*2 - 1);
Создайте системный объект, чтобы отобразить отслеживание шаблона.
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™, чтобы найти пользовательский шаблон в видео и отследить его. Алгоритм основан на нормированной перекрестной корреляции частотного диапазона между мишенью и тестируемым изображением. Окно видеоплеера отображает вход видео с идентифицированными целевыми местоположениями. Также рисунок отображает нормированную корреляцию между целью и изображением, которая используется в качестве метрики, чтобы соответствовать цели. Как видно, всякий раз, когда значение корреляции превышает порог (обозначено синей линией), цель идентифицируется в вход видео, и местоположение помечается зеленым ограничивающим прямоугольником.
В этом примере используются следующие вспомогательные функции.