7

私は画像から車の速度を見つけるプロジェクトを行っています。これらの画像は車内から撮影しています。最初の画像のオブジェクトを参照としてマークします。次の画像の同じオブジェクトのプロパティを使用して、移動する車両の速度を計算する必要があります。誰かがここで私を助けることができますか?私はpythonopencvを使用しています。オプティカルフロー法を使用して、2番目の画像でマークされたピクセルを見つけるまで成功しました。誰かが残りを手伝ってくれますか?

4

1 に答える 1

11

取得頻度がわかったら、マーカーの連続する位置間の距離を見つける必要があります。

この距離を見つけるには、各画像のマーカーのポーズを推定することをお勧めします。大まかに言えば、「ポーズ」は、カメラに対するオブジェクトの座標を表す変換行列です。これらの連続する座標を取得したら、距離を計算してから速度を計算できます。

ポーズ推定は、2Dカメラに対する既知の3Dオブジェクトの位置と向きを計算するプロセスです。結果として得られるポーズは、カメラの参照内のオブジェクトの参照を記述する変換行列です。

ポーズの説明

OpenCVは、ポーズ推定アルゴリズムPositを実装しています。ドキュメントによると:

オブジェクトのいくつかの3Dポイント(オブジェクト座標系)、少なくとも4つの非同一平面上のポイント、画像内の対応する2D投影、およびカメラの焦点距離が与えられると、アルゴリズムはオブジェクトのポーズを推定できます。

これの意味は:

  1. カメラの焦点距離を知っている必要があります
  2. マーカーの形状を知っている必要があります
  3. 2D画像でマーカーの4つの既知のポイントを一致させることができる必要があります

OpenCVが提供するキャリブレーションルーチンを使用して、カメラの焦点距離を計算する必要がある場合があります。他に2つの必要なデータがあると思います。

編集:

// Algorithm example

MarkerCoords = {Four coordinates of know 3D points}

I1 = take 1st image
F1 = focal(I1)
MarkerPixels1 = {Matching pixels in I1}
Pose1 = posit(MarkerCoords, MarkerPixels1, F1)

I2 = take 2nd image
F2 = focal(I2)
MarkerPixels2 = {Matching pixels in I2 by optical flow}
Pose2 = posit(MarkerCoords, MarkerPixels2, F2)

o1 = origin_of_camera * Pose1 // Origin of camera is
o2 = origin_of_camera * Pose2 // typically [0,0,0]
dist = euclidean_distance(o1, o2)
speed = dist/frequency

編集2:(コメントへの回答)

「取得頻度は?」

車両の速度を計算することは、マーカーの速度を計算することと同じです。(前者の場合、参照は地球に取り付けられたマーカーであり、後者の場合、参照は車両に取り付けられたカメラです。)これは次の式で表されます。

speed = D/(t2-t1)

と:

  • D距離[o1 o2]
  • o1時間でのマーカーの位置t1
  • o2時間でのマーカーの位置t2

写真のメタデータから、またはイメージングデバイスの取得頻度t1から抽出して経過時間を取得できます。t2t2-t1 = T = 1/F

「ポスターのような単純なものに印を付ける方が良いのではないでしょうか。そうすると、2Dオブジェクトと見なすことができませんか?」

これは、Positアルゴリズム(または私が知る限り、他のポーズ推定アルゴリズム)では不可能です。4つの非同一平面上の点が必要です。つまり、3D空間に埋め込まれた2Dオブジェクトを選択することはできず、ある程度の深さのあるオブジェクトを選択する必要があります。

一方、ボリュームである限り、非常にシンプルな形状を使用できます。(たとえば、立方体。)

于 2011-02-02T13:48:49.417 に答える