Innholdsfortegnelse:

Raspberry Pi Object Counting: 5 trinn
Raspberry Pi Object Counting: 5 trinn

Video: Raspberry Pi Object Counting: 5 trinn

Video: Raspberry Pi Object Counting: 5 trinn
Video: Top 10 Foods To Detox Your Kidneys 2024, November
Anonim
Raspberry Pi Object Counting
Raspberry Pi Object Counting

Datasyn, uten tvil, er en fantastisk ting! Ved å bruke dette får en datamaskin muligheten til å "se" og oppdage miljøet rundt, noe som gjør det mulig å utvikle komplekse, nyttige og kule applikasjoner. Applikasjoner som ansiktsgjenkjenning og gjenkjenning, objektsporing og gjenkjenning av gjenstander er mer og mer til stede i våre daglige aktiviteter, takket være fremskritt i datasyn.

Med tanke på hvor avanserte og tilgjengelige er datavisningsrammer og -verktøy, passer applikasjonen beskrevet i denne artikkelen godt: ved hjelp av en enkel Raspberry PI og et kostnadsfritt og åpent datavisningsramme kalt OpenCV for å telle objekter i bevegelse, mer presist hvor mye objekter går inn og ut av en bestemt overvåket sone.

Trinn 1: Bli dypere: Hvordan kan objektbevegelse oppdages i en bildestrøm?

Bli dypere: Hvordan kan objektbevegelse oppdages i en bildestrøm?
Bli dypere: Hvordan kan objektbevegelse oppdages i en bildestrøm?

Nå er det på tide å bli dypere i bildebehandlingsmateriell:

hvordan du får noen webcam stream -bilder og oppdager at noe har flyttet dit

Den består av fem trinn:

Trinn 1: For å markere objektet i bevegelse

Som definert i klassisk fysikk, er det nødvendig med en referanse for å se at noe beveger seg eller om det står stille. Her, for å avgjøre om noe har beveget seg, er det stort sett det samme: hver eneste webcam stream -fanget ramme vil bli sammenlignet med en referanseramme. Hvis noe er annerledes, har noe blitt flyttet. Det er enkelt som det høres ut.

Denne referanserammen må fanges opp under de mest perfekte forholdene (ingenting beveger seg, for eksempel). I bildebehandlingsverdenen består denne sammenligningen mellom en fanget ramme og en referanseramme i en teknikk som kalles bakgrunnssubtraksjon. Bakgrunnssubtrasjon består av å trekke bokstavelig talt farge-til-piksel fargeinformasjon fra den fangede rammen og referanserammen. Så det resulterende bildet fra denne prosessen vil bare markere / vise med flere detaljer hva som er forskjellig mellom disse to bildene (eller det som har flyttet / fått bevegelse) og alt annet vil være svart i bildet (fargen på nullverdi på en grå -skala piksel). Viktig: belysningsforholdene og kvaliteten på webkameraet som er tatt (på grunn av kvaliteten på opptakssensorene) kan variere noe fra ramme til bilde. Det innebærer at de "like delene" fra referanserammen og andre rammer ikke vil være totalt svarte etter bakgrunnssubtraksjon. Til tross for denne oppførselen er det ingen alvorlige konsekvenser i de neste trinnene bildebehandling i dette prosjektet.

For å minimere bildebehandlingstiden, før du foretar en bakgrunnssubtrasjon, blir fanget ramme og referanseramme konvertert til et gråtonebilde. Men hvorfor? Det er et problem med databehandlingseffektivitet: et bilde som viser flere farger (fargebilde) har tre informasjoner per piksel: Røde, blå og grønne fargekomponenter (den gamle, men gull RGB -standarden). Så matematisk kan hver piksel defineres som en matris med tre verdier, hver representerer en fargekomponent. Derfor, ved å utvide det til hele bildet, vil det endelige bildet faktisk være en blanding av tre bildekomponenter: Røde, blå og grønne bildekomponenter.

For å behandle det, kreves det mye arbeid! I bilder i gråskala har imidlertid hver piksel bare én fargeinformasjon. Så behandlingen av et fargebilde er tre ganger tregere enn i gråskala bildesign (minst tre ganger, avhengig av hvilken teknikk det er snakk om). Og det er mer: for noen formål (som dette prosjektet) er alle fargene ikke nødvendige eller viktige i det hele tatt. Derfor kom vi til konklusjonen: bruk av gråtonebilder anbefales på det sterkeste for bildebehandlingsformål. Etter subtrasjon i bakgrunnen er det nødvendig å bruke Gaussian Blur -filter.

