Cuprins:

Numărarea obiectelor Raspberry Pi: 5 pași
Numărarea obiectelor Raspberry Pi: 5 pași

Video: Numărarea obiectelor Raspberry Pi: 5 pași

Video: Numărarea obiectelor Raspberry Pi: 5 pași
Video: Cum să construim un robot inteligent de 100 USD cu ML.NET, IoT Libraries și Raspberry Pi 2024, Iulie
Anonim
Numărarea obiectelor Raspberry Pi
Numărarea obiectelor Raspberry Pi

Fără îndoială, viziunea pe computer este un lucru fantastic! Folosind acest lucru, un computer capătă capacitatea de a „vedea” și de a simți mai bine mediul înconjurător, ceea ce permite dezvoltarea de aplicații complexe, utile și reci. Aplicații precum detectarea și recunoașterea feței, urmărirea obiectelor și detectarea obiectelor sunt din ce în ce mai prezente în activitățile noastre de zi cu zi, datorită progreselor de viziune pe computer.

Având în vedere cât de avansate și accesibile sunt cadrele și instrumentele de viziune pe computer, aplicația descrisă în acest articol se potrivește bine: folosind un Raspberry PI simplu și un cadru de viziune pe computer gratuit și open-source, numit OpenCV, pentru a număra obiectele în mișcare, mai exact cât de mult obiectele intră și ies dintr-o anumită zonă monitorizată.

Pasul 1: Aprofundarea: Cum poate fi detectată mișcarea obiectelor într-un flux de imagine?

Noțiuni de bază mai profunde: cum poate fi detectată mișcarea obiectelor într-un flux de imagini?
Noțiuni de bază mai profunde: cum poate fi detectată mișcarea obiectelor într-un flux de imagini?

Acum este timpul să aprofundăm lucrurile de procesare a imaginilor:

cum să obțineți niște imagini în flux prin webcam și să detectați că s-a mutat ceva acolo

Constă în cinci pași:

Pasul 1: Pentru a evidenția obiectul în mișcare

Așa cum este definit în fizica clasică, este necesară o referință pentru a afla că ceva se mișcă sau dacă stă nemișcat. Aici, pentru a determina dacă ceva s-a mișcat, este cam la fel: fiecare cadru capturat de flux de webcam va fi comparat cu un cadru de referință. Dacă ceva este diferit, ceva a fost mutat. Este simplu pe cât pare.

Acest cadru de referință trebuie capturat în cele mai perfecte condiții (nimic nu se mișcă, de exemplu). În lumea procesării imaginilor, această comparație între un cadru capturat și un cadru de referință constă într-o tehnică numită scădere de fundal. Subtrarea de fundal constă în scăderea literală a informațiilor de culoare pixel-la-pixel din cadrul capturat și cadrul de referință. Deci, imaginea rezultată din acest proces va evidenția / arăta cu mai multe detalii doar ceea ce este diferit între aceste două cadre (sau, ce s-au mișcat / au mișcat) și orice altceva va fi negru în imagine (culoarea valorii zero pe un gri -pixel la scară). Important: condițiile de iluminare și calitatea imaginii webcam capturate (datorită calității senzorilor de captură) pot varia ușor de la cadru la cadru. Aceasta implică faptul că „părțile egale” din cadrul de referință și alte cadre nu vor fi negre totale după scăderea fundalului. În ciuda acestui comportament, nu există consecințe grave în următorii pași de procesare a imaginii în acest proiect.

Pentru a minimiza timpul de procesare a imaginii, înainte de a efectua o subtrare a fundalului, cadrul capturat și cadrul de referință sunt convertite într-o imagine la scară de gri. Dar de ce? Este o problemă de eficiență de calcul: o imagine care prezintă mai multe culori (imagine color) are trei informații pe pixel: componente de culoare roșie, albastră și verde (vechiul standard RGB auriu). Deci, matematic, fiecare pixel poate fi definit ca o matrice cu trei valori, fiecare reprezentând o componentă de culoare. Prin urmare, extinzându-l la întreaga imagine, imaginea finală va fi de fapt amestecul a trei componente ale imaginii: componente ale imaginii roșii, albastre și verzi.

Pentru a-l Procesa, este nevoie de multă muncă! Cu toate acestea, în imaginile la scară de gri, fiecare pixel are o singură informație de culoare. Deci, procesarea unei imagini color este de trei ori mai lentă decât în cazul imaginii la scară de gri (cel puțin de trei ori, în funcție de ce tehnică este implicată). Și mai sunt: în anumite scopuri (cum ar fi acest proiect), procesarea tuturor culorilor nu este deloc necesară sau importantă. Prin urmare, am ajuns la concluzia: utilizarea imaginilor la scară de gri este foarte recomandată în scopul procesării imaginilor. După subtrarea fundalului, este necesar să aplicați filtrul Gaussian Blur.

