モーション解析と物体追跡
cv::Acc
- 
Acc(image, sum, mask=NULL) → None
- 画像フレームを累算器に加算します. - 
| パラメタ: | 
image (CvArr) – 入力画像.1チャンネルまたは3チャンネル,3ビットまたは32ビット,浮動小数点型(マルチチャンネル画像の各チャンネルは個別に処理されます)sum (CvArr) – 入力画像と同じチャンネル数の累算器.32ビットまたは64ビット浮動小数点型mask (CvArr) – オプションである処理マスク | 
|---|
 
 
この関数は,
image
画像全体,あるいはその選択領域を累算器
sum
に加えます:
 
cv::CalcGlobalOrientation
- 
CalcGlobalOrientation(orientation, mask, mhi, timestamp, duration) → float
- 複数の選択領域の全体的なモーション方向を求めます. - 
| パラメタ: | 
orientation (CvArr) – モーション勾配方向画像.関数  CalcMotionGradient  によって計算されますmask (CvArr) – マスク画像.  CalcMotionGradient  で求められた有効勾配のマスクと,方向を計算する必要がある領域を示すマスクの論理積mhi (CvArr) – モーション履歴画像timestamp (float) – ミリ秒単位,あるいは別の単位で表される現在時間.大きな画像に対して  UpdateMotionHistory  や  CalcMotionGradient  を実行すると時間がかかる可能性があるので,事前に  UpdateMotionHistory  に渡す時間値を保存しておき,ここでそれを再利用する方が良いでしょうduration (float) – ミリ秒単位で表される,モーションの最大持続時間.  UpdateMotionHistory  のものと同じです | 
|---|
 
 
この関数は,選択領域における全体的なモーション方向を求め,0から360度の間の角度を返します.これはまず,方向ヒストグラムを作成し,ヒストグラムが最大値を取る方向を基本方向とします.次に,全方向ベクトル(相対角度)の重み付き和を求め,基本方向からのズレを計算します:最近の動作ベクトルであるほど,より大きな重みを持ちます.結果として得られる角度は,基本方向とこのズレ量の和になります.
 
cv::CalcOpticalFlowBM
- 
CalcOpticalFlowBM(prev, curr, blockSize, shiftSize, max_range, usePrevious, velx, vely) → None
- ブロックマッチング法を用いて,2つの画像に対するオプティカルフローを求めます. 
この関数は,重なり合った
 ピクセルのブロック毎にオプティカルフローを計算します.したがって,速度場のサイズは元の画像よりも小さくなります.この関数は,
prev
の各ブロックに対して,
curr
からそれに似たブロックを探そうとします.その探索範囲は,元のブロックの近傍,あるいは,(
use_previous=1
の場合)前回の関数呼び出しで計算された速度分 (velx(x0,y0),vely(x0,y0)) だけ移動したブロックの近傍です.
ピクセルのブロック毎にオプティカルフローを計算します.したがって,速度場のサイズは元の画像よりも小さくなります.この関数は,
prev
の各ブロックに対して,
curr
からそれに似たブロックを探そうとします.その探索範囲は,元のブロックの近傍,あるいは,(
use_previous=1
の場合)前回の関数呼び出しで計算された速度分 (velx(x0,y0),vely(x0,y0)) だけ移動したブロックの近傍です.
 
cv::CalcOpticalFlowHS
- 
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番目の画像の各ピクセルに対するフローを計算します.
 
cv::CalcOpticalFlowLK
- 
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番目の画像の各ピクセルに対するフローを計算します.
 
