ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

パターン マッチング

この例では、2 次元の正規化された相互相関を使用してパターン マッチングとターゲット追跡を行う方法を説明します。ここでは事前定義あるいはユーザー指定されたターゲットと、追跡する類似ターゲットの数を使用して追跡を行います。正規化された相互相関プロットには、設定されたしきい値を値が超えるとターゲットが特定されることが示されます。

はじめに

この例では、正規化された相互相関を使用してビデオ内のターゲット パターンを追跡します。パターン マッチングのアルゴリズムには以下の手順が含まれます。

  • 入力ビデオ フレームとテンプレートのサイズを小さくして、マッチング アルゴリズムで必要となる計算量を最小化します。

  • 周波数領域で、正規化された相互相関を使用して、ビデオ フレーム内のテンプレートを検索します。

  • 最大の相互相関値を見つけることにより、パターンの位置を特定します。

初期化

相互相関用のしきい値およびガウス ピラミッド分解の分解レベルなどの必要な変数を初期化します。

threshold = single(0.99);
level = 2;

ビデオ ファイルを読み取る System object™ を作成します。

hVideoSrc = vision.VideoFileReader('vipboard.mp4', ...
                                   'VideoOutputDataType', 'single',...
                                   'ImageColorSpace', 'Intensity');

ターゲット テンプレートの分解およびテスト対象イメージ (IUT) の分解のために 3 つのガウス ピラミッド System object を作成します。分解を行うのは、イメージの元のサイズ全体を使用しなくても、小さい領域で相互相関を計算できるようにするためです。

hGaussPymd1 = vision.Pyramid('PyramidLevel',level);
hGaussPymd2 = vision.Pyramid('PyramidLevel',level);
hGaussPymd3 = vision.Pyramid('PyramidLevel',level);

テスト対象イメージ用とターゲット用に、2 次元 FFT System object を 2 つ作成します。

hFFT2D1 = vision.FFT;
hFFT2D2 = vision.FFT;

周波数領域における (乗算と等価の) 相関を行った後に 2 次元の逆 FFT を実行する System object を作成します。

hIFFFT2D = vision.IFFT;

ターゲットと同じサイズのタイルにイメージ エネルギーを平均化する 2 次元たたみ込み System object を作成します。

hConv2D = vision.Convolver('OutputSize','Valid');

ここで以下の一連の操作を実装します。

% Specify the target image and number of similar targets to be tracked. By
% default, the example uses a predefined target and finds up to 2 similar
% patterns. Set the variable useDefaultTarget to false to specify a new
% target and the number of similar targets to match.
useDefaultTarget = true;
[Img, numberOfTargets, target_image] = ...
  videopattern_gettemplate(useDefaultTarget);

% Downsample the target image by a predefined factor using the
% gaussian pyramid System object. You do this to reduce the amount of
% computation for cross correlation.
target_image = single(target_image);
target_dim_nopyramid = size(target_image);
target_image_gp = step(hGaussPymd1, target_image);
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 = step(hGaussPymd2, Img);
[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 = step(hFFT2D1, 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 object を作成します。

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

パターンの追跡状態を表示する System object を作成します。

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

正規化された相互相関値をプロットする Figure ウィンドウを初期化します。

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

動画処理ループ

入力ビデオのパターン マッチングを実行するための処理ループを作成します。このループは上記でインスタンス化した System object を使用します。ループは入力ファイルの末尾に達すると停止します。ファイルの末尾は VideoFileReader の System object によって検出されます。

while ~isDone(hVideoSrc)
    Im = step(hVideoSrc);
    Im_gp = step(hGaussPymd3, Im);

    % Frequency domain convolution.
    Im_p(1:ri, 1:ci) = Im_gp;    % Zero-pad
    img_fft = step(hFFT2D2, Im_p);
    corr_freq = img_fft .* target_fft;
    corrOutput_f = step(hIFFFT2D, 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 = step(hConv2D, IUT_energy, C_ones);
    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

release(hVideoSrc);

まとめ

この例では、Computer Vision System Toolbox™ を使用してビデオ内でユーザー定義されたパターンを見つけて追跡する方法を説明しました。アルゴリズムはターゲットとテスト対象イメージ間の正規化された周波数領域の相互相関に基づいています。ビデオ プレーヤー ウィンドウには識別されたターゲットの位置を示す入力ビデオが表示されます。また、ターゲットのマッチにメトリクスとして使用される、ターゲットとイメージ間の正規化された相関を示す Figure も表示されます。相関値がしきい値 (青いライン) を超えると入力ビデオ内のターゲットが識別され、その位置が緑の境界ボックスでマークされます。

付録

この例では次の補助関数が使用されています。

この情報は役に立ちましたか?