一般的なケースでは、深度情報が3Dから2Dに移行すると失われるため、この変換を行うことは不可能であることを私は知っています。
しかし、私は固定カメラを持っていて、そのカメラマトリックスを知っています。 既知の寸法の平面キャリブレーションパターンもあります-世界座標でコーナー(0,0,0)(2,0,0)(2,1,0)(0 、1,0)。 opencvを使用して、パターンのポーズを推定し、オブジェクト上の点を画像内のピクセルに投影するために必要な平行移動行列と回転行列を与えることができます。
さて、この3Dから画像への投影は簡単ですが、他の方法はどうですか?画像内でキャリブレーションパターンの一部であることがわかっているのピクセルを選択した場合、対応する3Dポイントを取得するにはどうすればよいですか?
キャリブレーションパターンでランダムな3Dポイントを繰り返し選択し、2Dに投影し、エラーに基づいて3Dポイントを調整することができます。しかし、これはかなり恐ろしいようです。
この未知の点が(x、y、0)のような世界座標を持っていることを考えると(z = 0平面上にある必要があるため)、反復的なナンセンスを行う代わりに、適用できる変換があるはずです。 。私の数学はあまり良くありませんが、誰かがこの変換を実行して、それをどのように導き出すかを説明できますか?
はい、できます。 3Dワールド内のポイントを画像平面にマップする変換行列がある場合は、この変換行列の逆行列を使用して、画像平面ポイントを3Dワールドポイントにマップできます。 3Dワールドポイントのz = 0がすでにわかっている場合、これはポイントの1つの解になります。ランダムな3Dポイントを繰り返し選択する必要はありません。既知の位置とカメラキャリブレーションマトリックスを備えた車両にカメラを取り付けた場合にも、同様の問題が発生しました。カメラの画像位置にキャプチャされたレーンマーキングの実際の位置を知る必要がありました。
これが誰かを助けることができると私が願っている閉じた形の解決策です。上記のコメントの image の規則を使用すると、中心に正規化されたピクセル座標(通常は歪み補正後)uとv、および次のような外部キャリブレーションデータを使用できます。
|Tx| |r11 r21 r31| |-t1|
|Ty| = |r12 r22 r32|.|-t2|
|Tz| |r13 r23 r33| |-t3|
|dx| |r11 r21 r31| |u|
|dy| = |r12 r22 r32|.|v|
|dz| |r13 r23 r33| |1|
これらの中間値を使用すると、必要な座標は次のようになります。
X = (-Tz/dz)*dx + Tx
Y = (-Tz/dz)*dy + Ty
説明:
ベクトル[t1、t2、t3]t カメラの光学中心に対する世界座標系の原点(キャリブレーションパターンの(0,0))の位置です。符号を反転し、回転変換を反転することにより、ベクトルを取得します T = [Tx、Ty、Tz]t、これは、ワールド参照フレーム内のカメラの中心の位置です。
同様に、[u、v、1]t は、カメラ参照フレーム(カメラの中心から開始)内の観測点が存在するベクトルです。回転変換を逆にすることにより、ベクトルを取得します d = [dx、dy、dz]t、これはワールドリファレンスフレームで同じ方向を表します。
回転変換を逆にするために、回転行列の逆行列がその転置であるという事実を利用します( link )。
これで、方向ベクトルのある線ができました d ポイントから開始 T、この線と平面Z = 0との交点は、2番目の方程式のセットで与えられます。 X = 0またはY = 0平面、またはそれらに平行な任意の平面との交点を見つけることも同様に簡単であることに注意してください。
ワールド座標のポイントにZ = 0がある場合(平面キャリブレーションパターンの場合に当てはまります)、回転変換を反転する代わりに、カメラとキャリブレーションパターンから画像のホモグラフィを計算できます。
ホモグラフィがある場合は、画像上のポイントを選択し、逆ホモグラフィを使用して世界座標でその位置を取得できます。これは、世界座標の点がこのホモグラフィの計算に使用される点と同じ平面上にある限り当てはまります(この場合はZ = 0)
この問題へのこのアプローチは、SOに関するこの質問の下でも説明されています: 2D画像座標をz = 0の3D世界座標に変換する