モーション解析と物体追跡

CalcGlobalOrientation

Comments from the Wiki

CalcGlobalOrientation(orientation, mask, mhi, timestamp, duration) → float

複数の選択領域の全体的なモーション方向を求めます.

パラメタ:
  • orientation (CvArr) – モーション勾配方向画像.関数 CalcMotionGradient によって計算されます.
  • mask (CvArr) – マスク画像. CalcMotionGradient で求められた有効勾配のマスクと,方向を計算する必要がある領域を示すマスクの論理積.
  • mhi (CvArr) – モーション履歴画像.
  • timestamp (float) – ミリ秒単位,あるいは別の単位で表される現在時間.大きな画像に対して UpdateMotionHistoryCalcMotionGradient を実行すると時間がかかる可能性があるので,事前に UpdateMotionHistory に渡す時間値を保存しておき,ここでそれを再利用する方が良いでしょう.
  • duration (float) – ミリ秒単位で表される,モーションの最大持続時間. UpdateMotionHistory のものと同じです.

この関数は,選択領域における全体的なモーション方向を求め,0から360度の間の角度を返します.これはまず,方向ヒストグラムを作成し,ヒストグラムが最大値を取る方向を基本方向とします.次に,全方向ベクトル(相対角度)の重み付き和を求め,基本方向からのズレを計算します:最近の動作ベクトルであるほど,より大きな重みを持ちます.結果として得られる角度は,基本方向とこのズレ量の和になります.

CalcMotionGradient

Comments from the Wiki

CalcMotionGradient(mhi, mask, orientation, delta1, delta2, apertureSize=3) → None

モーション履歴画像の勾配方向を求めます.

パラメタ:
  • mhi (CvArr) – モーション履歴画像.
  • mask (CvArr) – マスク画像.モーション勾配データが有効なピクセルがマークされます.出力パラメータです.
  • orientation (CvArr) – モーション勾配方向画像.0~360 度の角度.
  • delta1 (float) – 以下を参照してください.
  • delta2 (float) – 以下を参照してください.
  • apertureSize (int) – この関数で利用される微分オペレータのアパーチャサイズ:CV _ SCHARR, 1, 3, 5, 7( Sobel を参照してください).

この関数は, mhi の微分 DxDy を求め,勾配方向を次のように計算します:

\texttt{orientation} (x,y)= \arctan{\frac{Dy(x,y)}{Dx(x,y)}}

ここでは,(関数 CartToPolar と同様に) Dx(x,y)Dy(x,y) の両方の符号が考慮されます.その後,勾配方向が有効である箇所を示すために mask が埋められます.

この関数は,各ピクセル (x,y) の近傍において,最小( m(x,y) ) と最大( M(x,y) )の mhi 値を求め,以下の条件を満たす場合のみ有効な勾配であるとします.

\min ( \texttt{delta1} ,  \texttt{delta2} )  \le M(x,y)-m(x,y)  \le \max ( \texttt{delta1} , \texttt{delta2} ).

CalcOpticalFlowBM

Comments from the Wiki

CalcOpticalFlowBM(prev, curr, blockSize, shiftSize, max_range, usePrevious, velx, vely) → None

ブロックマッチング法を用いて,2つの画像に対するオプティカルフローを求めます.

パラメタ:
  • prev (CvArr) – 1番目の画像.8ビット,シングルチャンネル.
  • curr (CvArr) – 2番目の画像.8ビット,シングルチャンネル.
  • blockSize (CvSize) – 比較される基本ブロックのサイズ.
  • shiftSize (CvSize) – ブロック座標の増加量.
  • max_range (CvSize) – ピクセル単位で表される,ブロック周辺の探索範囲サイズ.
  • usePrevious (int) – 前回のフレームの速度場を,今回の計算の初期値として利用します.
  • velx (CvArr) –

    オプティカルフローの水平成分.32ビット,浮動小数点型,シングルチャンネルで,サイズは次のようになります.

    \left \lfloor   \frac{\texttt{prev->width} - \texttt{blockSize.width}}{\texttt{shiftSize.width}}   \right \rfloor \times \left \lfloor   \frac{\texttt{prev->height} - \texttt{blockSize.height}}{\texttt{shiftSize.height}}   \right \rfloor

  • vely (CvArr) – オプティカルフローの垂直成分. velx と同じサイズ,32ビット,浮動小数点型,シングルチャンネル.

