9

平面シーンの写真を撮るキャリブレーション済みのカメラが多数あります。簡単にするために、カメラが 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 のステッチング モジュールには非常によく似たフレームワークがあることに気付きましたが、ここではそうではなく、純粋な回転運動を想定して動作します。

4

2 に答える 2

1

私は自分の投稿でその質問に自動回答しました外部パラメーターからステレオ画像のポイントを取得する方法

私が使用する方法 (テスト済みで機能しています!) は、3D 座標 (実世界!) のオブジェクトが平面であり、Z=0 (カメラの外部パラメーターを調整したポイント) にある場合にのみ有効であることに注意してください。その場合、この方法はキャリブレーションと同じくらい正確です。注: 最高のキャリブレーション チェック openCVs サークル キャリブレーションでは、0.018 ピクセルの再現誤差があります (私の大学で働いている博士課程の学生によってテストされています)。

于 2013-04-09T14:10:03.053 に答える
1

おそらく、拒否エラーに関するバグを発見したことでしょう。これは、次の行と関係があります。

[x1_; y1_; z1_] = K1*R1*inv(K2)*[x2; y2; 1] + K1*T1/Z2;

ポイント[x2; y2; 1] は、スケール定数 C*[x2; まではあいまいです。y2; 1] そしてここでは、一般的に不明な場合に C=1 を設定しています。可能性の軌跡は、最初のビューでエピポーラ線として現れます。最小二乗三角形分割を使用して、この線に沿って 3D ポイントが存在する可能性が最も高いポイントを見つけ、再投影されたポイントを次のように計算できます。

[x1_; y1_; z1_] = K1*(R1*X + T1);

そこから上記のように進みます。ポイント クラウド内のそのような各ポイント X の 3D 座標は、対応する正規化された座標 (x1,y1)、(x2,y2)、...、および対応する回転行列と平行移動ベクトルを使用して、それらをフォーマットすることで計算できます。マトリックス問題に:

A X = b

次に、最小二乗法を解きます。

min |A X - b|_2

これは、こちらの 3 ページと 4 ページに示されています。

于 2013-07-17T00:21:41.453 に答える