Filtrul Gaussian Blur aplicat peste imaginea scăzută de fundal netezeste toate contururile obiectului detectat în mișcare. Cu siguranță, va fi util în următorii pași de procesare a imaginilor.

Pasul 2: Binarizare

Binarizare
Binarizare

În majoritatea cazurilor de procesare a imaginii, binarizarea este aproape un pas obligatoriu după evidențierea obiectelor / caracteristicilor dintr-o imagine. Motiv: într-o imagine binară, fiecare culoare a pixelilor poate presupune doar două valori: 0x00 (negru) sau 0xFF (alb). Acest lucru ajută foarte mult procesarea imaginii pentru a necesita și mai puțină „putere de calcul” pentru aplicarea tehnicilor de procesare a imaginii în următorii pași. Binarizarea se poate face comparând fiecare culoare a pixelilor imaginii la scara de gri cu un anumit prag. Dacă valoarea culorii pixelilor este mai mare decât pragul, această culoare a pixelilor își va asuma valoarea albă (0xFF), iar dacă valoarea culorii pixelilor este mai mică decât pragul, această culoare a pixelilor va avea valoarea negru (0x00). Din nefericire, alegerea valorii pragului nu este atât de ușor de făcut. Depinde de factori de mediu, cum ar fi condițiile de iluminare. O alegere greșită a unei valori de prag poate distruge mai mulți pași. Așadar, vă recomand cu tărie să ajustați manual un prag în proiect pentru cazul dvs. înainte de orice alte acțiuni. Această valoare de prag trebuie să se asigure că obiectul în mișcare se afișează în imagine binară. În cazul meu, după alegerea adecvată a unui prag, rezultă ceea ce vedeți în figura 5.

Figura 5 - imagine binară

Pasul 3: dilatați

Până acum, era posibil să detectezi obiecte în mișcare, să le evidențiezi și să aplici binarizarea, ceea ce rezultă într-o imagine destul de clară a obiectului în mișcare (= imagine destul de clară a obiectului în scopul procesării imaginii). Pregătirea pentru numărarea obiectelor S-A FĂCUT aproape. „APROAPE” aici înseamnă că există câteva ajustări fine de făcut înainte de a trece mai departe. În acest moment, există șanse reale de prezență a „găurilor” în obiecte (mase negre de pixeli în obiectul evidențiat alb). Aceste găuri pot fi orice, de la condiții speciale de iluminare la o parte a formei obiectului. Odată ce găurile pot „produce” obiecte false în interiorul obiectelor reale (în funcție de cât de mari și unde sunt amplasate), consecințele prezenței găurilor într-o imagine pot fi catastrofale pentru numărarea obiectelor. O modalitate de a elimina aceste găuri este utilizarea unei tehnici de procesare a imaginii numită Dilate. Utilizați acest lucru și găurile dispar.

Pasul 4: Căutarea contururilor (și a centroidelor sale)

Căutarea contururilor (și a centroidelor sale)
Căutarea contururilor (și a centroidelor sale)

În acest moment, avem obiectele evidențiate, fără găuri în interiorul său și gata pentru ceea ce urmează: căutarea contururilor (și a centrelor sale). Există resurse în OpenCV pentru a detecta automat contururile, dar conturile detectate trebuie alese cu înțelepciune (pentru a alege doar obiectul sau obiectele reale). Deci, criteriul de detectare a contururilor este aria obiectului, măsurată în pixeli². Dacă un contur are o suprafață mai mare decât o limită (configurat în software), trebuie să fie considerat un obiect real care trebuie numărat. Alegerea acestei limite / criterii de zonă este foarte importantă, iar o alegere proastă aici înseamnă numărări greșite. Trebuie să încercați unele valori ale limitelor valorii zonei și să verificați ce se potrivește mai bine utilizării dvs. Nu vă faceți griji, aceste limite nu sunt atât de greu de găsit / ajustat. Odată ce toate obiectele din imagine sunt alese, următorul pas este de a desena un retangle pe acesta (acest retangle trebuie să conțină un întreg obiect detectat în interiorul său). Și centrul acestui dreptunghi este … obiectul centroid! Poate vă gândiți „Care este treaba cu acest centroid?”, Nu? Iată răspunsul dvs.: nu contează cât de mare sau cum este forma obiectului, mișcarea acestuia este aceeași cu cea a centrului. Cu alte cuvinte: acest punct simplu numit centroid reprezintă toată mișcarea obiectului. Nu face contorizarea foarte simplă acum, nu-i așa? Vedeți imaginea de mai jos (figura 6), unde centroidul obiectului este reprezentat ca un punct negru.

Pasul 5: Mișcarea Centoridului și numărarea obiectelor

Marea finală: comparați coordonatele centrului obiectului cu coordonatele liniilor de intrare și ieșire și aplicați algoritmul de numărare descris anterior. Și va fi numărarea obiectelor în mișcare!

Așa cum se arată la începutul acestui post, iată proiectul în acțiune:

Recomandat: