2枚の画像に写った「同じ平面」——机の天板、ポスター、道路面——の対応点は、一般の3次元シーンよりずっと単純な関係で結ばれる。カメラがどこにあっても、その平面上の点同士は1枚の 3\times3 行列だけで変換できる。この行列がホモグラフィ(homography、射影変換)である。エピポーラ幾何入門がシーンの奥行きを前提にした対応拘束を扱うのに対し、ホモグラフィは奥行きに依存しない対応を扱う点が対照的であり、両者を使い分けられて初めて2視点幾何の全体像がつかめる。

0. 30秒要約

1. ホモグラフィとは何か:平面射影変換

2枚の画像上の同次座標 \tilde{\mathbf{x}}=(x,y,1)^\mathsf{T}\tilde{\mathbf{x}}'=(x',y',1)^\mathsf{T} の間に、ある 3\times3 行列 H を使って

\tilde{\mathbf{x}}' \sim H\tilde{\mathbf{x}}

という関係が成り立つとき、H をホモグラフィと呼ぶ。\sim はスケールを除いて等しいという意味で、H を任意の非ゼロ定数倍しても同じ変換を表すため、H の自由度は 9-1=8 である。

同一平面をとらえる2視点とホモグラフィH 世界の1枚の平面πを、カメラ1とカメラ2がそれぞれ異なる位置から撮影し、両画像上の対応点がホモグラフィHで直接結びつく様子を示す図。 平面 π(法線 n、距離 d) C1 C2 x 画像1 x′ 画像2 x′ ∼ H x

物理的にホモグラフィが成立する条件は大きく2つある。第一に、対応するすべての3D点が1枚の平面上にあること。第二に、シーンが一般の3次元構造でも、カメラが並進せず純粋に回転(パン・チルト)するだけなら、奥行きに関係なくホモグラフィで説明できる。これはカメラが回転しかしない場合、視差そのものが発生しないためである。

2. DLT法による推定

対応 (x,y)\to(x',y') 一組から、H の各要素 h_1,\dots,h_9\mathbf{h}=\operatorname{vec}(H))に関する線形制約を導く。\tilde{\mathbf{x}}'\times H\tilde{\mathbf{x}}=\mathbf{0} という外積がゼロになる条件を展開すると、対応1組につき次の2本の独立な方程式が得られる。

\begin{bmatrix} -x & -y & -1 & 0 & 0 & 0 & x'x & x'y & x' \\ 0 & 0 & 0 & -x & -y & -1 & y'x & y'y & y' \end{bmatrix}\mathbf{h}=\mathbf{0}

4組の対応があれば8本の式ができ、自由度8の H を(一般位置なら)一意に決められる。5組以上ある現実的な場合は、全対応を積んだ行列 A に対して A\mathbf{h}=\mathbf{0} の最小二乗解、すなわち A の最小特異値に対応する右特異ベクトルをSVDで求める。これがDLT(Direct Linear Transform)法である。

エピポーラ幾何の8点法と同様に、画素座標をそのまま使うと数値的に悪条件になりやすい。各画像の点群を重心ゼロ・平均距離 \sqrt{2} に正規化する相似変換 T,T' を適用してから解き、H=T'^{-1}H_{\text{norm}}T で座標を戻すHartleyの正規化DLTが標準的な実装である。

3. RANSACによるロバスト推定

実際の対応点にはミスマッチが混ざるため、DLTをそのまま全対応へ適用すると外れ値が解を大きく歪める。RANSACは次を繰り返す。

  1. 4組の対応を無作為に選び、DLTで H の仮説を作る。
  2. 全対応について、H による予測位置と実際の対応点との再投影誤差を計算する。
  3. 閾値以内の対応(インライア)が最も多い仮説を採用する。
  4. 最終的なインライア全部で再度DLTを解き、必要なら非線形最適化(再投影誤差の直接最小化)で仕上げる。

必要な反復回数は、インライア率 w、最小サンプル数 s=4、目標成功確率 p に対し

N=\frac{\log(1-p)}{\log\!\left(1-w^{s}\right)}

で見積もれる。同じインライア率でも s=4 のホモグラフィは、s=58 を要するEssential/Fundamental Matrix推定より少ない反復で済む。これはSIFTやORBのマッチング直後に、まず粗くホモグラフィで幾何検証してから本格的な3次元推定に進む、という実装がよく見られる理由の一つである。

4. Hの分解:回転・並進・平面法線を取り出す

カメラが校正済みで内部パラメータ K_1,K_2 が既知なら、正規化ホモグラフィ \tilde H = K_2^{-1}HK_1 は、平面の単位法線 \mathbf{n}(カメラ1座標系)、平面までの距離 d、相対姿勢 R,\mathbf{t} を用いて

\tilde H = R+\frac{\mathbf{t}\,\mathbf{n}^\mathsf{T}}{d}

という形に書ける。カメラが純回転で並進がなければ \mathbf{t}=\mathbf{0} となり \tilde H=R、すなわち回転行列そのものになる。