この関数は,重なり合った \texttt{blockSize.width} \times \texttt{blockSize.height} ピクセルのブロック毎にオプティカルフローを計算します.したがって,速度場のサイズは元の画像よりも小さくなります.この関数は, prev の各ブロックに対して, curr からそれに似たブロックを探そうとします.その探索範囲は,元のブロックの近傍,あるいは,( use_previous=1 の場合)前回の関数呼び出しで計算された速度分 (velx(x0,y0),vely(x0,y0)) だけ移動したブロックの近傍です.

CalcOpticalFlowHS

Comments from the Wiki

CalcOpticalFlowHS(prev, curr, usePrevious, velx, vely, lambda, criteria) → None

2つの画像に対するオプティカルフローを求めます.

パラメタ:
  • prev (CvArr) – 1番目の画像.8ビット,シングルチャンネル.
  • curr (CvArr) – 2番目の画像.8ビット,シングルチャンネル.
  • usePrevious (int) – 前回のフレームの速度場を,今回の計算の初期値として利用します.
  • velx (CvArr) – オプティカルフローの水平成分.入力画像と同じサイズ,32ビット,浮動小数点型,シングルチャンネル.
  • vely (CvArr) – オプティカルフローの垂直成分.入力画像と同じサイズ,32ビット,浮動小数点型,シングルチャンネル.
  • lambda (float) – ラグランジュ乗数.
  • criteria (CvTermCriteria) – 速度計算の停止基準.

この関数は,Horn-Schunck のアルゴリズム Horn81 を用いて,1番目の画像の各ピクセルに対するフローを計算します.

CalcOpticalFlowLK

Comments from the Wiki

CalcOpticalFlowLK(prev, curr, winSize, velx, vely) → None

2つの画像に対するオプティカルフローを求めます.

パラメタ:
  • prev (CvArr) – 1番目の画像.8ビット,シングルチャンネル.
  • curr (CvArr) – 2番目の画像.8ビット,シングルチャンネル.
  • winSize (CvSize) – ピクセルをグループ化するための平均化窓のサイズ.
  • velx (CvArr) – オプティカルフローの水平成分.入力画像と同じサイズ,32ビット,浮動小数点型,シングルチャンネル.
  • vely (CvArr) – オプティカルフローの垂直成分.入力画像と同じサイズ,32ビット,浮動小数点型,シングルチャンネル.

この関数は,Lucas-Kanade のアルゴリズム Lucas81 を用いて,1番目の画像の各ピクセルに対するフローを計算します.

CalcOpticalFlowPyrLK

Comments from the Wiki

CalcOpticalFlowPyrLK(prev, curr, prevPyr, currPyr, prevFeatures, winSize, level, criteria, flags, guesses = None) -> (currFeatures, status, track_error)

Lucas-Kanade法を画像ピラミッドを利用して反復実行することにより,疎な特徴集合に対するオプティカルフローを求めます.

パラメタ:
  • prev (CvArr) – 時間 t における1番目のフレーム.
  • curr (CvArr) – 時間 t + dt における2番目のフレーム.
  • prevPyr (CvArr) – 1番目のフレームに対する画像ピラミッドのバッファ.このポインタが NULL ではない場合,バッファは,レベル 1 から level までの画像ピラミッドを格納するのに十分なサイズでなければいけません.合計 (image_width+8)*image_height/3 バイトが十分なサイズといえます.
  • curr_pyrprevPyr と同様.こちらは2番目のフレームに対して利用されます.
  • prevFeatures (CvPoint2D32f) – フローを検出するのに必要な(特徴)点の配列.
  • currFeatures (CvPoint2D32f) – 2次元座標点の配列.入力特徴の2番目のフレームにおける新しい位置が求められ,ここに格納されます.
  • winSize (CvSize) – 画像ピラミッドの各レベルにおける探索窓のサイズ.
  • level (int) – 画像ピラミッドの最大レベル数.これが 0 ならば,画像ピラミッドは利用されません(1レベル). 1 ならば,2レベルまでの画像ピラミッドが利用されます.以降同様.
  • status (str) – 配列.特徴点のフローが検出できた場合は,それに対応する要素が 1 にセットされ,そうでない場合は 0 にセットされます.
  • track_error (float) – オプション.移動前の特徴点の周辺領域と,移動後の特徴点の周辺領域との差を含む配列. NULL でも構いません.
  • criteria (CvTermCriteria) – 各レベルの画像ピラミッドの各特徴点に対するフローを求める反復計算の停止基準.
  • flags (int) –

    雑多なフラグ:

    • CV_LKFLOWPyr_A_READY 1番目のフレームに対する画像ピラミッドが事前(この関数の呼び出し前)に計算されています.
    • CV_LKFLOWPyr_B_READY 2番目のフレームに対する画像ピラミッドが事前(この関数の呼び出し前)に計算されています.
  • guesses (CvPoint2D32f) – オプション.2番目のフレームにおける特徴点座標の推定値(初期値)の配列. prevFeatures と同じ長さです.

