2016-12-12 3 views
6

部屋の中の平らな床に小さな物体を置いています。静的シーンで1台のカメラで物体までの距離を測定する

  • 最初のステップ:ワールド座標系の既知の静的位置から部屋の床の写真を撮ります。
  • 第2ステップ:画像内のオブジェクトの下端を検出し、ピクセル座標をワールド座標系のオブジェクト位置にマッピングします。
  • 第3ステップ:測定テープを使用して、物体までの実際の距離を測定します。

私は小さなオブジェクトを移動し、この3つのステップをすべてのピクセル座標に繰り返し、ルックアップテーブル(キー:ピクセル座標、値:距離)を作成することができました。この手順は、私の使用事例に十分正確です。私は、複数のオブジェクトがある場合(オブジェクトが他のオブジェクトをカバーする可能性がある場合)、問題があることを知っています。

私の質問:このルックアップテーブルを簡単に作成する方法はありますか?誤ってカメラの角度を数度変化させると、ハードワークが破壊されます。 ;)

ワールド座標系のいくつかの特定のピクセル座標または位置に対して3つのステップを実行し、計算されたパラメータとの距離を計算するために「キャリブレーション」を実行することは可能でしょうか?

+0

床の上のポイントの距離にのみ興味がありますか?私。あなたは3D空間内の単一の飛行機だけを気にしますか? –

+0

アップ、すみません。私の処方は正確ではなかった。距離とは、ワールド座標系の根元(カメラ位置でもよい)からオブジェクトの下端の中心までの距離を意味する。オブジェクト(例:小さな立方体)が床に立っているので、床は3D空間内の単一平面にする必要があります。 – Marcello90

+2

図が役立ちます! –

答えて

2

ほとんどのビジョンライブラリ(opencvを含む)には、カメラ基準フレームとデカルト平面からの2点を取り、あなたのためにワープ行列(アフィン変換)を生成する関数が組み込まれています。 (十分な入力点を持つ非線形性マッピングを含めることができるほどファンシーですが、問題の校正に時間を要します)

最後のビジュアルライブラリでは、チェッカーボードパターン。そのようなシートで作業するようにキャリブレーションを書いた場合は、変換がシートによって計算され、ターゲットがワールドオフセットを提供するだけなので、1つのターゲットオブジェクトまでの距離を測定する必要があります。

2

射影変換といいます。以下のリンクは、必要なものを正確に案内するものです。

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つの異なる点までの距離を測定し、それらの値を供給することができます上の方程式に入力してカメラのオフセットを計算し、最終的な距離を取得したいときはいつでも保存して使用します。

+0

リンクありがとうございます。;)ステップ7の後:どのように距離を計算するのですか? – Marcello90

5

床が平坦である場合、その式は平面で、カメラ座標における

a.x + b.y + c.z = 1 

をさせていること(原点はカメラの光学中心である、XYは焦点面とZを形成します視線方向)。

そして画素の画像上の点までのカメラ中心からの光線は(u, v)fは焦点距離

(u, v, f).t 

によって与えられる座標。

場合

(a.u + b.v + c.f) t = 1, 

すなわち、光線が面を打ちますポイントで

(u, v, f)/(a.u + b.v + c.f) 

最後に、ポイントまでのカメラからの距離は、これはあなたが集計する必要がある機能です

p = √(u² + v² + f²)/(a.u + b.v + c.f) 

です。 fが既知であると仮定すると、未知の係数a,b,cを3つの非整列点をとり、画像座標(u, v)と距離を測定し、線形方程式の3x3系を解くことによって求めることができます。

最後の式から、画像の任意の点の距離を推定できます。

既知のサイズのターゲットを既知の距離で見て焦点距離を測定できます(ピクセル単位)。比例関係により、画像の長さに渡って、そのサイズに対する距離の比は、fになります。

1

前の回答ですでに述べたように、射影変換や単純にホモグラフィが必要です。しかし、私はそれをより実践的な観点から考察し、それを簡潔に要約しようとします。

したがって、適切なホモグラフィが与えられていると、上から撮ったように見えるように飛行機の写真を歪めることができます(hereなど)。さらに簡単にすると、イメージのピクセル座標を平面のワールド座標に変換できます(各ピクセルのワーピング中も同様です)。

ホモグラフィは、基本的に3x3マトリックスであり、マトリックスに乗算することで座標を変換します。 3x3の行列と2次元座標を待つことを考えてください:homogeneous coordinatesを使う必要があります。

しかし、ほとんどのフレームワークとライブラリは、この処理を行います。あなたがする必要があることは、あなたの世界の平面/床(好ましくは、あなたの望む世界座標系に揃えられた四角形の角)上の(少なくとも)4点(x/y座標)を探し出し、ピクセルは座標を合わせ、目的のコンピュータビジョンまたは数学ライブラリの「発見ホモグラフィ関数」に渡します。

OpenCVでは、findHomography、ここではexample(方法perspectiveTransformは実際の変換を行います)。

Matlabではhereから何かを使用できます。変換タイプとして射影変換を使用していることを確認してください。結果はtform投影法で、thisメソッドと組み合わせて使用​​して、座標系を別の座標系に変換することができます。

他の方向に変換するには、あなたのホモグラフィを逆にして、代わりに結果を使用する必要があります。

関連する問題