射影変換といいます。以下のリンクは、必要なものを正確に案内するものです。
Demonstration of calculating a projective transformation数学SEでの適切な数学のタイプセット。
あなたはこれを手で解決してコードに書き込むことができますが...行列計算ライブラリを使用すること、または独自の行列演算関数を書くことを強くお勧めします。それらをコードに変換することは象徴的であり、それは非常に広範であり誤算になりがちです。ここで
は(自分の問題に適用する)明確化のお手伝いをすることだけでいくつかのヒントです:
- あなたの行列(ソース)は、あなたのカメラ画像に4つのXYポイントから構築されています(ピクセル位置) 。
- あなたのBマトリックス(宛先)は、実世界での測定値から作成されます。
- 速い再較正のために、再測定することなく、立方体を4つの場所にすばやく配置して(カメラの変更されたピクセル位置を取得できるように)地面に点をマークすることをおすすめします。
- キャリブレーション中にステップ1-5(1回)を実行するだけで、その後に何かの位置を知りたい場合は、イメージ内の座標を取得し、ステップ6とステップ7まで実行します。
- キャリブレーションポイントが可能な限り離れている必要があります(消失点の極端な距離では、ピクセルの密度が急激に低下して画像の精度が低下するため)。 3点が同一線上にないことを確認してください(単純に言えば、実世界のカメラfovのほぼ全域で4点をほぼ正方形にしてください)
psここでは書いていないことをお詫びしますが、数学の編集とそれはより清潔に見えます!このような状況にこの方法を適用する
最終ステップ:
このキャリブレーションを実行するためには、あなたがグローバルホームポジションを設定する必要があります(床に任意にこれを行うと、お使いのカメラの位置を測定する可能性が最も簡単その点まで)。この位置から、床上のx座標とy座標の両方でこの位置からオブジェクトの距離を測定する必要があります。より緊密に詰め込まれたキャリブレーションセットではエラーが増えますが、このための最も簡単な解決策は、単に寸法紙を使用することです(プリンタ用紙や大きなボードなどと思っています)。これが簡単になる理由は、軸を組み込むことです(つまり、2つの側面が直交し、オブジェクトの四隅を使用し、キャリブレーションで缶詰の距離を使用します)。 EX:紙の場合、ポイントは(0,0)、(0,8.5)、(11,8.5)、(11,0)
となるので、これらのポイントとピクセルを使用すると、しかし、これはまだ測定するのが難しいかもしれない軸上のグローバルなx、y位置を与えます(測定/較正の仕方によっては歪むかもしれません)。 、X1、Y1 カメラcoordsの(Xcを、Ycの)
DIST = SQRT(POW(X1-XC:(上記のステップからの)現実世界の座標での、
オブジェクトを:だから、オフセットカメラを計算する必要があります2)+ pow(y1-Yc、2))
グローバル原点から手動でカメラの位置を測定するのが面倒すぎる場合は、代わりに2つの異なる点までの距離を測定し、それらの値を供給することができます上の方程式に入力してカメラのオフセットを計算し、最終的な距離を取得したいときはいつでも保存して使用します。
床の上のポイントの距離にのみ興味がありますか?私。あなたは3D空間内の単一の飛行機だけを気にしますか? –
アップ、すみません。私の処方は正確ではなかった。距離とは、ワールド座標系の根元(カメラ位置でもよい)からオブジェクトの下端の中心までの距離を意味する。オブジェクト(例:小さな立方体)が床に立っているので、床は3D空間内の単一平面にする必要があります。 – Marcello90
図が役立ちます! –