\tilde H から R,\mathbf{t}/d,\mathbf{n} を復元する処理をホモグラフィ分解と呼ぶ。Faugeras–Lustmanの古典的な手法やMalis–Vargasの解析的な手法など複数のアルゴリズムが知られており、\tilde H^\mathsf{T}\tilde H の固有値分解を利用して閉形式の解を得る。ただし数式だけからは、物理的にあり得る解が最大4通り残る(符号反転や鏡映に対応する解を含む)。実務では次の情報で絞り込む。

OpenCVのdecomposeHomographyMatは、この分解を行い、複数候補とその評価に使えるフィルタ関数(既知の平面法線に近い解を選ぶfilterHomographyDecompByVisibleRefpointsなど)を提供している。

5. エピポーラ幾何との関係:いつHが正解になるか

エピポーラ幾何入門で見たように、一般の3次元シーンでの2視点対応はFundamental/Essential Matrixで説明される。ホモグラフィはその特殊ケースであり、次の表のように使い分ける。

状況 適したモデル 理由
一般の3D構造、並進あり F(未校正)/E(校正済み) 視差が奥行きに依存し、1枚の平面に押し込めない
シーン全体、または着目領域が1平面 H 平面上の点はホモグラフィで厳密に説明できる
カメラが純回転(パン・チルトのみ) H 並進がなく視差が生じないためF/Eは退化する
遠景を見ている、または視差が極小 H(実務上の近似) 奥行きの違いによる視差が画素ノイズに埋もれる

問題は、「Hのインライアが多い」ことと「本当にシーンが平面・純回転である」ことが、観測だけからは区別しにくい場合があることだ。一般の3次元シーンでも、視野の大部分を占める壁や机がホモグラフィに強く適合してしまうことがある。ORB-SLAMの初期化処理は、この曖昧さに対してHFの両方をRANSACで並行に推定し、それぞれの適合度をスコア化して、シーンの構造とカメラ運動に応じたモデルを自動選択する設計を採っている。単純にインライア数だけで比較するのではなく、モデルの自由度差を考慮したスコア(GRICに類する考え方)を使う点が実装上の要点である。

6. 応用:画像スティッチング・AR平面追跡・地面平面推定

画像スティッチング(パノラマ合成)は、カメラをその場で回転させて撮った複数枚の画像を1枚に貼り合わせる処理で、ホモグラフィの代表的な応用である。隣接画像間のホモグラフィを推定し、共通の基準フレームへワープしてブレンドする。カメラが純回転に近いという前提が崩れる(歩きながら撮る、近距離の被写体がある)と、視差によるゴースト・二重像が生じる。

ARにおける平面アンカー追跡では、机やポスターのような平面を初期フレームで検出し、以降のフレームとの間のホモグラフィを追跡することで、平面に対する相対姿勢を毎フレーム安定して求められる。分解して得た R,\mathbf{t}/d を使えば、平面座標系に固定した仮想オブジェクトを違和感なく重畳できる。

地面平面推定は、路面や床面という「ほぼ平面」であるという強い事前知識を利用する。車載カメラやロボットの床面検出では、連続フレーム間のホモグラフィを追跡し、そこから外れる領域(障害物、路面以外の物体)を検出する手法が使われる。これは物体そのものを認識するのではなく、幾何学的な整合性の破れを検出するアプローチである。

7. OpenCVでの実装例

import cv2 as cv
import numpy as np

orb = cv.ORB_create(nfeatures=3000)
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
matches = cv.BFMatcher(cv.NORM_HAMMING).knnMatch(des1, des2, k=2)
good = [m for m, n in matches if m.distance < 0.75 * n.distance]

p1 = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
p2 = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)

# threshold は画素単位の再投影誤差許容量。RANSACの代わりにUSAC_MAGSACも選べる。
H, mask = cv.findHomography(p1, p2, method=cv.RANSAC, ransacReprojThreshold=3.0)
inliers = mask.ravel().astype(bool)

# K が既知なら候補解を分解する
num_solutions, Rs, ts, ns = cv.decomposeHomographyMat(H, K)

findHomographyが返すHはスケール不定であることに注意する。分解して得られる並進ベクトルも、エピポーラ幾何のEssential Matrixと同様に方向のみが定まり、絶対スケールは別の手段(既知の平面距離、ステレオ基線、慣性センサなど)で与える必要がある。

8. 苦手な条件

9. まとめ

ホモグラフィは、平面上の対応、あるいはカメラの純回転という2つの限定的だが実務上頻出する状況を、たった1枚の 3\times3 行列で正確に表現する枠組みである。DLT法は最小二乗の出発点、RANSACは外れ値対策、分解は物理的な回転・並進・法線を取り出す最終段である。何より重要なのは、いつホモグラフィが正しいモデルで、いつFundamental/Essential Matrixに切り替えるべきかという判断であり、この境界を誤ると、平面しかないシーンから存在しない奥行きを復元しようとして破綻する。

参考資料

#Homography #ホモグラフィ #DLT #RANSAC #画像スティッチング #AR #Computer Vision