cv::CalcOpticalFlowPyrLK
- 
CalcOpticalFlowPyrLK(prev, curr, prevPyr, currPyr, prevFeatures, winSize, level, criteria, flags, guesses = None) -> (currFeatures, status, track_error)
- Lucas-Kanade法を画像ピラミッドを利用して反復実行することにより,疎な特徴集合に対するオプティカルフローを求めます. - 
| パラメタ: | 
prev – 時間  t  における1番目のフレームcurr – 時間  t + dt  における2番目のフレームprevPyr – 1番目のフレームに対する画像ピラミッドのバッファ.このポインタが  NULL  ではない場合,バッファは,レベル  1  から  level  までの画像ピラミッドを格納するのに十分なサイズでなければいけません.合計  (image_width+8)*image_height/3  バイトが十分なサイズといえますcurr_pyr – prevPyr  と同様.こちらは2番目のフレームに対して利用されますprevFeatures – フローを検出するのに必要な(特徴)点の配列currFeatures – 2次元座標点の配列.入力特徴の2番目のフレームにおける新しい位置が求められ,ここに格納されますwinSize – 画像ピラミッドの各レベルにおける探索窓のサイズlevel – 画像ピラミッドの最大レベル数.これが  0  ならば,画像ピラミッドは利用されません(1レベル).  1  ならば,2レベルまでの画像ピラミッドが利用されます.以降同様status – 配列.特徴点のフローが検出できた場合は,それに対応する要素が  1  にセットされ,そうでない場合は  0  にセットされますtrack_error – オプション.移動前の特徴点の周辺領域と,移動後の特徴点の周辺領域との差を含む配列.  NULL  でも構いませんcriteria – 各レベルの画像ピラミッドの各特徴点に対するフローを求める反復計算の停止基準flags – 雑多なフラグ: 
CV_LKFLOWPyr_A_READY 1番目のフレームに対する画像ピラミッドが事前(この関数の呼び出し前)に計算されていますCV_LKFLOWPyr_B_READY 2番目のフレームに対する画像ピラミッドが事前(この関数の呼び出し前)に計算されていますguesses – オプション.2番目のフレームにおける特徴点座標の推定値(初期値)の配列.  prevFeatures  と同じ長さです | 
|---|
 
 
この関数は,Lucas-Kanade法を利用したオプティカルフロー計算を,画像ピラミッドを利用して数回反復するバージョンの実装です
Bouguet00
.以前のビデオフレームの特徴点座標が与えられると,現在のフレームでの座標が計算されます.また,この関数は,サブピクセル精度で座標を検出します.
パラメータ
prevPyr
と
currPyr
は,どちらも以下の規則に従います:画像ポインタが0の場合,この関数は内部にバッファを確保後,画像ピラミッドを計算します.そして,処理が終わるとそのバッファは解放されます.画像ポインタが0ではない場合,画像ピラミッドを計算し,指定のバッファにそれを格納します.ただし,フラグ
CV_LKFLOWPyr_A[B]_READY
が指定されている場合を除きます.また,これらの画像は,ガウシアンピラミッドのデータが入るのに十分な大きさが必要です.関数呼び出し後,両方の画像ピラミッドが計算され,次の関数呼び出しに備えて対応画像の準備完了フラグがセットされます(つまり,通常は,一番最初の関数呼び出し以外は,
CV_LKFLOWPyr_A_READY
が指定されています).
 
cv::CamShift
- 
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
- 
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
によって更新され,関数
ReleaseKalman
によって解放されます.通常,この構造体は標準カルマンフィルタで利用されます(以下の表記法と式は,優れたカルマンフィルタのチュートリアルである
Welch95
から引用しました)
ここで,
 : 時刻
: 時刻
 におけるシステムの状態,
におけるシステムの状態,
 : 時刻
: 時刻
 における観測値,
における観測値,
 : 時刻
: 時刻
 における制御入力,を表します.
における制御入力,を表します.
また,
 と
と
 はそれぞれ,正規分布に従うプロセスノイズ,および観測ノイズです:
はそれぞれ,正規分布に従うプロセスノイズ,および観測ノイズです:
つまり,
 プロセスノイズの共分散行列,定数あるいは変数,
プロセスノイズの共分散行列,定数あるいは変数,
 観測ノイズの共分散行列,定数あるいは変数
観測ノイズの共分散行列,定数あるいは変数
標準カルマンフィルタの場合,全ての行列:A, B, H, Q, R は,
CreateKalman
によって構造体
CvKalman
が確保された後で1度だけ初期化されます.しかし,拡張カルマンフィルタの式を現在のシステム状態周辺において線形化することで,拡張カルマンフィルタをシミュレートするために,同じ構造体と同じ関数が利用されることがあります.この場合,A, B, H (おそらく,Q と R も)毎ステップ更新されます.
 
