OpenCV: come calcolare la distanza tra fotocamera e object usando l’immagine?

Sono un principiante in OpenCV. Sto lavorando con la seguente formula per calcolare la distanza:

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

Esiste una funzione in OpenCV che può determinare la distanza dell’object? In caso negativo, qualsiasi riferimento al codice di esempio?

Come calcolare la distanza dato un object di dimensioni note

Devi conoscere una delle 2 cose in anticipo

  • Lunghezza focale (in mm e pixel per mm)
  • Dimensione fisica del sensore di immagine (per calcolare i pixel per mm)

Userò la lunghezza focale dato che non voglio google per la scheda tecnica del sensore.

Calibra la fotocamera

Utilizzare lo strumento calibrate.py OpenCV e il modello PNG della scacchiera fornito nel codice sorgente per generare una matrice di calibrazione. Ho scattato circa 2 dozzine di foto della scacchiera da tutti gli angoli possibili e ho esportato i file sul mio Mac. Per maggiori dettagli, consulta i documenti di calibrazione della videocamera di OpenCV .

Matrice di calibrazione fotocamera (fotocamera posteriore 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

Controllando i dettagli della serie di foto della scacchiera che hai scattato, troverai la risoluzione nativa (3264×2448) delle foto e nelle intestazioni JPEG EXIF , visibili in iPhoto, puoi trovare il valore Lunghezza focale (4,15 mm). Questi elementi dovrebbero variare a seconda della fotocamera.

Pixel per millimetro

Abbiamo bisogno di conoscere i pixel per millimetro (px / mm) sul sensore di immagine. Dalla pagina sulla resezione della fotocamera sappiamo che f_x e f_y sono tempi focali di un fattore di scala.

 f_x = f * m_x f_y = f * m_y 

Dato che abbiamo due delle variabili per ogni formula, possiamo risolvere per m_x e m_y. Ho solo una media di 2803 e 2805 per ottenere 2804.

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

Dimensione dell’object in pixel

Ho usato OpenCV (C ++) per afferrare il Rect ruotato dei punti e determinato la dimensione dell’object da 41px. Si noti che ho già recuperato gli angoli dell’object e chiedo il rettangolo di delimitazione per le sue dimensioni.

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

Piccola ruga

L’object è 41px in un video girato sulla fotocamera @ 640×480.

Converti px / mm nella risoluzione più bassa

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

Quindi, dato 41px / 133px / mm, vediamo che la dimensione dell’object sul sensore di immagine è di .308mm.

Formula distanza

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

Questo sembra essere abbastanza buono. Ho misurato 910 mm e con alcuni aggiustamenti posso probabilmente ridurre l’errore.

Il feedback è apprezzato.

Approccio triangoli simili

Adrian su pyimagesearch.com dimostrato una tecnica differente usando triangoli simili . Abbiamo discusso in anticipo di questo argomento e lui ha adottato l’approccio triangular simile e io ho fatto le intrinseche della fotocamera.

non esiste tale funzione disponibile in opencv per calcolare la distanza tra l’object e la fotocamera. vedere questo: individuazione della distanza dalla fotocamera all’object di dimensioni note

Dovresti sapere che i parametri dipendono dalla fotocamera e cambieranno se la telecamera viene cambiata.

  1. Per ottenere una mapping tra il mondo reale e la fotocamera senza alcuna informazione preliminare della fotocamera è necessario calibrare la fotocamera … qui puoi trovare qualche teoria
  2. Per calcolare la profondità, ad esempio la distanza tra la fotocamera e l’object, sono necessarie almeno due immagini dello stesso object prese da due diverse fotocamere … che è comunemente chiamata la tecnica di visione stereo.