Așadar, cum putem găsi distanța față de camera obiect în timp real cu camera web la o precizie decentă, fără a necesita deloc hardware suplimentar, cum ar fi o cameră stereo sau un senzor de adâncime?*

Această postare de blog va acoperi implementarea unui algoritm simplu numit similaritate triunghiulară, pentru detectarea obiectelor, vom păstra acest lucru simplu folosind doar detectarea feței a OpenCV.

Video demonstrativ pentru estimarea distanței

Baza de cod

Codul va fi disponibil în „Depozitul GitHub” al meu, aici voi explica fragmente importante de cod. În cazul în care aveți nevoie de ajutor, lăsați doar un comentariu, voi fi bucuros să vă ajut 😎

Cerințe

Cerințele sunt destul de simple, aveți nevoie de fișiere Python, OpenCV și Haar-cascade pentru Detecția feței.

După ce python este instalat pe mașina dvs., deschideți terminalul și lipiți următoarea comandă în terminal și ați terminat, Instalare.

pip install opencv-python # on Linux turn pip to pip3

Capturați imaginea de referință

Imaginea de referință, ne permite să cartografiem lumea reală (planul obiectului), deoarece pierdem adâncimea obiectului atunci când îl captăm în spațiu 2D (imagine), în caz contrar, avem nevoie de o cameră specială, care să poată surprinde adâncimea din moment ce dorim. pentru a folosi webcam-ul nostru, imaginea de referință este necesară, trebuie să aveți grijă de câteva lucruri, astfel încât acuratețea să nu scadă, puteți utiliza imaginea de referință a mea, nu va afecta prea mult, dar vă voi recomanda să o capturați singur pentru a obține mai multa acuratete.

Trebuie să aveți grijă de câteva lucruri în timp ce capturați imaginea de referință.

  • Rezoluția imaginii (cadru) trebuie să fie aceeași, ca și în imaginea de referință, am păstrat valorile implicite ale OpenCV, care este (640, 480)
  • Țineți camera cât mai dreaptă posibil în timp ce capturați imaginile de referință.
  • Măsurați distanța (KNOWN_DISTANCE) de la camera obiect, notați-o și capturați imaginea care este setată la 76,2 centimetri.
  • Măsurați lățimea (KNOWN_WIDTH) a obiectului, notați-l și, pentru mine este de 14,3 centimetri.

Variabile importante

  • KNOWN_DISTANCE:este distanța pentru camera obiect 📷 în lumea reală.
  • KNOWN_WIDTH:este lățimea măsurată a unui obiect în lumea reală
  • face_width_in_frame:este lățimea feței dintr-o imagine (cadru), care este furnizată de un detector de fețe, măsurată în pixeli
KNOWN_DISTANCE = 76.2  # centimeter
KNOWN_WIDTH = 14.3  # centimeter

Detectarea obiectelor (față)

Folosesc detectarea feței aici, este implacabilă pentru fiecare detector de obiecte, trebuie doar să urmați procedura,

Detectarea feței folosind Opencv python, aici este funcția care detectează pur și simplu fața și returnează lățimea feței, în pixeli

Funcția Date față acceptă un singur argument, care este o imagine.

def face_data(image):
face_width = 0
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray_image, 1.3, 5)
    for (x, y, h, w) in faces:
        cv2.rectangle(image, (x, y), (x+w, y+h), WHITE, 1)
        face_width = w
return face_width

Găsitorul distanței focale

Funcția de găsire a distanței focale are trei argumente:

  1. Measured_distance este distanța de la cameră la obiect în timpul captării imaginii de referință, Known_distance = 72,2 centimetri
  2. Real_width Lățimea măsurată a unui obiect în lumea reală, aici măsoară lățimea feței care este în jur de Known_width =14,3 centimetri
  3. Width_in_rf_image este lățimea obiectului din imagine/cadru care va fi în pixeli

Această funcție va returna distanța focală, care este folosită pentru a găsi distanța, este doar o mapare.

aici este codul:

def FocalLength(measured_distance, real_width, width_in_rf_image):
    focal_length = (width_in_rf_image* measured_distance)/ real_width
    return focal_length

Găsește distanță

Această funcție are trei argumente,

  1. Lungimea focală în pixeli, care este o revenire din funcția Găsitor distanță focală
  2. Real_width Măsoară lățimea unui obiect în lumea reală, aici măsoară lățimea feței care este în jur de Known_width = 14,3 centimetri
  3. Width_in_rf_image este lățimea obiectului din imagine/cadru care va fi în pixeli

Funcția de căutare a distanței va returna distanța în centimetri

aici este codul:

def Distance_finder(Focal_Length, real_face_width, face_width_in_frame):
    distance = (real_face_width * Focal_Length)/face_width_in_frame
    return distance

Cam atât, aici este un tutorial video care explică totul în detaliu,

aici este o versiune mai precisă a acestui algoritm, aici este GitHub Repository

Există o altă modalitate (Aruco Markers) de a găsi o distanță mai convenabilă și mai precisă, cu o singură cameră (camera web obișnuită a laptopului), le vom analiza într-o postare viitoare.

Referință:



Găsiți distanța de la cameră la obiect folosind Python și OpenCV
Ultima actualizare pe 8 iulie 2021. În urmă cu câteva zile, Cameron, un cititor PyImageSearch a trimis un e-mail și a întrebat despre metode …www.pyimagesearch.com»





GitHub - Asadullah-Dal17/Distance_measurement_using_single_camera: folosind o singură cameră pentru a măsura...
Dacă doriți să estimați distanța obiectelor cu camera web simplă, atunci acest algoritm (asemănarea triunghiului) ar fi...github.com»





Sugestii de trimitere la Mlearning.ai
Cum să devii scriitor pe Mlearning.aimedium.com”