Indholdsfortegnelse:
- Trin 1: Bliv dybere: Hvordan kan objektbevægelse registreres i en billedstrøm?
- Trin 2: Binærisering
- Trin 3: Fortynd
- Trin 4: Søgningen efter konturerne (og dens centroider)
- Trin 5: Centorids bevægelse og objekttælling
Video: Raspberry Pi Object Counting: 5 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Computersyn er uden tvivl en fantastisk ting! Ved hjælp af dette får en computer evnen til at "se" og fornemme miljøet omkring, hvad der gør det muligt at udvikle komplekse, nyttige og fede applikationer. Applikationer som ansigtsregistrering og genkendelse, objektsporing og genkendelse er mere og mere til stede i vores daglige aktiviteter takket være fremskridt inden for computersyn.
I betragtning af hvor avancerede og tilgængelige computervisionrammer og -værktøjer passer applikationen, der er beskrevet i denne artikel, godt: ved hjælp af en simpel Raspberry PI og en omkostningsfri og open-source computer vision-ramme kaldet OpenCV til at tælle objekter i bevægelse, mere præcist hvor meget genstande går ind og ud af en bestemt overvåget zone.
Trin 1: Bliv dybere: Hvordan kan objektbevægelse registreres i en billedstrøm?
Nu er det tid til at blive dybere i billedbehandlingsmateriale:
hvordan man får nogle webcam stream -billeder og opdager, at noget er flyttet dertil
Det består af fem trin:
Trin 1: For at markere objektet i bevægelse
Som defineret i klassisk fysik er en reference nødvendig for at se, at noget bevæger sig, eller hvis det står stille. Her for at afgøre, om noget er flyttet, er det stort set det samme: hver enkelt webcam -stream fanget ramme vil blive sammenlignet med en referenceramme. Hvis noget er anderledes, er noget blevet flyttet. Det er simpelt, som det lyder.
Denne referenceramme skal optages under de mest perfekte forhold (intet bevæger sig f.eks.). I billedbehandlingsverdenen består denne sammenligning mellem en fanget ramme og en referenceramme i en teknik, der kaldes baggrundsubtraktion. Baggrundsubtration består i, at bogstaveligt talt trækker pixel-til-pixel farveinformation fra den fangede ramme og referencerammen. Så det resulterende billede fra denne proces vil kun fremhæve / vise med flere detaljer, hvad der er forskelligt mellem disse to rammer (eller, hvad der har flyttet / fik bevægelse) og alt andet vil være sort i billedet (farven på nulværdi på en grå -skala pixel). Vigtigt: belysningsforholdene og kvaliteten af det webcam -billede, der er taget (på grund af kvaliteten af capture -sensorer), kan variere lidt fra ramme til billede. Det indebærer, at de "lige dele" fra referenceramme og andre rammer ikke vil være totalt sorte efter baggrundssubtraktion. På trods af denne adfærd er der ingen alvorlige konsekvenser i de næste trin billedbehandling i dette projekt.
For at minimere billedbehandlingstiden, før en baggrundsubtration foretages, konverteres fanget ramme og referenceramme til et gråtonebillede. Men hvorfor? Det er et computereffektivitetsproblem: et billede, der præsenterer flere farver (farvebillede), har tre oplysninger pr. Pixel: Rød, blå og grøn farvekomponenter (den gamle, men guld RGB -standard). Så matematisk kan hver pixel defineres som et array med tre værdier, som hver repræsenterer en farvekomponent. Derfor udvides det til hele billedet, og det endelige billede vil faktisk være en blanding af tre billedkomponenter: Røde, blå og grønne billedkomponenter.
For at behandle det kræves der meget arbejde! Men i gråtonebilleder har hver pixel kun én farveinformation. Så behandlingen af et farvebillede er tre gange langsommere end i gråskalebilleder (mindst tre gange, afhængigt af hvilken teknik der er involveret). Og der er mere: til nogle formål (som dette projekt) er alle farver ikke nødvendige eller vigtige overhovedet. Derfor kom vi til konklusionen: Brug af gråtonebilleder anbefales stærkt til billedbehandlingsformål. Efter subtration i baggrunden er det nødvendigt at anvende Gaussian Blur -filter.
Filteret Gaussian Blur, der anvendes over et substraheret baggrundsbillede, udglatter alle konturer af det bevægede detekterede objekt. Det vil helt sikkert være en hjælp i de næste trin i billedbehandling.
Trin 2: Binærisering
I de fleste tilfælde af billedbehandling er binarisering næsten et obligatorisk trin efter fremhævning af objekter / karakteristika i et billede. Årsag: i et binært billede kan hver pixelfarve kun antage to værdier: 0x00 (sort) eller 0xFF (hvid). Dette hjælper meget på billedbehandlingen for at kræve endnu mindre "computerkraft" til at anvende billedbehandlingsteknikker i de næste trin. Binarisering kan udføres ved at sammenligne hver pixelfarve i gråtonebilledet med en bestemt tærskel. Hvis værdien af pixelfarven er større end tærsklen, antager denne pixelfarve hvid værdi (0xFF), og hvis værdien af pixelfarven er lavere end tærsklen, vil denne pixelfarve antage sort værdi (0x00). Desværre er tærskelværdiens valg ikke så let at foretage. Det afhænger af miljøfaktorer, såsom lysforhold. Et forkert valg af en tærskelværdi kan ødelægge alle trin yderligere. Så jeg anbefaler på det kraftigste, at du manuelt justerer en tærskel i projektet for din sag inden yderligere handlinger. Denne tærskelværdi skal sikre, at det bevægelige objekt vises i binært billede. I mit tilfælde resulterer det, efter en tærskel er tilstrækkeligt valg, i det, du ser i figur 5.
Figur 5 - binært billede
Trin 3: Fortynd
Indtil nu var det muligt at opdage bevægelige objekter, fremhæve dem og anvende binærisering, hvilket resulterer i et ret klart billede af objekt i bevægelse (= temmelig klart billede af objektet til billedbehandlingsformål). Forberedelsen til objekttælling er NÆSTEN udført. "NÆSTEN" her betyder, at der er nogle fine justeringer, der skal foretages, inden vi går videre. På dette tidspunkt er der reelle chancer for tilstedeværelse af "huller" i objekterne (sorte masser af pixels i det hvide fremhævede objekt). Disse huller kan være alt fra særlige lysforhold til en del af objektformen. Når huller først kan "producere" falske genstande inde i virkelige objekter (afhængigt af hvor store og hvor de er placeret), kan konsekvenserne af hullers tilstedeværelse i et billede være katastrofale for objekternes optælling. En måde at fjerne disse huller på er ved hjælp af en billedbehandlingsteknik kaldet Dilate. Brug dette, og huller forsvinder.
Trin 4: Søgningen efter konturerne (og dens centroider)
På dette tidspunkt har vi de fremhævede objekter, ingen huller inde i det og klar til det næste: søgningen efter konturerne (og dens centroider). Der er ressourcer i OpenCV til automatisk at registrere konturer, men de registrerede målinger skal vælges klogt (kun for at vælge det eller de rigtige objekter). Så kriterierne for at detektere konturerne er objektets areal målt i pixels². Hvis en kontur har et højere område end en grænse (konfigureret i software), skal den betragtes som et reelt objekt, der skal tælles. Valget af denne områdegrænse/kriterier er meget vigtigt, og et dårligt valg betyder her forkerte optællinger. Du skal prøve nogle værdier for grænseværdier for områdeværdi og kontrollere, hvad der passer bedre til din brug. Bare rolig, disse grænser er ikke så svære at finde / justere. Når alle objekterne i billedet er valgt, er det næste trin at tegne et retangle på det (dette retangle skal indeholde et helt registreret objekt inde i det). Og midten af dette rektangel er…. objektet centroid! Du tænker måske "Hvad er den store ting med denne centroid?", Ikke? Her er dit svar: uanset hvor stor eller hvordan formen på objektet er, er dens bevægelse den samme som centroid. Med andre ord: dette enkle punkt kaldet centroid repræsenterer al objektets bevægelse. Det gør tællingen meget enkel nu, ikke sandt? Se billedet herunder (figur 6), hvor objektets centroid er repræsenteret som et sort punkt.
Trin 5: Centorids bevægelse og objekttælling
Den store finale: sammenlign objektets centroid -koordinater med indgangs- og udgangslinjekoordinater og anvend tællalgoritmen beskrevet før. Og der bliver talt med objekter i bevægelse!
Slutresultat Som vist i begyndelsen af dette indlæg er her projektet i aktion:
Anbefalede:
Pixy2Bot Object Follower (Servokode): 4 trin
Pixy2Bot Object Follower (Servokode): Bygger en simpel genstand efter robot (ingen pan/tilt -mekanisme) med et Arduino Uno + motorskærm, to billige kontinuerlige servoer og en Pixy2. Video: https://youtu.be/lxBLt5DJ5BM
Opencv Object Tracking: 3 trin
Opencv Object Tracking: Detektering af bevægelige objekter er en teknik, der bruges til computersyn og billedbehandling. Flere på hinanden følgende rammer fra en video sammenlignes med forskellige metoder for at afgøre, om et objekt i bevægelse detekteres. Registrering af bevægelige objekter er blevet brugt til wi
Raspberry Pi Object Detection: 7 trin
Raspberry Pi Object Detection: Denne vejledning giver trin-for-trin instruktioner til, hvordan du konfigurerer TensorFlows Object Detection API på Raspberry Pi. Ved at følge trinene i denne vejledning kan du bruge din Raspberry Pi til at udføre objektdetektering på livevideo fra en P
Raspberry Pi - Autonom Mars Rover Med OpenCV Object Tracking: 7 trin (med billeder)
Raspberry Pi - Autonom Mars Rover Med OpenCV Object Tracking: Drevet af en Raspberry Pi 3, Open CV objektgenkendelse, Ultrasonic sensorer og gearede DC motorer. Denne rover kan spore ethvert objekt, den er trænet til, og bevæge sig på ethvert terræn
Arduino Counting Timer til meddelelse: 5 trin
Arduino Counting Timer for Announcement: Dette er en nedtællingstimer, der gør ved hjælp af Arduino UNO og LCD -skærm. Grunden til, at jeg lavede dette projekt, fordi vi i vores skole (KCIS) skal reservere frokost hver onsdag kl. 21:30 online. Den mest berømte og den mad, der er i g