web-dev-qa-db-ja.com

外部パラメータと組み込みパラメータがわかっている場合は、2D画像ピクセルから3D座標を取得します

私はツァイアルゴからカメラのキャリブレーションを行っています。内的および外的行列を取得しましたが、その情報から3D座標を再構築するにはどうすればよいですか?

enter image description here

1)X、Y、Z、Wを見つけるためにガウスの消去法を使用でき、ポイントはX/W、Y/W、Z/Wになります均一系として。

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

enter image description here

私が知っているようにuvRt、計算できますX,Y,Z

ただし、どちらの方法でも結果が異なり、正しくありません。

何が悪いのですか?

34
YAHOOOOO

外部パラメーターを取得した場合は、すべてを取得できます。つまり、外部からのホモグラフィ(CameraPoseとも呼ばれます)を使用できます。ポーズは3x4マトリックス、ホモグラフィは3x3マトリックス、[〜#〜] h [〜#〜]として定義

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

[〜#〜] k [〜#〜]はカメラの組み込み行列、r1およびr2は回転の最初の2列です行列、[〜#〜] r [〜#〜]; tは並進ベクトルです。

次に、すべてをtで除算して正規化します。

rはどうなりますか?いいえ、それはポーズの最初の2列の外積であるため冗長です。

ホモグラフィを取得したので、ポイントを投影します。あなたの2Dポイントはx、yです。それらにz = 1を追加すると、3dになります。次のように投影します。

        p          = [x y 1];
        projection = H * p;                   //project
        projnorm   = projection / p(z);      //normalize

お役に立てれば。

29
Jav_Rock

上記のコメントで説明したように、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を使用して高度な成功を収めました。コードを提供していただければ幸いですが、ここに投稿するには少し時間がかかります。

1
DerekG