既知のサイズのオブジェクトを指定して距離を計算する方法
前もって 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
示しました。事前にこのトピックについて話し合ったところ、彼は同様の三角形のアプローチを採用し、私はカメラの組み込み関数を作成しました。