cv::CreateKalman
- 
CreateKalman(dynam_params, measure_params, control_params=0) → CvKalman
- カルマンフィルタの構造の領域を確保します. - 
| パラメタ: | 
dynam_params (int) – 状態ベクトルの次元数measure_params (int) – 観測ベクトルの次元数control_params (int) – 制御ベクトルの次元数 | 
|---|
 
 
この関数は,構造体
CvKalman
と,そのメンバであるすべての行列の領域を確保し,何らかの方法で初期化します.
 
cv::KalmanCorrect
- 
KalmanCorrect(kalman, measurement) → cvmat
- モデルの状態を更新します. - 
| パラメタ: | 
kalman (CvKalman) – CreateKalman  によって返されるカルマンフィルタオブジェクトmeasurement (CvMat) – 観測ベクトルを含む CvMat | 
|---|
 
 
この関数は,モデル状態に対する観測ベクトルが与えられると,それに基づき確率モデル状態を更新します:
ここで
|  | 与えられた観測 ( mesurement パラメータ) | 
|---|
|  | カルマン「ゲイン」行列 | 
です.
この関数は,更新された状態を
kalman->state_post
に格納し,そのポインタを返します.
 
cv::KalmanPredict
- 
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 (最初は何らかの方法で初期化される,デフォルトでは単位行列), | 
この関数は,状態の推定値を返します.
 
KalmanUpdateByMeasurement
KalmanCorrect
と同義
 
KalmanUpdateByTime
KalmanPredict
と同義
 
cv::MeanShift
- 
MeanShift(prob_image, window, criteria) → comp
- バックプロジェクション上の物体中心を求めます. - 
| パラメタ: | 
prob_image (CvArr) – 物体のヒストグラムのバックプロジェクション(  CalcBackProject  を参照してください)window (CvRect) – 探索窓の初期状態criteria (CvTermCriteria) – 探索の停止基準comp (CvConnectedComp) – 結果として得られる構造体.最終的に収束した探索窓の座標(フィールド  comp->rect  ),および窓内の全ピクセル値の合計(フィールド  comp->area  )を含みます | 
|---|
 
 
この関数は,物体のバック工プロジェクションと探索窓の初期位置が与えられると,その物体の中心を求めるための反復計算を行います.反復計算は,探索窓中心の移動量が与えられた閾値より小さくなるか,あるいは関数の反復数が最大値に達するまで続けられます.また,この関数は,その反復数を返します.
 
cv::MultiplyAcc
- 
MultiplyAcc(image1, image2, acc, mask=NULL) → None
- 2つの画像の積を累積器に加算します. - 
| パラメタ: | 
image1 (CvArr) – 1番目の入力画像.1チャンネルまたは3チャンネル,3ビットまたは32ビット,浮動小数点型(マルチチャンネル画像の各チャンネルは個別に処理されます)image2 (CvArr) – 2番目の入力画像.1番目のものと同じフォーマットacc (CvArr) – 入力画像と同じチャンネル数の累算器.32ビットまたは64ビット浮動小数点型mask (CvArr) – オプションである処理マスク | 
|---|
 
 
関数
cvMultiplyAcc
は,2つの画像の積,あるいはそれらの選択領域の積を累積器
acc
に加えます:
 
cv::RunningAvg
- 
RunningAvg(image, acc, alpha, mask=NULL) → None
- 移動平均値を更新します. - 
| パラメタ: | 
image (CvArr) – 入力画像.1チャンネルまたは3チャンネル,3ビットまたは32ビット,浮動小数点型(マルチチャンネル画像の各チャンネルは個別に処理されます)acc (CvArr) – 入力画像と同じチャンネル数の累算器.32ビットまたは64ビット浮動小数点型alpha (float) – 入力画像に対する重みmask (CvArr) – オプションである処理マスク | 
|---|
 
 
この関数は,
acc
がフレーム列の移動平均になるように,入力画像
image
と累積器
acc
との重み付き和を求めます:
ここで,
 は,更新速度(どのくらいの早さで,以前のフレームを忘れるか)を決めます.
