目次 — 知りたいところから読む
前提と読み方

前提知識 ベクトル・行列とカメラ投影の基礎。

入門 · 原理・構成・判断のための解説です。

特徴点抽出が「画像のどこを目印にするか」を決める処理なら、Feature Tracking(特徴点追跡)は「次のフレームで、その目印がどこへ移ったか」を求める処理である。追跡が安定すればカメラの移動、物体の速度、ロボットの自己位置を推定できる。逆に、対応を一つ取り違えると、その後の姿勢推定や地図が一気に崩れる。本稿では、検出器と記述子の違いを踏まえ、画素の動きを局所最適化する方法と、記述子を照合する方法を一つの設計問題として扱う。

0. 30秒要約

  • 追跡には「前フレームの周辺パッチを次フレームで探す」方式と、「各フレームで検出・記述子を計算して照合する」方式がある。
  • Lucas–Kanade法は輝度一定、局所的な動き、近傍画素の同一速度という仮定で、2×2の正規方程式を解く。ピラミッド化すると大きな移動へ対応できる。
  • 記述子マッチングはフレーム間隔が大きくても再探索できるが、計算量と誤対応が増える。ratio testと相互最近傍、RANSACで幾何的に検証する。
  • 追跡の品質は対応点数だけでなく、画像全体への分布、再投影誤差、前後方向の整合性、遮蔽からの復帰率で評価する。
  • 難しいのは、モーションブラー、低テクスチャ、反射、動的物体、ローリングシャッター、急なスケール変化である。信頼度を出し、検出し直す仕組みが必須になる。

1. 画像上の点はなぜ動いて見えるか

図1 · ボタンで表示を切り替え
前フレームと現フレームの特徴点を矢印で結ぶ追跡図

図1 — 追跡器は特徴点の候補を次フレームへ運び、前後誤差と幾何整合性で誤対応を捨てる。矢印の長さは画素移動量を表す。

3次元点Xがカメラの運動で画像上の\mathbf{x}=(x,y)へ投影される。フレーム間隔を\Delta tとすると、追跡の目的は

\mathbf{x}_{k+1}=\mathbf{x}_k+\mathbf{d}_k

の変位\mathbf{d}_kを求めることだ。カメラが並進すると遠近で速度が変わり、回転すると画像全体が同じ向きへ流れる。前後の画像を単純に差し引くだけでは照明変化や露光ノイズに弱いため、局所パッチの構造を利用する。

2. Lucas–Kanade:小さな窓をまとめて解く

輝度一定の仮定は

I(x,y,t)=I(x+u,y+v,t+\Delta t)

である。変位(u,v)が小さいとして一次近似すると、オプティカルフロー拘束式

I_xu+I_yv+I_t=0

が得られる。1画素では未知数が2つに対して式が1本しかない(アパーチャ問題)。そこで窓W内の画素をまとめ、最小二乗

\begin{bmatrix}u\\v\end{bmatrix} =-\left(\sum_{W}w\begin{bmatrix}I_x^2&I_xI_y\\I_xI_y&I_y^2\end{bmatrix}\right)^{-1} \sum_Ww\begin{bmatrix}I_xI_t\\I_yI_t\end{bmatrix}

を解く。括弧内は特徴点の局所構造行列で、二方向に勾配があるコーナーほど逆行列が安定する。平坦な壁や一本のエッジでは、動きを一意に決められない。

大きな移動へ対応するため、画像を縮小したピラミッドの粗いレベルから細かいレベルへ変位を伝搬する。各レベルで数回反復し、次の位置で再計算する。実装では、ピラミッド段数、窓サイズ、終了条件、最小固有値、前後追跡誤差を調整する。

3. 記述子マッチングとの使い分け

ORBやSIFTのような記述子は、周辺パッチをベクトルまたはビット列に変換し、距離の近い候補を対応とする。連続フレームの小さな移動ならLucas–Kanadeが高速だが、遮蔽から復帰したり、フレームを飛ばしたり、カメラが大きく動いたりすると記述子再照合が有効になる。

方法 入力 長所 弱点 典型用途
LK追跡 前フレームの点と次フレーム画像 高速、サブピクセル精度 大変位・遮蔽・低テクスチャに弱い VO、リアルタイム追跡
ORB照合 2枚の記述子 軽量、回転に対応 反射・ブラーで誤対応 SLAM初期化・再探索
SIFT照合 2枚の記述子 尺度・回転に頑健 計算量、メモリ SfM、画像検索
学習ベース 点・記述子・マッチャ 大きな見た目変化に強い可能性 学習データ外、GPU負荷 難環境・研究

記述子距離の最小候補だけを採ると、似た模様の誤対応が混ざる。最近傍距離d_1と2番目d_2に対してd_1/d_2\lt\tau(ratio test)を要求し、さらに画像A→BとB→Aの相互最近傍を確認する。最後に、対応点から推定した基礎行列・ホモグラフィ・PnPの再投影誤差をRANSACで検証する。

