Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

configureKalmanFilter

オブジェクトの追跡のためのカルマン フィルターの作成

説明

kalmanFilter = configureKalmanFilter(MotionModel,InitialLocation,InitialEstimateError,MotionNoise,MeasurementNoise) は、物理オブジェクトの追跡のために構成された vision.KalmanFilter オブジェクトを返します。このオブジェクトは、M 次元の直交座標空間を等速度または等加速度で移動します。関数は、InitialLocation ベクトルの長さから次元数 M を決定します。

この関数は、vision.KalmanFilter オブジェクトを直交座標系で物理オブジェクトを追跡するために設定する簡単な方法を提供します。追跡されるオブジェクトは、等速度や等加速度で移動する場合があります。統計量はすべての次元に沿って同じです。カルマン フィルターを異なる仮定に基づいて設定するには、vision.KalmanFilter オブジェクトを直接使用します。

すべて折りたたむ

カルマン フィルター処理、前景検出およびブロブ解析を使用してボールを検出し、追跡します。

ビデオ フレームの読み取り、前景にある物理オブジェクトの検出、結果の表示を行う System object をそれぞれ作成します。

videoReader = VideoReader('singleball.mp4');
videoPlayer = vision.VideoPlayer('Position',[100,100,500,400]);
foregroundDetector = vision.ForegroundDetector('NumTrainingFrames',10,...
                'InitialVariance',0.05);
blobAnalyzer = vision.BlobAnalysis('AreaOutputPort',false,...
                'MinimumBlobArea',70);

各ビデオ フレームを処理してボールを検出し、追跡します。この例では、現在のビデオ フレームを読み取った後、背景除去とブロブ解析を使用してボールを探します。ボールが最初に検出された時点でカルマン フィルターが作成されます。カルマン フィルターはボールが検出されたかどうかに関係なく、その位置を判別します。ボールが検出された場合、カルマン フィルターは、まず現在のビデオ フレームにおけるボールの状態を予測します。次に、フィルターは新たに検出された位置を使って状態を修正し、フィルター処理された位置を計算します。ボールが検出されない場合、カルマン フィルターは前の状態のみに基づいてボールの現在の位置を予測します。

  kalmanFilter = []; isTrackInitialized = false;
   while hasFrame(videoReader)
     colorImage  = readFrame(videoReader);

     foregroundMask = step(foregroundDetector,im2gray(im2single(colorImage)));
     detectedLocation = step(blobAnalyzer,foregroundMask);
     isObjectDetected = size(detectedLocation, 1) > 0;

     if ~isTrackInitialized
       if isObjectDetected
         kalmanFilter = configureKalmanFilter('ConstantAcceleration',...
                  detectedLocation(1,:), [1 1 1]*1e5, [25, 10, 10], 25);
         isTrackInitialized = true;
       end
       label = ''; circle = zeros(0,3);
     else
       if isObjectDetected
         predict(kalmanFilter);
         trackedLocation = correct(kalmanFilter, detectedLocation(1,:));
         label = 'Corrected';
       else
         trackedLocation = predict(kalmanFilter);
         label = 'Predicted';
       end
       circle = [trackedLocation, 5];
     end

     colorImage = insertObjectAnnotation(colorImage,'circle',...
                circle,label,'AnnotationColor','red');
     step(videoPlayer,colorImage);
     pause(0.1);
   end

リソースを解放します。

release(videoPlayer);

入力引数

すべて折りたたむ

運動モデル。'ConstantVelocity' または 'ConstantAcceleration' として指定します。選択した運動モデルは、すべての次元に適用されます。たとえば、2 次元直交座標系の場合です。このモードは、X 方向と Y 方向の両方に適用されます。

データ型: char

オブジェクトの初期位置。数値ベクトルとして指定します。また、この引数は座標系の次元数も決定します。たとえば、初期位置を 2 要素ベクトル [x0, y0] として指定すると、2 次元座標系であると仮定されます。

データ型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

初期推定の不確定性分散。2 要素または 3 要素ベクトルとして指定します。初期推定誤差は、追跡されるオブジェクトの位置、速度および加速度の初期推定の分散を指定します。関数は、InitialLocation プロパティで設定する位置でのオブジェクトの初期速度および加速度がゼロと仮定します。位置、速度、または加速度を測定できる場合は、InitialEstimateError を次の近似値に設定できます。

(assumed values – actual values)2 + the variance of the values

