走行中の車両の正面から記録されたビデオファイルがあります。オブジェクトの検出と認識にOpenCVを使用しますが、1つの側面に固執しています。認識されたオブジェクトからの距離を判断するにはどうすればよいですか。
現在の速度と実際のGPS位置を知ることはできますが、それだけです。追跡しているオブジェクトについて推測することはできません。これを使用して、オブジェクトと衝突することなくオブジェクトを追跡および追跡することを計画しています。理想的には、このデータを使用してオブジェクトの実世界の位置を導出したいと思います。カメラからオブジェクトまでの距離を判断できれば、それを実行できます。
動いているビデオがある場合、時間的視差を使用して、オブジェクトの相対距離を決定できます。視差:( 定義 )。
効果は、同じオブジェクトをわずかに異なる角度から見ることで奥行き知覚を得ることができる目と同じものになります。移動しているので、2つの連続したビデオフレームを使用して、わずかに異なる角度を取得できます。
視差計算を使用して、オブジェクトのrelativeサイズと距離(相互に対する)を決定できます。ただし、absoluteサイズと距離が必要な場合は、既知の参照ポイントが必要になります。
また、計算を行うには、移動する速度と方向(およびビデオフレームレート)を知る必要があります。あなたはmight視覚データを使用して車両の速度を導き出すことができますが、複雑さの別の側面が追加されます。
このテクノロジーはすでに存在しています。衛星は、短時間に撮影された複数の画像を比較することにより、 地形の隆起 (高さ)を決定します。太陽の周りの地球軌道のさまざまなポイントで夜空の写真を撮ることにより、視差を使用して星の距離を決定します。 2枚の写真を連続して撮影することで、飛行機の窓から3D画像を作成することができました。
正確な技術と計算(頭上で知っていたとしても)はwayここでの議論の範囲外です。適切なリファレンスが見つかったら、ここに投稿します。
あなたの問題は、この分野ではかなり標準的なものです。
カメラを調整する必要があります。これは、 オフライン (人生をよりシンプルにするmuchをシンプルにする)または オンライン を自己較正で行うことができます。
オフラインでのキャリブレーション -お願いします。
カメラのキャリブレーション行列[〜#〜] k [〜#〜]を取得したら、連続するシーンでカメラの投影行列を決定します(視差を使用する必要があります)他の人が述べたように)。これは OpenCVチュートリアル で詳しく説明されています。
GPS情報を使用して、連続するシーンのカメラ間の相対的な向き(ほとんどのGPSユニットに固有のノイズのために問題になる可能性がある)、つまり[〜#〜]を見つける必要があります。チュートリアルで言及されているr [〜#〜]およびtまたは2つのカメラ間の回転と移動。
すべてを解決すると、2つの投影行列が得られます。これらの連続したシーンでのカメラの表現です。これらのいわゆるカメラ行列のいずれかを使用して、シーン上の3Dポイント[〜#〜] m [〜#〜]を2D画像に「投影」できます。カメラのピクセル座標m(チュートリアルのように)。
これを使用して、ビデオで見つかった2Dポイントから実際の3Dポイントを三角測量します。
関心点検出器を使用して、関心のあるオブジェクトにあるビデオの同じ点を追跡します。使用可能な検出器がいくつかあります。 [〜#〜] surf [〜#〜] をお勧めします。OpenCVには Shi-Tomasi corners 、- ハリス 、 etc 。
シーケンス全体でオブジェクトのポイントを追跡し、対応する2Dピクセル座標を取得したら、投影マトリックスと2Dポイントを考慮して、最適な3Dポイントを得るために triangulate を実行する必要があります。
上記の画像は、不確実性と最適な3Dポイントの計算方法をうまくキャプチャしています。もちろん、あなたの場合、カメラはおそらくお互いの前にあります!
オブジェクトの3Dポイントを取得したら、カメラの中心(ほとんどの場合は原点)とポイントの間のユークリッド距離を簡単に計算できます。
これは明らかに簡単なことではありませんが、それほど難しくありません。 HartleyとZissermanの優れた本 Multiple View Geometry をお勧めします。これは、起動するMATLABコードを使用して上記のすべてを詳細に説明しています。
楽しみながら質問を続けてください!
既知の距離だけ離れた2つの異なるフレーム上の同じオブジェクトの同じポイントを識別する必要があります。各フレーム内のカメラの位置がわかっているので、ベースライン(2つのカメラ位置間のベクトル。既知のベースラインと識別されたポイントへの角度から三角形を構築します。三角法により、未知の辺の長さがわかります。ベースラインの既知の長さと、ベースラインと未知の側面の間の既知の角度のトグル。
2台のカメラを使用することも、1台のカメラで連続して撮影することもできます。そのため、車両が1 m/sで移動し、毎秒フレームを撮影する場合、成功フレームは1 mのベースラインを取得し、5 mまでの距離を測定するのに適しています。使用するフレームよりも遠くにオブジェクトを範囲指定する必要がある場合は、より遠くのオブジェクトがより長く表示されます。
F1のオブザーバーは、速度ベクトルに対して角度a1のTにあるターゲットを見ます。オブザーバーは距離bをF2に移動します。 Tで角度a2のターゲットを確認します。
R1を見つけるために必要、F1のターゲットからの範囲
コサインの三角恒等式は、
Cos(90 – a1)= x/r1 = c1
Cos(90-a2)= x/r2 = c2
Cos(a1)=(b + z)/ r1 = c3
Cos(a2)= z/r2 = c4
xは、観測者の速度ベクトルに直交するターゲットまでの距離です
zはF2からxとの交差点までの距離です
R1の解決
r1 = b /(c3 – c1。c4/c2)
視差を検出できるように2台のカメラ。それは人間がすることです。
編集
詳細については、ravenspointの回答をご覧ください。また、スプリッターを備えた単一のカメラでおそらく十分であることに留意してください。
ステレオ視差マップを使用します。多くの実装が浮かんでいます、ここにいくつかのリンクがあります: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html
http://www.ece.ucsb.edu/~manj/ece181bS04/L14(morestereo).pdf
あなたの場合、ステレオカメラはありませんが、ビデオを使用して深度を評価できます http://www.springerlink.com/content/g0n11713444148l2/
上記はあなたに最も役立つものになると思います。
単一の単眼画像から深さを評価できるほど(十分に拡張することはできませんが)、これまでのところ研究が進んでいます http://www.cs.cornell.edu/~asaxena/learningdepth/
私が間違っている場合は誰かが私を修正してください、しかし、あなたが単純に単一のカメラを使用し、単純にソフトウェアソリューションに頼るつもりなら、あなたがするかもしれないどんな処理も偽陽性になりやすいように思えます。映画で実際に知覚される距離にあるオブジェクトと、その距離にあるように見えるオブジェクト(「強制的な遠近感」など)の違いを判断できる処理があることは非常に疑わしいです。
超音波センサーを追加できる可能性はありますか?
まず、カメラをキャリブレーションして、カメラプランのオブジェクトの位置と現実世界のプランのオブジェクトの位置の関係を取得できるようにします。1台のカメラを使用している場合は、「オプティカルフローテクニック」を使用します2つのカメラは、単純な三角測量を使用して実際の位置を見つけるだけです(オブジェクトの距離を見つけるのは簡単です)が、この2番目のメトースを持つプローベムは一致します。つまり、オブジェクト 'x'の位置を見つける方法を意味します。 camera2で、camera1での位置を既に認識している場合は、「SIFT」アルゴリズムを使用できます。私はあなたにそれがあなたに役立つことを望むいくつかのキーワードを与えました。
カメラの視野に既知のサイズのオブジェクトを配置します。そうすれば、より客観的なメトリックを測定することができますangular距離。2番目の視点/カメラがなければ、サイズ/距離の推定に制限されますが、少なくとも完全な推測にはなりません。 。