4. 追跡の信頼度を数値化する

実装で「追跡できた」と判定するには、点が返ったかでは不十分である。次の量をログへ保存すると、破綻の原因を切り分けやすい。

  • LKの最小固有値と残差
  • 前向き追跡と逆向き追跡の差(forward-backward error)
  • 記述子ratioと距離の分布
  • RANSACのインライア率と再投影誤差
  • 画像上の点の分布(中央だけに偏っていないか)
  • フレーム間の平均変位、ブラー指標、露光・ゲイン

RANSACのインライア率が高くても、全点が画像の一角に集中していれば姿勢推定は縮退する。グリッドごとに最大点数を制限し、視野全体へ特徴点を分散させると、回転・並進の観測性が改善する。点数を増やすより、異なる方向・距離に分散した少数の対応を残す方がよい場合もある。

5. 動く物体とローリングシャッター

Visual Odometryでは、静止環境を仮定してカメラ運動を推定する。歩行者、車、回転ファンが多数写ると、それらの対応はカメラ運動モデルに一致しない外れ値になる。RANSACだけで除けないほど動的物体が多い場合は、セマンティックマスク、オプティカルフローのクラスタリング、背景モデル、深度整合性を併用する。

CMOSカメラのローリングシャッターは、画像の上から下を少しずつ異なる時刻に露光する。高速回転や振動では、同じフレーム内でも行ごとにカメラ姿勢が変わり、単一の投影モデルが破れる。IMUの角速度を使った行時刻補正、グローバルシャッター、短い露光、読み出し時間の校正が対策になる。

6. 最小実装の流れ

  1. カメラを内部パラメータ、歪み、タイムスタンプとともに校正する。
  2. 初期フレームでFAST/ORBまたはShi–Tomasiを検出し、グリッドで均等化する。
  3. 次フレームを受けたらピラミッドLKで追跡し、前後誤差と画像境界を検査する。
  4. 信頼度の低い点を捨て、足りないグリッドへ新しい点を検出する。
  5. 必要な間隔で記述子照合を行い、RANSACで外れ値を除く。
  6. 残った対応をEssential Matrix、PnP、またはIMU融合へ渡す。
  7. 点が連続して失われたら再初期化し、追跡状態と原因をログへ残す。

追跡を再開するときの判断

一時的な遮蔽や露光変化で点が減ったとき、直前の位置を無理に延長すると誤対応を固定してしまう。まずフレーム番号、タイムスタンプ、画像境界、前後方向誤差を確認し、許容値を超えた点は候補から外す。残った点が画面の一部に偏っている場合は、点数が足りていてもカメラ姿勢の推定を続けない。グリッドごとに再検出し、静的背景と動的物体を分離してから、必要なら幾何モデルを再推定する。この手順を「追跡中」と「再初期化中」の状態機械として記録すると、データ欠損とアルゴリズムの誤対応を区別できる。

実装では、各対応にフレーム番号と観測時刻を持たせ、画像処理の遅延で古い点が新しいフレームへ混ざらないようにする。カメラが急に動いた場合は、ピラミッドの最上位でも変位が窓幅を超えていないかを確認する。超えた場合に窓を広げ続けると別の模様へ収束する危険があるため、記述子による再探索へ切り替える。再探索で得た候補も、エピポーラ拘束やホモグラフィーの残差、前後フレームの整合性を通過させる。動く物体を追跡対象にする場合は、カメラ運動の推定用点と物体追跡用点を別の集合として管理し、一方の外れ値除去結果を他方へ流用しない。これらの境界条件をログと再生データで試験すれば、照明変化、遮蔽、通信遅延が重なったときの復帰動作も検証できる。

評価では、平均追跡点数だけでなく、正しい対応率、画面内の分布、追跡が途切れてから再び安定するまでの時間を分けて記録する。点数が多くても同じ壁の模様だけに集中していれば、並進の深さ情報が弱くなり、姿勢推定が突然不安定になる。反対に点数が少なくても、視野の四隅と異なる距離に対応が残っていれば、モデルを保てる場合がある。テスト用の動画には低テクスチャ、周期模様、逆光、急旋回、振動、遮蔽、移動物体を個別に含め、どの失敗条件で再検出へ遷移したかを記録する。閾値はカメラ解像度、レンズ、フレームレート、用途によって変わるため、別の装置へそのままコピーせず、再生データと実機ログの両方で決める。

さらに、対応点の品質を一つのスコアへ早期に潰し込まない。最小固有値は局所テクスチャの強さ、残差は輝度モデルとの不一致、往復誤差は追跡の可逆性、RANSACのインライア率は選んだ幾何モデルとの整合性を表すので、それぞれを別々に保存する。たとえばインライア率が高くても、点が一列に並んでいれば三角測量や姿勢推定が縮退する可能性がある。反対に残差が少し増えても、広い範囲に分散した対応が残っていれば、再検出まで短時間だけ推定を継続できることがある。どの値を採用するかは用途の停止距離や制御周期と合わせて決め、固定の経験則として扱わない。失敗時には最後に信頼できたフレーム、破棄した対応の理由、再初期化の開始と完了、推定器へ渡した点数を記録する。こうしたログは、アルゴリズムを変更したときに追跡率だけでなく、誤対応の危険と復帰時間が改善したかを比較する基準になる。

実務では、追跡器の出力をそのまま制御器や地図更新へ流さず、利用目的ごとに受け入れ条件を定義する。画像の一部が隠れたときに物体の短期追跡だけを続けるのか、カメラの自己位置推定を停止するのか、同じ「点が残っている」という観測でも判断は異なる。自己位置推定では、対応点の深度や視差が不足していないか、推定した姿勢の共分散が急増していないかを確認し、条件を満たさなければ速度制御へ不確かさを伝える。物体追跡では、対象の輪郭やクラス判定と合わせて、遮蔽から復帰した候補が本当に同じ対象かを再確認する。フレームをまたいだIDを無条件に維持すると、似た模様や別の物体へ切り替わった後も誤った速度を出力するためである。評価データを作る際は、正解の対応だけでなく、遮蔽区間、対象の出入り、露光変更、フレーム欠落、時刻のずれを注釈に含める。これにより、点の検出数を増やした結果として誤対応や遅延が増えていないかを、同じ条件で比較できる。

追跡結果を採用する境界は、画像処理だけでなく後段の時間要求にも合わせる。処理が遅れて到着したフレームを最新状態として扱うと、見かけ上の速度や姿勢が過去へ戻るため、入力時刻と処理完了時刻を分け、許容遅延を超えた観測を破棄する。複数カメラやIMUを組み合わせる場合も、単にメッセージを到着順に並べず、共通の時計と外部パラメータの版を記録する。校正を更新した後に古い変換を使えば、点そのものが正しくても幾何検証で誤差が増える。再初期化を頻繁に繰り返す場合は、検出器の閾値だけを変更せず、レンズ歪み、露光、焦点、同期、対象の動き、計算負荷を順に切り分ける。現場で再現しにくい故障ほど、入力画像、候補点、採用理由、破棄理由、モデル残差を一定期間保存すると原因を追いやすい。プライバシーや保存容量の制約がある場合は、画像を永久保存せず、匿名化した特徴量と統計量、失敗した短い区間だけを管理する設計も検討する。

本番導入前には、追跡の成否を画面上のデバッグ表示だけで決めず、再生可能なログで判定する。入力フレームの時刻、検出点の座標、LKの残差、最小固有値、往復誤差、記述子距離、RANSACのモデルとインライア、点の画面分布、推定器へ渡した時刻を同じ記録単位にまとめる。異常が出たときは、その直前に露光やゲイン、フレーム間隔、CPU負荷、通信遅延が変わっていないかを確認する。画像の見た目が似ていても、カメラ時刻がずれていれば正しい対応を得られない。実験条件を固定した比較では、検出点数を増やした場合と窓サイズを変えた場合を別の実験として扱い、再初期化回数、誤対応率、姿勢のドリフト、処理時間を同じ表に記録する。これにより、平均値だけでは見えない一時的な破綻や、復帰が遅れて安全余裕を消費する条件を把握できる。閾値を変更する場合も、精度が上がったという印象だけで採用せず、代表的な失敗動画と未知の検証動画の双方で改善が再現することを確かめる。

7. まとめ

特徴点追跡は、検出器・局所最適化・記述子照合・幾何検証を一つの信頼度設計として扱う技術である。LKは連続フレームを滑らかにつなぎ、記述子は大きな変化から復帰し、RANSACは誤対応を幾何でふるいにかける。どれか一つへ依存せず、点の分布、時間同期、動的物体、ローリングシャッターを含むログを残すと、Visual-SLAMやVIOの再現性が大きく向上する。

理解を確かめる
前の画像から追跡できた点は必ず正しい対応?

似た模様へ飛ぶことがある。往復追跡、残差、幾何拘束で確認し、追跡点数だけを成功指標にしない。

参考資料

オプティカルフロー Labで2フレーム間の特徴点の移動を追跡する。

現在の項目 · 6 / 19 · コンピュータビジョン入門

次に読む

前提を確認する特徴点マッチング Lab — 記述子・幾何内点・真値を分けて比較するシリーズの次の内容へ進むオプティカルフロー Lab:2フレーム間の動きを追跡する同じ分野を別の観点から読む画像の明るさ・輝度 Lab — 露出、ガンマ、クリッピングを比較