Main Content

ターゲット プラクティス解析のためのリアルタイム イメージの取得、イメージ処理、固定小数点ブロブ解析

この例では、Web カメラからリアルタイム イメージを取得し、固定小数点ブロブ解析を使用してイメージを処理し、レーザー ピストル ターゲットをスコアリングするためのワールド座標を決定する方法について説明します。

この例で取り上げているテクノロジーは、車の前にある物体までの距離の推定、細胞の医用画像解析など、幅広い用途に使用されています。この例の主な機能には次のようなものがあります。

  • 測定値を収集するための固定小数点ブロブ解析

  • リアルタイム イメージの取得

  • イメージ点のワールド座標を決定するためのカメラ キャリブレーション

  • 収集された測定値のワールド単位での正確性を確保するための、レンズ歪みのイメージ補正

  • ピクセル位置を実世界の単位の位置にマッピングすることによる、イメージ点のワールド座標の決定

この例のコードはすべてサンプル フォルダーに保存されます。コードを編集するには、このフォルダーに移動します。

cd(fullfile(docroot,'toolbox','fixpoint',...
'examples','laser_target_example'));
+LaserTargetExample フォルダーを書き込み可能な場所にコピーします。

ハードウェア セットアップ

カメラ

Image Acquisition Toolbox™ では、イメージとビデオをカメラおよびフレーム グラバーから MATLAB® および Simulink® に直接取得することができます。GigE Vision® ハードウェア用の Image Acquisition Toolbox サポート パッケージまたは USB Web カメラ用の MATLAB® サポート パッケージを使用して、リアルタイム イメージを取得して解析を実行するようにカメラを設定します。

カメラの設定の詳細については、Device Connection (Image Acquisition Toolbox)を参照してください。

ターゲット

次のコマンドを使用して、演習で使用する印刷ターゲットを作成します。このコードは、見開きにしたものが両面印刷されるポストスクリプト ファイルを生成します。片側にターゲット、もう片方の側にカメラ キャリブレーションのチェッカーボードが印刷されます。

distance = 10; % meters
offset_mm = 0; % mm
print_target = true;
LaserTargetExample.make_target_airpistol10m(distance, ...
offset_mm, print_target)

作成済みのターゲットは +LaserTargetExample/targets_for_printing フォルダーにあります。

設定

ターゲットのチェッカーボード側を向くように、カメラを設定します。撮影者はターゲットの方を向いています。ターゲットとカメラをボード上に取り付けることで、位置を固定しておくことができます。

アルゴリズム

イメージのキャリブレーション

カメラのキャリブレーションは、レンズとイメージ センサーのパラメーターを推定するプロセスです。これらのパラメーターは、カメラで撮影したオブジェクトを測定します。カメラ キャリブレーター (Computer Vision Toolbox) アプリを使用して、ターゲットの背面にあるチェッカーボード パターンを検出し、歪みを取り除きます。ターゲットの周囲光のしきい値を決定します。イメージが飽和しないように、カメラの設定または照明を調整しなければならない場合があります。関数 pointsToWorld を使用して、イメージ点のワールド座標を決定します。

詳細については、カメラ キャリブレーションとは (Computer Vision Toolbox)を参照してください。

ショットの検索とスコアリング

このアルゴリズムでは、レーザー ピストルの明るい光を検出することでショットをスコアリングします。撮影中は、フレームを取得し、明るいスポットが存在するかどうかを検出します。指定されたしきい値を超える明るいスポットが存在する場合、そのフレームを処理します。

ブロブ解析を使用して明るいスポットの中心を見つけ、場所をピクセル座標からワールド座標に変換します。イメージは 8 ビットの符号付き整数として保存されるため、ブロブ解析は固定小数点で実行されます。ワールド座標で明るいスポットの中心を見つけたら、その原点にある標的からの距離を計算し、ポイント値をそのショットに割り当てます。

例の実行

サンプル コードをパスに追加します。

addpath(fullfile(docroot,'toolbox','fixpoint',...
'examples','laser_target_example'));

+LaserTargetExample フォルダーに保存されている run スクリプトを実行して、シミュレーションを開始します。

LaserTargetExample.run
(1) gigecam
(2) webcam
(3) simulation
Enter the number of the source type:

スクリプトによって、シミュレーションに使用するソースの選択を求められます。3 を入力して、前に記録したセッションのシミュレーションを確認します。前に記録した 8 個のシミュレーションを利用できます。数字 (1 ~ 8) を入力してシミュレーションを開始します。

(1) saved_shots_20170627T201451
(2) saved_shots_20170627T201814
(3) saved_shots_20170702T153245
(4) saved_shots_20170702T153418
(5) saved_shots_20170702T162503
(6) saved_shots_20170702T162625
(7) saved_shots_20170702T162743
(8) saved_shots_20170702T162908
Enter number of file from list:

1 または 2 を入力すると、GigE Vision のカメラまたは Web カメラを設定するように求められます。その後、この例では、撮影者からターゲットまでの距離 (メートル) と撮影者名の入力を求められます。

異なるカメラの使用

自分のカメラを使用して例を設定するには、カメラ キャリブレーター (Computer Vision Toolbox) アプリを使用してターゲットの背面にあるチェッカーボードを検出し、歪みを取り除きます。キャリブレーション変数を MAT ファイルに保存します。GigE Vision のカメラと Web カメラのキャリブレーション変数は、次の MAT ファイルに保存されます。

  • +LaserTargetExample/gigecam_240x240_calibration_parameters.mat

  • +LaserTargetExample/webcam_LifeCam_480x480_camera_parameters.mat

次のいずれかのファイルを編集して、自分のカメラに適切な値で設定を置き換えます。

  • +LaserTargetExample/gigecam_setup.m

  • +LaserTargetExample/webcam_setup.m

データの確認

ショット データベース

撮影のたびに、ShotDatabase.csv という名前のファイルにヒットが記録されます。readtable を使用してデータを table オブジェクトに読み込んで、可視化することができます。たとえば、撮影後、これに ShotDatabase.csv ファイルが読み込まれ、次のコードにより多数のショットから成るグループの中心がプロットされます。

T = readtable('ShotDatabase.csv');
LaserTargetExample.make_target_airpistol10m;
LaserTargetExample.plot_shot_points(T.X, T.Y);
ax = gca;
line(mean(T.X)*[1,1], ax.YLim);
line(ax.XLim, mean(T.Y)*[1,1]);
grid on;

シミュレーションの記録

撮影のたびに、ショットが検出されたビデオ フレームは simulation_recordings という名前のフォルダー内のファイルに保存されます。これらのファイルを読み込んで、ショットから生データを検索することができます。アルゴリズムを編集することもできます。

変数 frames には、キャリブレーションに使用された最初のフレームに加え、検出された各ショット用に 10 個のフレームが含まれます。10 個のうちのそれぞれの実行に含まれる 1 番目のフレームは、ショットが検出された場所です。後続のフレームでは、自分の手の動きを確認できます。次のコードを使用して、このデータについて短いアニメーションを作成できます。

d = dir(fullfile('simulation_recordings','*.mat'));
record = load(fullfile(d(1).folder, d(1).name));
t = LaserTargetExample.SerialDateNumber_to_seconds(...
    record.times);
t = t-t(1);
figure
for k = 1:size(record.frames, 3)
    imshow(record.frames(:,:,k), ...
        'InitialMagnification','fit');
    title(sprintf('Time since beginning of round: %.3f seconds',...
        t(k)))
    drawnow
end

参考

(Computer Vision Toolbox) | (Computer Vision Toolbox) | (Computer Vision Toolbox) | (Computer Vision Toolbox)

関連するトピック