Filteret Gaussian Blur som brukes på et subtrahert bakgrunnsbilde, jevner ut alle konturene av objektet i bevegelse. Sikkert, det vil være nyttig i de neste trinnene i bildebehandling.

Trinn 2: Binærisering

Binærisering
Binærisering

I de fleste tilfeller av bildebehandling er binarisering nesten et obligatorisk trinn etter høydepunktobjekter / karakteristikker i et bilde. Grunn: i et binært bilde kan hver pikselfarge bare ha to verdier: 0x00 (svart) eller 0xFF (hvit). Dette hjelper mye på bildebehandlingen for å kreve enda mindre "datakraft" for å bruke bildebehandlingsteknikker i de neste trinnene. Binærisering kan utføres ved å sammenligne hver pikselfarge i gråskala-bildet med en viss terskel. Hvis verdien av pikselfargen er større enn terskelen, vil denne pikselfargen anta hvit verdi (0xFF), og hvis verdien på pikselfargen er lavere enn terskelen, vil denne pikselfargen anta svart verdi (0x00). Dessverre er terskelverdiens valg ikke så lett å gjøre. Det avhenger av miljøfaktorer, for eksempel lysforhold. Et feil valg av en terskelverdi kan ødelegge alle trinnene ytterligere. Så jeg anbefaler på det sterkeste at du manuelt justerer en terskel i prosjektet for saken din før ytterligere handlinger. Denne terskelverdien må sikre at objektet i bevegelse vises i binært bilde. I mitt tilfelle, etter at en terskel er tilstrekkelig valg, resulterer det i det du ser i figur 5.

Figur 5 - binært bilde

Trinn 3: Dilater

Inntil nå var det mulig å oppdage objekter i bevegelse, markere dem og bruke binærisering, noe som resulterer i et ganske klart bilde av objekt i bevegelse (= ganske klart bilde av objektet for bildebehandlingsformål). Forberedelsene til objekttelling er Nesten gjort. "Nesten" her betyr at det er noen fine justeringer å gjøre før du går videre. På dette tidspunktet er det reelle sjanser for tilstedeværelse av "hull" i objektene (svarte masser av piksler inn i det hvite uthevede objektet). Disse hullene kan være alt, fra spesielle lysforhold til en del av objektformen. Når hull kan "produsere" falske objekter inne i virkelige objekter (avhengig av hvor store og hvor de befinner seg), kan konsekvensene av hulls tilstedeværelse i et bilde være katastrofale for gjenstandenes telling. En måte å eliminere disse hullene på er å bruke en bildebehandlingsteknikk kalt Dilate. Bruk dette og hullene forsvinner.

Trinn 4: Søket etter konturene (og dets sentroider)

Søket etter konturene (og dets sentroider)
Søket etter konturene (og dets sentroider)

På dette tidspunktet har vi de fremhevede objektene, ingen hull inne i det og klare for det neste: søket etter konturene (og dets sentroider). Det er ressurser i OpenCV for å oppdage konturer automatisk, men de oppdagede tallene må velges med omhu (kun for å velge det eller de virkelige objektene). Så kriteriene for å oppdage konturene er objektets område, målt i piksler². Hvis en kontur har et høyere område enn en grense (konfigurert i programvare), må den betraktes som et ekte objekt som skal telles. Valget av denne områdegrensen/kriteriene er veldig viktig, og et dårlig valg betyr her feil tellinger. Du må prøve noen grenseverdier for områdeverdier og sjekke hva som passer bedre til din bruk. Ikke bekymre deg, denne grensen er ikke så vanskelig å finne / justere. Når alle objektene i bildet er plukket ut, er neste trinn å tegne et retangle på det (dette retangelet må inneholde et helt oppdaget objekt inne i det). Og midten av dette rektangelet er…. objektet sentroid! Du tenker kanskje "Hva er greia med denne sentroiden?", Ikke sant? Her er svaret ditt: uansett hvor stor eller hvordan formen på objektet er, er bevegelsen den samme som sentroiden. Med andre ord: dette enkle punktet kalt sentroid representerer all bevegelse av objektet. Det gjør tellingen veldig enkel nå, ikke sant? Se bildet nedenfor (figur 6), der objektets sentroid er representert som et svart punkt.

Trinn 5: Centorids bevegelse og objekttelling

Den store finalen: sammenligne objekts sentroidkoordinater med inngangs- og utgangslinjekoordinater og bruk tellealgoritmen beskrevet tidligere. Og det blir telling av objekter i bevegelse!

Sluttresultat Som vist helt i begynnelsen av dette innlegget, er prosjektet i aksjon:

Anbefalt: