41

私はOpenCVの初心者です。距離を計算するために次の式を使用しています。

distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
                          ----------------------------------------------------------------
                                object height (pixels) * sensor height (mm)

オブジェクトの距離を決定できるOpenCVの関数はありますか? そうでない場合、サンプル コードへの参照はありますか?

4

3 に答える 3

53

既知のサイズのオブジェクトを指定して距離を計算する方法

前もって 2 つのうちの 1 つを知っておく必要があります

  • 焦点距離 (mm および 1 mm あたりのピクセル数)
  • イメージ センサーの物理的なサイズ (1 mm あたりのピクセル数を計算するため)

センサーのデータシートをグーグルで検索したくないので、焦点距離を使用します。

カメラのキャリブレーション

ソース コードで提供されるOpenCVcalibrate.pyツールと Chessboard パターン PNG を使用して、キャリブレーション マトリックスを生成します。チェス盤の写真をできるだけ多くの角度から約 20 枚撮り、ファイルを Mac にエクスポートしました。詳細については、OpenCV のカメラ キャリブレーション ドキュメントを確認してください。

カメラのキャリブレーション マトリックス (iPhone 5S 背面カメラ)

RMS: 1.13707201375
camera matrix:
[[  2.80360356e+03   0.00000000e+00   1.63679133e+03]
 [  0.00000000e+00   2.80521893e+03   1.27078235e+03]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
distortion coefficients:  [ 0.03716712  0.29130959  0.00289784 -0.00262589 -1.73944359]
  • f_x = 2803
  • f_y = 2805
  • c_x = 1637
  • c_y = 1271

撮影した一連のチェス盤の写真の詳細を確認すると、写真のネイティブ解像度 (3264x2448) と、iPhoto で表示される JPEG EXIF ヘッダーで、焦点距離の値 (4.15mm) を見つけることができます。これらの項目はカメラによって異なります。

ピクセル/ミリメートル

イメージ センサーのミリメートルあたりのピクセル数 (px/mm) を知る必要があります。カメラの切除に関するページから、f_x と f_y は焦点距離にスケーリング係数を掛けたものであることがわかります。

f_x = f * m_x
f_y = f * m_y

各数式には 2 つの変数があるため、m_x と m_y について解くことができます。2803 と 2805 を平均して 2804 を取得しました。

m = 2804px / 4.15mm = 676px/mm 

オブジェクトのサイズ (ピクセル)

OpenCV (C++) を使用してポイントのRotated Rectを取得し、オブジェクトのサイズを 41px に決定しました。オブジェクトの角を既に取得しており、外接する四角形にそのサイズを尋ねていることに注意してください。

cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));

小シワ

オブジェクトは、カメラ @ 640x480 で撮影されたビデオで 41 ピクセルです。

低解像度で px/mm を変換

3264/676 = 640/x
x = 133 px/mm

したがって、41px/133px/mm の場合、イメージ センサー上のオブジェクトのサイズは .308mm であることがわかります。

距離式

distance_mm = object_real_world_mm * focal-length_mm / object_image_sensor_mm
distance_mm = 70mm * 4.15mm / .308mm
distance_mm = 943mm

これはかなり良いことです。私は910mmを測定しましたが、いくつかの改良により、おそらくエラーを減らすことができます.

フィードバックをお待ちしております。

相似三角形アプローチ

Adrian atは、同様の三角形を使用した別のテクニックをpyimagesearch.com示しました。事前にこのトピックについて話し合ったところ、彼は同様の三角形のアプローチを採用し、私はカメラの組み込み関数を作成しました。

于 2014-12-16T10:30:14.180 に答える
1

opencvには、オブジェクトとカメラの間の距離を計算するために使用できるそのような関数はありません。これを参照してください: カメラから既知のサイズのオブジェクトまでの距離を見つける

パラメータはカメラによって異なり、カメラを変更すると変更されることを知っておく必要があります。

于 2012-12-26T08:42:28.863 に答える
0
  1. カメラの事前情報なしで現実世界とカメラの間のマッピングを取得するには、カメラを調整する必要があります...ここでいくつかの理論を見つけることができます
  2. 深さ、つまりカメラとオブジェクト間の距離を計算するには、2 台の異なるカメラで撮影された同じオブジェクトの少なくとも 2 つの画像が必要です...これは一般にステレオ ビジョン技術と呼ばれています。
于 2012-12-27T05:00:53.870 に答える