は,更新速度(どのくらいの早さで,以前のフレームを忘れるか)を決めます.
 
cv::SegmentMotion
- 
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
によって全てのモーション成分のモーション方向が計算されます.
 
cv::SnakeImage
- 
SnakeImage(image, points, alpha, beta, gamma, coeff_usage, win, criteria, calc_gradient=1) → None
- そのエネルギーが最小となるように輪郭位置を変更します. - 
| パラメタ: | 
image (IplImage) – 入力画像,あるいは外部エネルギー場points (CvPoints) – 輪郭点 (snake)alpha (sequence of int) – 連続エネルギー荷重.1つの浮動小数点数,あるいは長さ  length  の浮動小数点型の配列.この場合,1つの要素が1つの輪郭点に対応しますbeta (sequence of int) – 曲率エネルギー荷重.  alpha  と同様gamma (sequence of int) – 画像エネルギー荷重.  alpha  と同様coeff_usage (int) – 前述の3つのパラメータの使用法: 
CV_VALUE の場合,  alpha, beta, gamma  の各パラメータは,全ての輪郭点で利用される1つの値へのポインタですCV_ARRAY の場合,  alpha, beta, gamma  の各パラメータは,全ての輪郭点に対しての個別の係数を要素にもつ配列へのポインタです.全ての配列サイズは,輪郭サイズと同じでなければいけませんwin (CvSize) – 最小値探索に用いられる各輪郭点の近傍領域サイズ.  win.width  および  win.height  は奇数でなければいけませんcriteria (CvTermCriteria) – 停止基準calc_gradient (int) – 勾配フラグ.0以外の場合,この関数は,各画像ピクセルに対する勾配の強さを計算し,それをエネルギー場として扱います.そうでない場合,入力画像はそのまま扱われます | 
|---|
 
 
この関数は,内部エネルギーと外部エネルギーの総和が最小になるように輪郭点を更新します.内部エネルギーは,輪郭形状に依存します(滑らかな輪郭ほど,内部エネルギーが小さくなります).また,外部エネルギーはエネルギー場に依存し,画像勾配を用いる場合は,画像エッジのようにエネルギーが極小値をとる場所において最小になります.
パラメータ
criteria.epsilon
は,1回の計算で最低何個の輪郭点が移動すれば反復計算が継続されるか,を規定します.
ある試行において,移動する輪郭点の個数が
criteria.epsilon
よりも少ないか,あるいは,関数の反復計算回数が
criteria.max_iter
に達した場合,この関数は終了します.
 
cv::SquareAcc
- 
SquareAcc(image, sqsum, mask=NULL) → None
- 入力画像の2乗を累算器に加算します. - 
| パラメタ: | 
image (CvArr) – 入力画像.1チャンネルまたは3チャンネル,3ビットまたは32ビット,浮動小数点型(マルチチャンネル画像の各チャンネルは個別に処理されます)sqsum (CvArr) – 入力画像と同じチャンネル数の累算器.32ビットまたは64ビット浮動小数点型mask (CvArr) – オプションである処理マスク | 
|---|
 
 
この関数は,入力画像
image
あるいはその選択領域を2乗し,累積器
sqsum
に加えます:
 
cv::UpdateMotionHistory
- 
UpdateMotionHistory(silhouette, mhi, timestamp, duration) → None
- 動作を表すシルエット画像を用いて,モーション履歴画像を更新します. - 
| パラメタ: | 
silhouette (CvArr) – モーションが発生した場所が 0 以外のピクセル値をもつシルエットマスクmhi (CvArr) – この関数によって更新される,モーション履歴画像(シングルチャンネル,32ビット浮動小数点型)timestamp (float) – ミリ秒単位,あるいは別の単位で表される現在時間duration (float) – timestamp  と同じ単位で表される,モーションの最大持続時間 | 
|---|
 
 
この関数は,モーション履歴画像を以下のように更新します:
つまり,モーションが発生した場所のMHI(モーション履歴画像)ピクセルには,現在のタイムスタンプがセットされ,モーションが発生からある程度以上時間が経ったピクセルの値はクリアされます.