この関数は,Lucas-Kanade法を利用したオプティカルフロー計算を,画像ピラミッドを利用して数回反復するバージョンの実装です Bouguet00 .以前のビデオフレームの特徴点座標が与えられると,現在のフレームでの座標が計算されます.また,この関数は,サブピクセル精度で座標を検出します.

パラメータ prevPyrcurrPyr は,どちらも以下の規則に従います:画像ポインタが0の場合,この関数は内部にバッファを確保後,画像ピラミッドを計算します.そして,処理が終わるとそのバッファは解放されます.画像ポインタが0ではない場合,画像ピラミッドを計算し,指定のバッファにそれを格納します.ただし,フラグ CV_LKFLOWPyr_A[B]_READY が指定されている場合を除きます.また,これらの画像は,ガウシアンピラミッドのデータが入るのに十分な大きさが必要です.関数呼び出し後,両方の画像ピラミッドが計算され,次の関数呼び出しに備えて対応画像の準備完了フラグがセットされます(つまり,通常は,一番最初の関数呼び出し以外は, CV_LKFLOWPyr_A_READY が指定されています).

CamShift

Comments from the Wiki

CamShift(prob_image, window, criteria)-> (int, comp, box)

物体の中心,サイズ,姿勢を求めます.

パラメタ:
  • prob_image (CvArr) – 物体のヒストグラムのバックプロジェクション( CalcBackProject を参照).
  • window (CvRect) – 探索窓の初期状態.
  • criteria (CvTermCriteria) – 探索の停止基準.
  • comp (CvConnectedComp) – 結果として得られる構造体.最終的に収束した探索窓の座標(フィールド comp->rect ),および窓内の全ピクセル値の合計(フィールド comp->area )を含みます.
  • box (CvBox2D) – オブジェクトに外接する矩形

この関数は,CAMSHIFT 物体追跡アルゴリズム Bradski98 の実装です.まず, MeanShift を用いて物体中心を求め,次に,物体のサイズと姿勢を計算します.この関数は, MeanShift 内における反復数を返します.

cv.hpp で宣言されている CamShiftTracker クラスは,この関数を利用したカラー物体追跡器の実装です.

CvKalman

Comments from the Wiki

class CvKalman

カルマンフィルタの状態構造体.

MP

観測ベクトルの次元数.

DP

状態ベクトルの次元数.

CP

制御ベクトルの次元数.

state_pre

状態の推定値 (x’(k)):x(k)=A*x(k-1)+B*u(k).

state_post

更新された状態の推定値 (x(k)): x(k)=x’(k)+K(k)*(z(k)-H*x’(k)).

transition_matrix

システムの時間遷移に関する線形モデル (A).

control_matrix

制御行列 (B)(制御していない場合は,これは利用されません).

measurement_matrix

観測行列 (H).

process_noise_cov

プロセスノイズ(時間遷移に関するノイズ)の共分散行列 (Q).

measurement_noise_cov

観測ノイズの共分散行列 (R).

error_cov_pre

今の時刻の誤差行列 (P’(k)): P’(k)=A*P(k-1)*At + Q.

gain

最適カルマンゲイン (K(k)): K(k)=P’(k)*Ht*inv(H*P’(k)*Ht+R).

error_cov_post

更新された誤差の共分散行列 (P(k)): P(k)=(I-K(k)*H)*P’(k).

構造体 CvKalman は,カルマンフィルタの状態を記憶しておくために利用されます.これは,関数 CreateKalman によって作成,関数 KalmanPredictKalmanCorrect によって更新され ます.通常,この構造体は標準カルマンフィルタで利用されます(以下の表記法と式は,優れたカルマンフィルタのチュートリアルである Welch95 から引用しました)

\begin{array}{l} x_k=A  \cdot x_{k-1}+B  \cdot u_k+w_k \\ z_k=H  \cdot x_k+v_k \end{array}