多くの視覚的オブジェクト追跡アプリケーションにおいて、オブジェクト検出器からは一般的にオブジェクトの位置の測定値しか得られません。この場合、InitialEstimationError の最初の要素 (LocationVariance) を MeasurementNoise と同じ値に設定できます。速度と加速度の分散値は、初期状態が不明であることを示すために大きな値に設定する必要があります。たとえば、分散 1 でオブジェクトの 2 次元位置を検出して等速運動モデルを使用する場合、LocationVariance を 1 に設定し、2 番目の要素 VelocityVariance を 1e4 などの高い値に設定できます。

このプロパティの値は、最初の数回の検出のカルマン フィルターに影響します。その後、ノイズと入力データにより推定誤差が決定されます。初期推定誤差の値が大きいほど、カルマン フィルターはより迅速に検出結果に適応しやすくなります。ただし、値が大きいと、カルマン フィルターは最初の数回の検出からノイズを除去することもできません。

等速度には 2 要素ベクトルとして、等価速度には 3 要素ベクトルとして初期推定誤差を指定します。

MotionModelInitialEstimateError
ConstantVelocity[LocationVariance, VelocityVariance]
ConstantAcceleration[LocationVariance, VelocityVariance, AccelerationVariance]

データ型: double | single

選択された、実際のモデルの偏差。2 要素ベクトルまたは 3 要素ベクトルとして指定します。運動ノイズは、選択したモデルからの偏差に対するカルマン フィルターの許容誤差を指定します。この許容誤差は、オブジェクトの実際の運動と選択したモデルの運動との間の差を、その差がランダムな偏差によるものであるか、運動の単なる小さな変化 (方向や速度など) によるものであるかに関係なく補正します。この値が増加すると、カルマン フィルターの状態が検出に一致するように変化する場合があります。そのような増加により、カルマン フィルターは検出から十分なノイズを除去できないことがあります。このプロパティの値が一定であることから、カルマン フィルターの長期間のパフォーマンスに影響する場合があります。

MotionModelMotionNoise
ConstantVelocity[LocationVariance, VelocityVariance]
ConstantAcceleration[LocationVariance, VelocityVariance, AccelerationVariance]

データ型: double | single

検出された位置の分散の精度の低下。スカラーとして指定します。これは、物理オブジェクトの検出に使用される手法に直接関連します。たとえば、検出された位置の誤差が約 5 ピクセルだった場合、測定ノイズを 5^2 に設定します。MeasurementNoise 値を増加させると、カルマン フィルターは検出からさらに多くのノイズを除去できます。ただし、同時にカルマン フィルターは選択した運動モデルを厳密に順守しすぎるため、検出に重点が置かれません。このプロパティの値が一定であることから、カルマン フィルターの長期間のパフォーマンスに影響する場合があります。

データ型: double | single

出力引数

すべて折りたたむ

設定されたカルマン フィルター。追跡用の vision.KalmanFilter オブジェクトとして返されます。

アルゴリズム

この関数は、追跡のために vision.KalmanFilter オブジェクトを構成する簡単な方法を提供します。カルマン フィルターは、離散時間の線形状態空間システムを実装しています。関数 configureKalmanFilter は、vision.KalmanFilter オブジェクトのプロパティを設定します。

InitialLocation プロパティは、カルマン フィルターの状態空間モデルで使用する測定ベクトルに対応します。次の表は、測定ベクトル M をカルマン フィルターの状態空間モデルに対応付けます。
状態遷移モデル A および測定モデル H

状態空間モデルの状態遷移モデル A および測定モデル H は、M と同一の部分行列 As および Hs のそれぞれから作成された対角行列をブロックするように設定されます。

A = blkdiag(As _1, As _2, ..., As _M)

H = blkdiag(Hs _1, Hs _2, ..., Hs _M)

部分行列 As および Hs は、次のように記述されます。
MotionModelAsHs
'ConstantVelocity'[1 1; 0 1][1 0]
'ConstantAcceleration'[1 1 0.5; 0 1 1; 0 0 1] [1 0 0]
 
初期状態 x:
MotionModel初期状態 x
'ConstantVelocity'[InitialLocation(1), 0, ..., InitialLocation(M), 0]
'ConstantAcceleration'[InitialLocation(1), 0, 0, ..., InitialLocation(M), 0, 0]
 
初期状態推定誤差の共分散行列 P:
P = diag(repmat(InitialError, [1, M]))
 
プロセス ノイズの共分散 Q:
Q = diag(repmat(MotionNoise, [1, M]))
 
測定ノイズの共分散 R:
R = diag(repmat(MeasurementNoise, [1, M])).

バージョン履歴

R2012b で導入