このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
Web カメラ イメージ取得を後処理と並行して実行
この例では、Web カメラからのフレーム取得をデータの後処理と並行して実行する方法を示します。
この例では、並列ワーカーを使用してイメージ取得を実行し、そのデータを後処理のために DataQueue
オブジェクトを使用してクライアントにストリーミングして戻します。
MATLAB クライアントの代わりにワーカーを使用して後処理を実行するには、イメージ取得と並列イメージ処理を実行を参照してください。
並列環境の設定
ローカル クラスターのいずれかのワーカーで並列プールを起動します。
parpool('Processes',1);
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to parallel pool with 1 workers.
情報をワーカーから 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
参考
parpool
| parallel.pool.DataQueue
| afterEach
| parfeval
| imshow