2

道路上で前に車がある場合のように、2 点間の実際の距離を測定したいのですが、私と車の間の距離は?

私はこのように進めました:

1)上面図を取得するための透視変換を見つけました。

2) 次に、距離を見つけようとしました。

問題は、適切な上面図を取得できないことです。

代わりの方法があれば教えてください。

4

2 に答える 2

5

2 つの 3D ポイント間の距離を測定するには、両方のポイントの 3D 座標を見つける必要があります。次に、ユークリッド距離を計算するのは簡単です。

d(p1,p2)= sqrt{(p1_x - p2_x)^2+(p1_y - p2_y)^2+(p1_z - p2_z)^2}

ここでの問題は、シーン内のオブジェクトの 3D ポイントを見つけることです (カメラの位置、参照座標がわかっているため)。

3D 位置を見つけるには、ホモグラフィまたはカメラ ポーズを見つける必要があります。この目的のために、事前に知っている既知のモデルまたは画像の 4 つのポイントと一致するシーン内の少なくとも 4 つのポイントを検出する必要があります。たとえば、車の 3D モデルがあり、3D モデルに対応するシーン内の実際の車のポイントを検出できる場合、ホモグラフィ変換を計算できるため、車の 3D 位置を計算できます。それらのポイント。

とにかく問題は複雑です。検出、マッチング、キャリブレーションに多くのアルゴリズムを使用する必要があり、検出したいオブジェクトを知る必要があります。

于 2012-08-22T07:27:04.243 に答える
2

問題はあなたが思っているよりも難しいです。いくつかの仮定の下でも:

  1. 道路全体が平坦です(高さの変化はありません)。
  2. 車両のピクセル位置は、車輪が地面 (車両の屋根ではなく) に接触するポイントで測定されます。屋根を測定すると、距離は無限大になる可能性があります。
  3. カメラは一定のズームで固定されています。

この仮定のいずれかが成り立たない場合、距離を測定することは非常に困難になります。しかし、それらが保持されている場合は、次のことを行う必要があります。

  1. 上面図への透視変換は役に立ちません (定義による透視は距離を歪めるため)。上面図でも、光線は透視的に移動します。必要なのは「正投影」投影です。カメラが無限の高さ + 無限大のズームにあるときのトップ ビューをシミュレートします。衛星画像や地図で見るもののように。
  2. なぜそんな奇妙な変換が必要なのですか?正投影変換と透視変換の違いは、透視変換ではオブジェクト間の距離が tan(a) に依存し、正投影変換では sin(a) に依存することです。a - 距離線 (2 点間の線) が占めるカメラ視野の角度です。'a' が tan('a') = sin('a') よりも非常に小さい角度であり、保護変換を使用できる場合。しかし、お使いの Web カメラは広角 ~50 ~ 70 度であるため、画像の中心でのみ保護変換を使用して距離を正確に計算できます。
  3. さらに、距離を計算する前に、カメラ レンズの歪みを除去する必要があります。
  4. したがって、最初のステップはカメラを調整し、cvUnDistort() を使用してビューを修正することです。
  5. 私の知る限り、openCV には組み込みの正射変換はありません。したがって、修正された画像に対して上面図の射影変換を使用できますが、距離は両方の車両が画像の中心近くにある場合にのみ正確になります。
  6. unDisrtort() を使用して正射投影変換を実装できますが、おそらくカメラ モデルとカメラ キャリブレーションの計算に慣れていないため、時間がかかります。unDistort() では、基本的に、sin('a') に一致するテイラー展開級数の係数を挿入する必要があります。つまり、a、-a^2/2、... などです。

とにかく、先ほども言いましたが、距離の測定は非常に難しい問題です。次の簡単ですが正確ではない解決策をお勧めします。

  1. レンズの歪みを補正する
  2. トップ ビューの射影変換を適用する
  3. 車両が画像の中心から離れているときに距離測定でエラーが発生することがわかった場合は、手動補正を追加してみてください。必要なことのほとんどを行うオープン ソースをここで見つけることが でき ます。 . それが役に立ったことを願っています
于 2012-08-22T07:00:04.063 に答える