外因性および固有のパラメーターがわかっている場合、2D画像ピクセルから3D座標を取得します

StackOverflow https://stackoverflow.com/questions/7836134

質問

Tsai Algoからカメラのキャリブレーションを行っています。内観的で外的マトリックスを手に入れましたが、どうすれば3D座標を再構築することができますか?

enter image description here

1) Gaussian Eliminationを使用してx、y、z、wを検索することができ、ポイントはX/W、Y/W、Z/Wになります。

2) 使用できますopencvドキュメント アプローチ:

enter image description here

私の知る限り u, v, R , t 、計算できます X,Y,Z.

ただし、どちらの方法も、正しくない異なる結果になります。

私は何が間違っているのですか?

役に立ちましたか?

解決

外因性パラメーターがあれば、すべてが得られます。つまり、The Extinsics(カメラポースとも呼ばれます)からホモグラフィーを持つことができます。ポーズは3x4マトリックスで、ホモグラフィーは3x3マトリックスです。 h 定義されています

                   H = K*[r1, r2, t],       //eqn 8.1, Hartley and Zisserman

k カメラであるため、本質的なマトリックス、 R1R2 回転マトリックスの最初の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を使用して高度に成功しました。喜んでコードを提供しますが、ここに投稿するのは少し長いでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top