ここで, x_k (x_{k-1}) : 時刻 \emph{k} (\emph{k-1}) におけるシステムの状態, z_k : 時刻 \emph{k} における観測値, u_k : 時刻 \emph{k} における制御入力,を表します.

また, w_kv_k はそれぞれ,正規分布に従うプロセスノイズ,および観測ノイズです:

\begin{array}{l} p(w)  \sim N(0,Q) \\ p(v)  \sim N(0,R) \end{array}

つまり,

Q プロセスノイズの共分散行列,定数あるいは変数, R 観測ノイズの共分散行列,定数あるいは変数

標準カルマンフィルタの場合,全ての行列:A, B, H, Q, R は, CreateKalman によって構造体 CvKalman が確保された後で1度だけ初期化されます.しかし,拡張カルマンフィルタの式を現在のシステム状態周辺において線形化することで,拡張カルマンフィルタをシミュレートするために,同じ構造体と同じ関数が利用されることがあります.この場合,A, B, H (おそらく,Q と R も)毎ステップ更新されます.

CreateKalman

Comments from the Wiki

CreateKalman(dynam_params, measure_params, control_params=0) → CvKalman

カルマンフィルタの構造の領域を確保します.

パラメタ:
  • dynam_params (int) – 状態ベクトルの次元数.
  • measure_params (int) – 観測ベクトルの次元数.
  • control_params (int) – 制御ベクトルの次元数.

この関数は,構造体 CvKalman と,そのメンバであるすべての行列の領域を確保し,何らかの方法で初期化します.

KalmanCorrect

Comments from the Wiki

KalmanCorrect(kalman, measurement) → cvmat

モデルの状態を更新します.

パラメタ:
  • kalman (CvKalman) – CreateKalman によって返されるカルマンフィルタオブジェクト.
  • measurement (CvMat) – 観測ベクトルを含む CvMat.

この関数は,モデル状態に対する観測ベクトルが与えられると,それに基づき確率モデル状態を更新します:

\begin{array}{l} K_k=P'_k  \cdot H^T  \cdot (H  \cdot P'_k  \cdot H^T+R)^{-1} \\ x_k=x'_k+K_k  \cdot (z_k-H  \cdot x'_k) \\ P_k=(I-K_k  \cdot H)  \cdot P'_k \end{array}

ここで

z_k 与えられた観測 ( mesurement パラメータ)
K_k カルマン「ゲイン」行列

です. この関数は,更新された状態を kalman->state_post に格納し,そのポインタを返します.

KalmanPredict

Comments from the Wiki

KalmanPredict(kalman, control=None) → cvmat

次のモデル状態を推定します.

パラメタ:
  • kalman (CvKalman) – CreateKalman によって返されるカルマンフィルタオブジェクト.
  • control (CvMat) – 制御ベクトル u_k , 制御入力が存在しない場合( control_params =0 )のみ NULL.

この関数は,現在の状態から次の確率モデル状態を推定し, kalman->state_pre に格納します:

\begin{array}{l} x'_k=A x_{k-1} + B u_k \\ P'_k=A P_{k-1} A^T + Q \end{array}

ここで

x'_k 状態の推定値 kalman->state_pre ,
x_{k-1} 前回の更新された状態の推定値 kalman->state_post (最初は何らかの方法で初期化される,デフォルトではゼロベクトル),
u_k 制御入力 ( control パラメータ),
P'_k 今の時刻の誤差の共分散行列 kalman->error_cov_pre
P_{k-1} 前回の更新された誤差の共分散行列 kalman->error_cov_post (最初は何らかの方法で初期化される,デフォルトでは単位行列),

この関数は,状態の推定値を返します.

KalmanUpdateByMeasurement

KalmanCorrect と同義

KalmanUpdateByTime

KalmanPredict と同義

MeanShift

Comments from the Wiki

MeanShift(prob_image, window, criteria) → comp

バックプロジェクション上の物体中心を求めます.

パラメタ:
  • prob_image (CvArr) – 物体のヒストグラムのバックプロジェクション( CalcBackProject を参照してください).
  • window (CvRect) – 探索窓の初期状態.
  • criteria (CvTermCriteria) – 探索の停止基準.
  • comp (CvConnectedComp) – 結果として得られる構造体.最終的に収束した探索窓の座標(フィールド comp->rect ),および窓内の全ピクセル値の合計(フィールド comp->area )を含みます.

