Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Web カメラ イメージ取得を後処理と並行して実行

この例では、Web カメラからのフレーム取得をデータの後処理と並行して実行する方法を示します。

この例では、並列ワーカーを使用してイメージ取得を実行し、そのデータを後処理のために DataQueue オブジェクトを使用してクライアントにストリーミングして戻します。

MATLAB クライアントの代わりにワーカーを使用して後処理を実行するには、イメージ取得と並列イメージ処理を実行を参照してください。

並列環境の設定

ローカル クラスターのいずれかのワーカーで並列プールを起動します。

parpool('local',1);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 1).

情報をワーカーから MATLAB クライアントに戻すには、DataQueue オブジェクトを作成します。

D = parallel.pool.DataQueue;

figure オブジェクトを作成し、'Visible''on' に設定して、ライブ スクリプトの外側で開くようにします。イメージを DataQueue オブジェクトから受け取るたびにそのイメージを表示するには、afterEach を使用します。

fig = figure('Visible','on');
afterEach(D,@processDisp);

データの取得と後処理を並行して実行

取得の頻度、つまり 1 秒間にカメラから取得するフレーム数を定義します。

freq = 5;

後処理にかかる時間を考慮して値を選択します。そうしないと、ビデオ ストリームが大幅に遅れることがあります。

並列ワーカーでデータ収集を開始するには、parfeval を呼び出して取得関数、DataQueue オブジェクト、取得速度を引数として渡します。

f = parfeval(@getFrameFromCamera,0,D,freq);

30 秒間フレームを取得します。この例では、ぶれフィルターを後処理のステップとして適用し、元のフレームと処理後のフレームを並べて表示します。

pause(30);

ビデオ フィードを停止するには、取得をキャンセルします。

cancel(f);

ワーカーでの後処理を示す詳細な例は、イメージ取得と並列イメージ処理を実行を参照してください。

補助関数の定義

関数 getFrameFromCamera は Web カメラに接続し、イメージ フレームを取得して、無限ループで DataQueue オブジェクトに送信します。

function getFrameFromCamera(D,freq)
    cam = webcam;
    while true
        img = snapshot(cam);
       
        send(D,img);
        pause(1/freq);
    end
end

関数 processDisp はフレームを後処理して、DataQueue オブジェクトがデータを受け取るたびに元のフレームと処理後のフレームを表示します。

function processDisp(img)
    imgBlur = imgaussfilt(img,3);
    imshow([img, imgBlur],'Parent',gca)
end

参考

| | | |

関連するトピック