モーション解析と物体追跡
CalcGlobalOrientation
Comments from the Wiki
-
CalcGlobalOrientation(orientation, mask, mhi, timestamp, duration) → float
複数の選択領域の全体的なモーション方向を求めます.
この関数は,選択領域における全体的なモーション方向を求め,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
の微分
と
を求め,勾配方向を次のように計算します:
ここでは,(関数
CartToPolar
と同様に)
と
の両方の符号が考慮されます.その後,勾配方向が有効である箇所を示すために
mask
が埋められます.
この関数は,各ピクセル
の近傍において,最小(
) と最大(
)の mhi 値を求め,以下の条件を満たす場合のみ有効な勾配であるとします.
CalcOpticalFlowBM
Comments from the Wiki
-
CalcOpticalFlowBM(prev, curr, blockSize, shiftSize, max_range, usePrevious, velx, vely) → None
ブロックマッチング法を用いて,2つの画像に対するオプティカルフローを求めます.
この関数は,重なり合った
ピクセルのブロック毎にオプティカルフローを計算します.したがって,速度場のサイズは元の画像よりも小さくなります.この関数は,
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_pyr – prevPyr と同様.こちらは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
.以前のビデオフレームの特徴点座標が与えられると,現在のフレームでの座標が計算されます.また,この関数は,サブピクセル精度で座標を検出します.
パラメータ
prevPyr
と
currPyr
は,どちらも以下の規則に従います:画像ポインタが0の場合,この関数は内部にバッファを確保後,画像ピラミッドを計算します.そして,処理が終わるとそのバッファは解放されます.画像ポインタが0ではない場合,画像ピラミッドを計算し,指定のバッファにそれを格納します.ただし,フラグ
CV_LKFLOWPyr_A[B]_READY
が指定されている場合を除きます.また,これらの画像は,ガウシアンピラミッドのデータが入るのに十分な大きさが必要です.関数呼び出し後,両方の画像ピラミッドが計算され,次の関数呼び出しに備えて対応画像の準備完了フラグがセットされます(つまり,通常は,一番最初の関数呼び出し以外は,
CV_LKFLOWPyr_A_READY
が指定されています).
CamShift
Comments from the Wiki
-
CamShift(prob_image, window, criteria)-> (int, comp, box)
物体の中心,サイズ,姿勢を求めます.
この関数は,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
によって作成,関数
KalmanPredict
と
KalmanCorrect
によって更新され
ます.通常,この構造体は標準カルマンフィルタで利用されます(以下の表記法と式は,優れたカルマンフィルタのチュートリアルである
Welch95
から引用しました)
ここで,
: 時刻
におけるシステムの状態,
: 時刻
における観測値,
: 時刻
における制御入力,を表します.
また,
と
はそれぞれ,正規分布に従うプロセスノイズ,および観測ノイズです:
つまり,
プロセスノイズの共分散行列,定数あるいは変数,
観測ノイズの共分散行列,定数あるいは変数
標準カルマンフィルタの場合,全ての行列: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
モデルの状態を更新します.
この関数は,モデル状態に対する観測ベクトルが与えられると,それに基づき確率モデル状態を更新します:
ここで
|
与えられた観測 ( mesurement パラメータ) |
|
カルマン「ゲイン」行列 |
です.
この関数は,更新された状態を
kalman->state_post
に格納し,そのポインタを返します.
KalmanPredict
Comments from the Wiki
-
KalmanPredict(kalman, control=None) → cvmat
次のモデル状態を推定します.
パラメタ: |
- kalman (CvKalman) – CreateKalman によって返されるカルマンフィルタオブジェクト.
- control (CvMat) – 制御ベクトル , 制御入力が存在しない場合( control_params =0 )のみ NULL.
|
この関数は,現在の状態から次の確率モデル状態を推定し,
kalman->state_pre
に格納します:
ここで
|
状態の推定値 kalman->state_pre , |
|
前回の更新された状態の推定値 kalman->state_post (最初は何らかの方法で初期化される,デフォルトではゼロベクトル), |
|
制御入力 ( control パラメータ), |
|
今の時刻の誤差の共分散行列 kalman->error_cov_pre |
|
前回の更新された誤差の共分散行列 kalman->error_cov_post (最初は何らかの方法で初期化される,デフォルトでは単位行列), |
この関数は,状態の推定値を返します.
MeanShift
Comments from the Wiki
-
MeanShift(prob_image, window, criteria) → comp
バックプロジェクション上の物体中心を求めます.
この関数は,物体のバック工プロジェクションと探索窓の初期位置が与えられると,その物体の中心を求めるための反復計算を行います.反復計算は,探索窓中心の移動量が与えられた閾値より小さくなるか,あるいは関数の反復数が最大値に達するまで続けられます.また,この関数は,その反復数を返します.
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 と同じ単位で表される,モーションの最大持続時間.
|
この関数は,モーション履歴画像を以下のように更新します:
つまり,モーションが発生した場所のMHI(モーション履歴画像)ピクセルには,現在のタイムスタンプがセットされ,モーションが発生からある程度以上時間が経ったピクセルの値はクリアされます.