Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

オブジェクトのカウント

この例では、モルフォロジー演算を使用してビデオ ストリーム内のオブジェクトをカウントする方法を説明します。

はじめに

入力ビデオ ストリームにはホチキスの針のイメージが含まれています。この例では、トップ ハット モルフォロジー演算を使って不均一な明るさを排除し、opening モルフォロジー演算を使って針の間の隙間を取り除きます。その後、各フレームに対して異なるしきい値を適用して、イメージをバイナリに変換します。このしきい値を適用した後、針の数をカウントしてそれぞれの針の重心を計算します。

初期化

次のコード セクションを使用して必要な変数と System object を初期化します。

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

filename = 'staples.mp4';
hVideoSrc = VideoReader(filename);

針をカウントしてその重心を見つけるブロブ解析用 System object を作成します。

hBlob = vision.BlobAnalysis( ...
            'AreaOutputPort', false, ...
            'BoundingBoxOutputPort', false, ...
            'OutputDataType', 'single');

出力ビデオを表示する System object を作成します。

hVideoOut = vision.VideoPlayer('Name', 'Counted Staples');
hVideoOut.Position(3:4) = [650 350];

ストリーム処理ループ

ここでは処理ループを呼び出して、入力ビデオにある針の数をカウントします。このループはインスタンス化した System object を使用します。

ループは入力ファイルの末尾に達すると停止します。末尾は BinaryFileReader System object によって検出されます。

while hasFrame(hVideoSrc)
    I = rgb2gray(readFrame(hVideoSrc));
    Im = imtophat(I, strel('square',18));
    Im = imopen(Im, strel('rect',[15 3]));
    th = multithresh(Im); % Determine threshold using Otsu's method
    BW = Im > th;
    Centroids = step(hBlob, BW);               % Blob Analysis
    
    StaplesCount = int32(size(Centroids,1));  
    txt = sprintf('Staple count: %d', StaplesCount);
    It = insertText(I,[10 280],txt,'FontSize',22); % Display staples count
             
    Centroids(:, 2) = Centroids(1,2);            % Align markers horizontally

    It = insertMarker(It, Centroids, 'o', 'Size', 6, 'Color', 'r');
    It = insertMarker(It, Centroids, 'o', 'Size', 5, 'Color', 'r');
    It = insertMarker(It, Centroids, '+', 'Size', 5, 'Color', 'r');
    
    step(hVideoOut, It);
end

まとめ

出力ビデオには個々の針が十字入りの円でマークされて表示されます。また、各フレームに含まれる針の数も表示されます。