6

私は、将来、完全な「最適なアルゴリズム」を実装することを目的として、Hartley&Zissermanの「MultipleView Geometry」(12.2秒)から(比較的単純な)線形同次(DLT)3D三角測量法を実装しようとしています。現在、この質問に基づいて、Matlabで動作させようとしています。後で、C ++とOpenCVに移植して、適合性をテストします。

問題は、自分が持っているデータの使い方がわからないことです。ステレオリグを調整し、2つの固有のカメラ行列、歪み係数の2つのベクトル、2つのカメラに関連する回転行列と平行移動ベクトル、および基本行列と基本行列を取得しました。また、2つの画像の座標系(それぞれ1番目と2番目のカメラで撮影)の単一の3Dポイントの対応であると想定される2つのポイントの2D座標もあります。

このアルゴリズムは、2つの点座標と2つの4x3「カメラ行列」PおよびP'を入力として受け取ります。これらは明らかに、キャリブレーションから得られた固有のカメラ行列(M、M')ではありません。1つは3x3であり、それらを単独で使用した投影では3Dポイントが2つの異なる座標系に配置されるためです。回転/平行移動)データがありません。

H&Zブックには、SVD分解を使用して基本行列または必須行列のいずれかから必要な行列を復元するための情報(第9章)が含まれていますが、それ自体に追加の問題(スケールのあいまいさなど)があります。回転と平行移動が明示的に定義されているので、それは必要ないと思います。

問題は次のとおりです。最初の「カメラ行列」(P = [M | 0])としてゼロの余分な列を持つ最初の固有行列を使用し、次に2番目の固有行列に外部行列を乗算するのは正しいでしょうか。 2番目に必要な「カメラ行列」(P'= M'* [R | t])を取得するための追加の列として、回転行列と変換ベクトルから構成されますか?それとも別の方法で行う必要がありますか?

ありがとう!

4

1 に答える 1

11

私は自分のH&Zを手に入れることができませんが、このテーマに関する彼らの古いCVPRチュートリアルはここにあります(他の人がこの質問を見ることができるように)。

わかりやすくするために(そしてそれらの用語を使用するために)、射影行列Pはユークリッド3空間点(X)から画像点(x)に次のようにマッピングされます。

x = PX

どこ:

P = K[ R | t ]

(3x3)カメラキャリブレーション行列Kと(3x3)回転行列Rおよび並進ベクトル(3x1)tによって定義されます。

問題の核心は、2台のカメラPP'を使用して三角測量を実行する方法にあるようです。

あなたは世界の原点が最初のカメラPにあることを提案していると思います。つまり、次のようになります。

P = K [ I | 0]

P' = K' [ R | t ]

次に、次のような基本マトリックスFでの再構築を求めます。

x' F x = 0

行列Fはもちろん、さまざまな方法で計算できます(場合によっては、キャリブレーションされていない画像から計算することもあります)が、ここでは、上記のキャリブレーション済みのカメラマトリックスに基づいて次のように計算することをお勧めします。

F = [P' C]_x P' pinv(P)

ここC = (0 1)で、は最初のカメラの中心であり、はPpinv(P)の疑似逆行列です。は、ベクトル積を計算するための行列乗算の文献で使用されている表記法を示します。_x

次に、基本行列Fの因数分解を実行できます(SVDまたは直接法を介して実行されます)。

F = [t]_x M

したがって、正しく述べると、以下に基づいて三角測量を直接計算できます。

P = [ I | 0 ] 

P' = [ M | t ]

これらを使用して三角測量を実行することは、比較的簡単なはずです(適切なキャリブレーション、ノイズの欠如などを想定)。

于 2012-05-09T15:28:49.793 に答える