外因性および固有のパラメーターがわかっている場合、2D画像ピクセルから3D座標を取得します
-
27-10-2019 - |
質問
Tsai Algoからカメラのキャリブレーションを行っています。内観的で外的マトリックスを手に入れましたが、どうすれば3D座標を再構築することができますか?
1) Gaussian Eliminationを使用してx、y、z、wを検索することができ、ポイントはX/W、Y/W、Z/Wになります。
2) 使用できますopencvドキュメント アプローチ:
私の知る限り u
, v
, R
, t
、計算できます X,Y,Z
.
ただし、どちらの方法も、正しくない異なる結果になります。
私は何が間違っているのですか?
解決
外因性パラメーターがあれば、すべてが得られます。つまり、The Extinsics(カメラポースとも呼ばれます)からホモグラフィーを持つことができます。ポーズは3x4マトリックスで、ホモグラフィーは3x3マトリックスです。 h 定義されています
H = K*[r1, r2, t], //eqn 8.1, Hartley and Zisserman
と k カメラであるため、本質的なマトリックス、 R1 と R2 回転マトリックスの最初の2つの列であるため、 r; t 翻訳ベクトルです。
次に、すべてを分割することを正規化します T3.
列はどうなりますか R3, 、私たちはそれを使用しませんか?いいえ、ポーズの2つの最初の列のクロスプロダクトであるため、冗長であるためです。
ホモグラフィーがあるので、ポイントを投影します。 2Dポイントはx、yです。それらをaz = 1に追加するので、それらは現在3dになります。次のようにそれらを投影します:
p = [x y 1];
projection = H * p; //project
projnorm = projection / p(z); //normalize
お役に立てれば。
他のヒント
上記のコメントでうまく述べたように、2D画像座標を3D「カメラスペース」に投影するには、この情報が画像で完全に失われるため、Z座標を構成する必要があります。 1つの解決策は、jav_rockが回答したように、投影の前に2D画像スペースポイントのそれぞれにダミー値(z = 1)を割り当てることです。
p = [x y 1];
projection = H * p; //project
projnorm = projection / p(z); //normalize
このダミーソリューションの興味深い選択肢の1つは、モデルをトレーニングして、3Dカメラスペースに再注入する前に各ポイントの深さを予測することです。私はこの方法を試してみましたが、Kittiデータセットからの3DバウンディングボックスでトレーニングされたPytorch CNNを使用して高度に成功しました。喜んでコードを提供しますが、ここに投稿するのは少し長いでしょう。