オプティカルフロー — 画素の動きを読み取る
動画の連続フレームの間で、各画素がどこへ動いたか。この「見かけの動きのベクトル場」=オプティカルフローは、動体検出・映像圧縮・自己運動推定の基礎です。フロー場の読み方、推定を根本から悩ませる開口問題、そしてカメラ自身が動くときにフローが語る情報を、動かしながら理解します。
1. フロー場 — 画素の速度の地図
オプティカルフローとは、画像上の各点に「次のフレームまでにどれだけ動くか」の矢印 (u, v) を割り当てたベクトル場です。下のデモでは車が走る場面のフローを矢印の格子で表示しています。動いている車の上にだけ矢印が立ち、静止した背景はゼロ(点)のまま — フローを見るだけで「動くもの」を切り出せることが分かります。
フロー場を見る — 動く車だけに矢印が立つ
薄い残像=1フレーム前(Δt = 0.25s)の車の位置。オレンジの矢印=その画素のフローベクトル(フレーム間の移動量)。速度を上げると矢印が伸び、マイナスにすると向きが反転します。背景の点はフローがゼロの画素です。
POINT — フローは「見かけの動き」
フローが生じる原因は2つある。物体が動くか、カメラが動くか(または両方)。画像だけを見ているかぎり両者は区別できない。この「見かけ」という性質が、後半の自己運動推定につながる。
2. 輝度一定仮説 — フローを数式にする
フローを計算するための出発点は、「同じ物体上の点は、動いても明るさが変わらない」という輝度一定仮説です。点 (x, y) が時間 Δt の間に (u, v) だけ動くとすると I(x+u, y+v, t+Δt) = I(x, y, t)。これをテイラー展開して1次まで取ると、有名な輝度一定拘束式が得られます。
Ix u + Iy v + It = 0
Ix, Iy: 画像の空間勾配(横・縦方向の明るさの傾き) It: フレーム間の明るさの変化 (u, v): 求めたいフロー
注意 — 式1本に未知数2つ
この式は1画素につき1本しか得られないのに、未知数は u と v の2つ。つまり1画素だけ見てもフローは決められない(解が直線状に無数にある)。この不足が、次に見る開口問題として目に見える形で現れる。
3. 開口問題 — 小窓から見ると動きが分からない
エッジ(輪郭線)だけが見える小さな窓を通して動きを観察すると、エッジに沿った方向の動きは全く見えず、エッジに垂直な(法線方向の)成分しか知覚できません。これが開口問題(aperture problem)です。下のデモで、対角に動く四角形を小窓から覗いてみてください。真の動き(オレンジ)と、窓の中から観測できる成分(水色)が食い違います。窓を広げてコーナー(角)が見えた瞬間、動きは一意に決まります。
開口問題 — エッジしか見えないと法線方向の動きしか分からない
四角形は右下対角に動いています。しかし小窓の中に見えるのは縦のエッジだけなので、観測できるのは横方向(エッジの法線方向)の成分だけ。点線がエッジ方向の「見えない成分」です。窓を約100px以上に広げてコーナーを含めると、枠が緑になり真の動きが復元できます。
一歩先へ — Lucas-Kanade 法:窓の中の式を束ねて解く
1画素1本の拘束式では解けないなら、「小さな窓の中ではフローは共通」と仮定して窓内の全画素の式を集め、最小二乗法で解く — これが Lucas-Kanade 法。窓内に2方向以上の勾配(=コーナー)があれば連立方程式は良条件になり一意に解ける。エッジしかなければ方程式は退化して法線成分しか決まらず、テクスチャがなければ何も決まらない。「追跡しやすい点=コーナー」— Harris コーナー検出と同じ結論に、フローの側からたどり着く。
4. カメラが動くときのフロー — 自己運動が生む模様
今度は世界が静止していてカメラだけが動く場合です。このときフロー場には、カメラの運動の種類に応じた特徴的なパターンが現れます。
- 前進:フローは進行方向の1点=拡張焦点(FoE: Focus of Expansion)から放射状に湧き出す。FoEの位置がそのまま「自分がどこへ向かっているか」。
- 横移動:フローは平行になり、近い物体ほど速く流れる(電車の窓の景色=運動視差)。矢印の長さが距離の手がかりになる。
- 回転(首振り):画面全体がほぼ一様に流れ、距離によらない。回転のフローからは奥行き情報が得られない。
自己運動のフロー — 前進・横移動・回転で全く違う模様になる
点=空間中の静止した目印(近い点ほど大きく明るい)。緑の矢印=各点のフロー。前進モードでは赤い十字=FoEが進行方向を指し、「進行方向」スライダーでハンドルを切るとFoEが動きます。横移動では近い点だけが速く流れ、回転では距離に関係なく全点が同じように流れることを確かめてください。
POINT — FoE は自動運転の入口
前進中のフローから FoE を見つければ自分の進行方向が分かり、FoE からの広がる速さで衝突までの時間(TTC)まで推定できる。ハエや鳥はこの原理で障害物を避けて飛ぶし、初期の自動運転研究もフローによる自己運動推定から始まった。
5. まとめ
- オプティカルフロー:フレーム間の画素の見かけの動き (u, v) のベクトル場。動くものがフローとして浮かび上がる。
- 輝度一定拘束式 Ixu + Iyv + It = 0:1画素につき式1本で未知数2つ → 単独では解けない。
- 開口問題:エッジ上では法線方向の成分しか観測できない。Lucas-Kanade は窓内の式を最小二乗で束ねて解決し、コーナーで最も信頼できる。
- 自己運動とフロー:前進=FoEから放射状、横移動=近いほど速い平行流、回転=距離によらない一様流。フローはカメラ自身の運動と世界の奥行きを語る。
一歩先へ — フローの応用と現在地
動画圧縮(H.264/H.265 の動き補償はブロック単位のフロー推定そのもの)、スマホの手ぶれ補正、スポーツ解析の選手追跡、ドローンの位置安定化 — フローは至る所で働いている。推定手法も、Lucas-Kanade などの古典から、フローを直接回帰する深層学習(FlowNet、RAFT)へと進化し、開口問題やテクスチャなし領域も画像全体の文脈から埋められるようになった。