この関数は,物体のバック工プロジェクションと探索窓の初期位置が与えられると,その物体の中心を求めるための反復計算を行います.反復計算は,探索窓中心の移動量が与えられた閾値より小さくなるか,あるいは関数の反復数が最大値に達するまで続けられます.また,この関数は,その反復数を返します.

SegmentMotion

Comments from the Wiki

SegmentMotion(mhi, seg_mask, storage, timestamp, seg_thresh) → None

モーション全体を個別のモーションに分解します.

パラメタ:
  • mhi (CvArr) – モーション履歴画像.
  • seg_mask (CvArr) – 検出されたマスクが保存される画像.シングルチャンネル,32ビット,浮動小数点型.
  • storage (CvMemStorage) – モーション連結成分のシーケンスが保存されるメモリストレージ.
  • timestamp (float) – ミリ秒単位,あるいは別の単位で表される現在時間.
  • seg_thresh (float) – 分割の閾値.モーション履歴の間隔と同じか,それよりも大きい値の方が良いでしょう.

この関数は,すべてのモーション成分を検出し,それぞれ個別の値を用いて seg_mask にマークします.これは,各モーション成分毎に,構造体 CvConnectedComp のシーケンスを返します.その後,特定の成分を抽出するマスク Cmp を利用し, CalcGlobalOrientation によって全てのモーション成分のモーション方向が計算されます.

SnakeImage

Comments from the Wiki

SnakeImage(image, points, alpha, beta, gamma, win, criteria, calc_gradient=1) → new_points

そのエネルギーが最小となるように輪郭位置を変更します.

パラメタ:
  • image (IplImage) – 入力画像,あるいは外部エネルギー場.
  • points (CvPoints) – 輪郭点 (snake).
  • alpha (sequence of float) – 連続エネルギーの重み.1つの浮動小数点数,あるいは浮動小数点数リスト.後者の場合,1つの要素が1つの輪郭点に対応します.
  • beta (sequence of float) – 曲率エネルギーの重み. alpha と同様.
  • gamma (sequence of float) – 画像エネルギーの重み. alpha と同様.
  • win (CvSize) – 最小値探索に用いられる各輪郭点の近傍領域サイズ. win.width および win.height は奇数でなければいけません.
  • criteria (CvTermCriteria) – 停止基準.
  • calc_gradient (int) – 勾配フラグ.0以外の場合,この関数は,各画像ピクセルに対する勾配の強さを計算し,それをエネルギー場として扱います.そうでない場合,入力画像はそのまま扱われます.

この関数は,内部エネルギーと外部エネルギーの総和が最小になるように輪郭点を更新します.内部エネルギーは,輪郭形状に依存します(滑らかな輪郭ほど,内部エネルギーが小さくなります).また,外部エネルギーはエネルギー場に依存し,画像勾配を用いる場合は,画像エッジのようにエネルギーが極小値をとる場所において最小になります.

パラメータ criteria.epsilon は,1回の計算で最低何個の輪郭点が移動すれば反復計算が継続されるか,を規定します.

ある試行において,移動する輪郭点の個数が criteria.epsilon よりも少ないか,あるいは,関数の反復計算回数が criteria.max_iter に達した場合,この関数は終了します.

この関数は更新された輪郭点のリストを返します.

UpdateMotionHistory

Comments from the Wiki

UpdateMotionHistory(silhouette, mhi, timestamp, duration) → None

動作を表すシルエット画像を用いて,モーション履歴画像を更新します.

パラメタ:
  • silhouette (CvArr) – モーションが発生した場所が 0 以外のピクセル値をもつシルエットマスク.
  • mhi (CvArr) – この関数によって更新される,モーション履歴画像(シングルチャンネル,32ビット浮動小数点型).
  • timestamp (float) – ミリ秒単位,あるいは別の単位で表される現在時間.
  • duration (float) – timestamp と同じ単位で表される,モーションの最大持続時間.

この関数は,モーション履歴画像を以下のように更新します:

\texttt{mhi} (x,y)= \forkthree{\texttt{timestamp}}{if $\texttt{silhouette}(x,y) \ne 0$}{0}{if $\texttt{silhouette}(x,y) = 0$ and $\texttt{mhi} < (\texttt{timestamp} - \texttt{duration})$}{\texttt{mhi}(x,y)}{otherwise}

つまり,モーションが発生した場所のMHI(モーション履歴画像)ピクセルには,現在のタイムスタンプがセットされ,モーションが発生からある程度以上時間が経ったピクセルの値はクリアされます.