平面シーンの写真を撮るキャリブレーション済みのカメラが多数あります。簡単にするために、カメラが 3 台あるとします。これらのカメラは一般的な動きをしていますが、ほとんどが平行移動と若干の回転です。カメラの位置例
タスクは、それらを完全にステッチすることです。キャリブレーションされたカメラで撮影された一連の画像だけで、3D 座標についての知識はありません。
私がやること:
OpenCV で SURF/SIFT 実装を使用して特徴を検出し、各画像ペア (1->2、2->3、1->3) 間でfindHomographyを使用して初期ホモグラフィを取得します。これらのホモグラフィから、各カメラのポーズの初期推定を取得します(これと同様の手順)
次に、バンドル調整手法を使用して、一致する各ペアの再投影エラーを最小限に抑えます。最適化されたパラメーターは、3 つの並進値と 3 つの回転値 (ロドリゲスの回転式から取得) ですが、後で固有パラメーター (焦点、主点など) を追加できます。
画像 #2 が参照フレームであると仮定すると (他の 2 つの画像との一致が最も多いため)、その回転行列と平行移動行列はそれぞれ恒等行列とゼロ行列です。
イメージ #2 からイメージ #1 へのキーポイント (イメージ #2 とイメージ #1 の両方で表示) の再投影を (疑似コード) として計算します。
[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;
x1 = x1_/z1_;
y1 = y1_/z1_;
また
x1 = ((f1/f2)*r11*x2 + (f1/f2)*r12*y2 + f1*r13 + f1*tx/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + tx/Z2)
y1 = ((f1/f2)*r21*x2 + (f1/f2)*r22*y2 + f1*r23 + f1*ty/Z2) / ((1/f2)*r31*x2 + (1/f2)*r32*y2 + r33 + ty/Z2)
ここで、r__ は R1 行列の要素であり、両方の組み込み行列は次の形式です。
[f 0 0]
[0 f 0]
[0 0 1]
参照フレームの Z2 座標を 1 と仮定しています。
次の段階では、取得したカメラ行列 (K1、R1、T1、K3、R3、T3) を使用して、画像 #1 と #3 を画像 #2 の共通の座標系にワープします。
問題は、画像 #1->#2 からの逆再投影が次のようになるため、画像 #2 の参照フレームへの正しい再投影に必要な Z1 と Z3 についての知識がないことです。
x2 = ((f2/f1)*R11*x1 + (f2/f1)*R12*y1 + f2*R13 - f0/Z1*(R11*tx + R12*ty + R13*tz)) / ((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))
y2 = ((f2/f1)*R21*x1 + (f2/f1)*R22*y1 + f2*R23 - f0/Z1*(R21*tx + R22*ty + R23*tz)) / ((1/f1)*R31*x1 + (1/f1)*R32*y1 + R33 - 1/Z1*(R31*tx + R32*ty + R33*tz))
ここで、R__ は inv(R1) 行列の要素です。
バンドル調整 (2d->2d) の再投影誤差を計算し、画像を共通の座標系にワープするより良い方法はありますか? OpenCV のステッチング モジュールには非常によく似たフレームワークがあることに気付きましたが、ここではそうではなく、純粋な回転運動を想定して動作します。