Inhoudsopgave:

Raspberry Pi-objecten tellen: 5 stappen
Raspberry Pi-objecten tellen: 5 stappen

Video: Raspberry Pi-objecten tellen: 5 stappen

Video: Raspberry Pi-objecten tellen: 5 stappen
Video: Raspberry Pi 5 Einstieg: Das brauchst du wirklich, um los zu legen! 2024, November
Anonim
Raspberry Pi-objecten tellen
Raspberry Pi-objecten tellen

Computervisie is ongetwijfeld iets fantastisch! Door dit te gebruiken, krijgt een computer het vermogen om de omgeving beter te "zien" en te voelen, wat de ontwikkeling van complexe, nuttige en coole applicaties mogelijk maakt. Toepassingen zoals gezichtsdetectie en -herkenning, objecttracking en objectdetectie zijn dankzij de vooruitgang op het gebied van computervisie steeds meer aanwezig in onze dagelijkse activiteiten.

Gezien hoe geavanceerd en toegankelijk zijn computer vision frameworks en tools, past de toepassing die in dit artikel wordt beschreven goed: een eenvoudige Raspberry PI en een gratis en open source computer vision framework genaamd OpenCV gebruiken om bewegende objecten te tellen, meer bepaald hoeveel objecten gaan in en uit een bepaalde bewaakte zone.

Stap 1: Dieper worden: hoe kan objectbeweging worden gedetecteerd in een beeldstroom?

Dieper worden: hoe kan objectbeweging worden gedetecteerd in een beeldstroom?
Dieper worden: hoe kan objectbeweging worden gedetecteerd in een beeldstroom?

Nu is het tijd om dieper in te gaan op beeldverwerkingsdingen:

hoe je webcamstream-afbeeldingen kunt krijgen en kunt detecteren dat daar iets is verplaatst

Het bestaat uit vijf stappen:

Stap 1: Om het object in beweging te markeren

Zoals gedefinieerd in de klassieke natuurkunde, is een referentie nodig om te concluderen dat iets beweegt of stilstaat. Hier, om te bepalen of er iets is verplaatst, is het vrijwel hetzelfde: elk opgenomen frame van de webcamstream wordt vergeleken met een referentieframe. Als er iets anders is, is er iets verplaatst. Het is zo simpel als het klinkt.

Dit referentiekader moet in de meest perfecte omstandigheden worden vastgelegd (niets bewegend bijvoorbeeld). In de wereld van de beeldverwerking bestaat deze vergelijking tussen een vastgelegd frame en een referentieframe uit een techniek die achtergrondaftrekking wordt genoemd. Achtergrondsubtratie bestaat uit het letterlijk aftrekken van pixel-naar-pixel kleurinformatie van het vastgelegde frame en het referentieframe. Het resulterende beeld van dit proces zal dus alleen accentueren / tonen met meer details wat er anders is tussen deze twee frames (of wat er is verplaatst/bewogen) en al het andere zal zwart zijn in beeld (de kleur van nulwaarde op een grijze -schaalpixel). Belangrijk: lichtomstandigheden en kwaliteit van de opgenomen webcambeelden (vanwege de kwaliteit van de opnamesensoren) kunnen enigszins variëren van frame tot frame. Het houdt in dat de "gelijke delen" van het referentieframe en een ander frame niet helemaal zwart zullen zijn na het aftrekken van de achtergrond. Ondanks dit gedrag zijn er geen ernstige gevolgen in de volgende stappen beeldverwerking in dit project.

Om de beeldverwerkingstijd tot een minimum te beperken, worden het vastgelegde frame en referentieframe, voordat een achtergrondsubtratie wordt uitgevoerd, geconverteerd naar een grijsschaalafbeelding. Maar waarom? Het is een kwestie van computerefficiëntie: een afbeelding met meerdere kleuren (kleurenafbeelding) heeft drie informatie per pixel: rode, blauwe en groene kleurcomponenten (de oude maar gouden RGB-standaard). Dus, materieel gezien, kan elke pixel worden gedefinieerd als een array met drie waarden, waarbij elke pixel een kleurcomponent vertegenwoordigt. Als je het daarom uitbreidt tot het hele beeld, zal het uiteindelijke beeld in feite de mix zijn van drie beeldcomponenten: rode, blauwe en groene beeldcomponenten.

Om het te verwerken, is veel werk vereist! In grijswaardenafbeeldingen heeft elke pixel echter slechts één kleurinformatie. De verwerking van een kleurenafbeelding is dus drie keer langzamer dan in het geval van een grijsschaalafbeelding (minstens drie keer, afhankelijk van welke techniek het is). En er is meer: voor sommige doeleinden (zoals dit project) is het verwerken van alle kleuren helemaal niet nodig of belangrijk. Daarom kwamen we tot de conclusie: het gebruik van grijswaardenafbeeldingen wordt ten zeerste aanbevolen voor beeldverwerkingsdoeleinden. Na achtergrondsubtratie is het noodzakelijk om het filter Gaussiaans vervagen toe te passen.

Het filter Gaussiaans vervagen dat wordt toegepast op een afbeelding met afgetrokken achtergrond, verzacht alle contouren van het bewegende gedetecteerde object. Het zal zeker helpen bij de volgende stappen van beeldverwerking.

Stap 2: Binarisatie

Binarisatie
Binarisatie

In de meeste gevallen van beeldverwerking is binarisatie bijna een verplichte stap na het markeren van objecten / kenmerken in een afbeelding. Reden: in een binaire afbeelding kan elke pixelkleur slechts twee waarden aannemen: 0x00 (zwart) of 0xFF (wit). Dit helpt enorm bij de beeldverwerking, zodat er in de volgende stappen nog minder "rekenkracht" nodig is om beeldverwerkingstechnieken toe te passen. Binarisatie kan worden gedaan door elke pixelkleur van het grijsschaalbeeld te vergelijken met een bepaalde drempel. Als de waarde van de pixelkleur groter is dan de drempelwaarde, zal deze pixelkleur de witwaarde aannemen (0xFF), en als de waarde van de pixelkleur lager is dan de drempelwaarde, zal deze pixelkleur de zwartwaarde aannemen (0x00). Helaas is de keuze van de drempelwaarde niet zo eenvoudig te maken. Het hangt af van omgevingsfactoren, zoals lichtomstandigheden. Een verkeerde keuze van een drempelwaarde kan alle stappen verder verpesten. Ik raad u dus ten zeerste aan om handmatig een drempel in het project voor uw geval aan te passen voordat u verdere acties uitvoert. Deze drempelwaarde moet ervoor zorgen dat het bewegende object in binair beeld wordt weergegeven. In mijn geval resulteert, na een adequate keuze van een drempel, in wat je ziet in figuur 5.

Afbeelding 5 - binaire afbeelding

Stap 3: Verwijden

Tot nu toe was het mogelijk om bewegende objecten te detecteren, te markeren en binarisatie toe te passen, wat resulteert in een vrij duidelijk beeld van bewegend object (=vrij duidelijk beeld van het object voor beeldverwerkingsdoeleinden). De voorbereiding voor het tellen van objecten is BIJNA klaar. De "BIJNA" hier betekent dat er enkele fijne aanpassingen moeten worden gemaakt voordat je verder gaat. Op dit punt is er een reële kans op de aanwezigheid van "gaten" in de objecten (zwarte massa's pixels in het wit gemarkeerde object). Deze gaten kunnen van alles zijn, van bepaalde lichtomstandigheden tot een deel van de objectvorm. Zodra gaten valse objecten kunnen "produceren" in echte objecten (afhankelijk van hoe groot en waar ze zich bevinden), kunnen de gevolgen van de aanwezigheid van gaten in een afbeelding catastrofaal zijn voor het tellen van objecten. Een manier om deze gaten te elimineren is het gebruik van een beeldverwerkingstechniek genaamd Dilate. Gebruik dit en de gaten verdwijnen.

Stap 4: De zoektocht naar de contouren (en de zwaartepunten)

De zoektocht naar de contouren (en de zwaartepunten ervan)
De zoektocht naar de contouren (en de zwaartepunten ervan)

Op dit punt hebben we de gemarkeerde objecten, geen gaten erin en klaar voor wat de toekomst biedt: het zoeken naar de contouren (en zijn zwaartepunten). Er zijn middelen in OpenCV om automatisch contouren te detecteren, maar de gedetecteerde contouren moeten verstandig worden gekozen (om alleen het echte object of de objecten te kiezen). Het criterium om de contouren te detecteren is dus de oppervlakte van het object, gemeten in pixels². Als een contour een groter oppervlak heeft dan een limiet (in software geconfigureerd), moet het worden beschouwd als een echt te tellen object. De keuze van deze oppervlaktelimiet/criteria is erg belangrijk, en een slechte keuze betekent hier verkeerde tellingen. U moet enkele grenswaarden voor oppervlaktewaarden proberen en controleren wat beter bij uw gebruik past. Geen zorgen, deze limiet is niet zo moeilijk te vinden/aan te passen. Zodra alle objecten in de afbeelding zijn gekozen, is de volgende stap om er een rechthoek op te tekenen (deze rechthoek moet een volledig gedetecteerd object erin bevatten). En het middelpunt van deze rechthoek is…. het zwaartepunt van het object! Je denkt misschien "Wat is het probleem met dit zwaartepunt?", toch? Hier is je antwoord: het maakt niet uit hoe groot of hoe de vorm van het object is, de beweging is hetzelfde als het zwaartepunt. Met andere woorden: dit eenvoudige punt genaamd zwaartepunt vertegenwoordigt alle beweging van het object. Het maakt het tellen nu heel eenvoudig, nietwaar? Zie de afbeelding hieronder (figuur 6), waar het zwaartepunt van het object wordt weergegeven als een zwart punt.

Stap 5: Centorid's beweging en objecttelling

De grote finale: vergelijk de zwaartepuntcoördinaten van het object met de coördinaten van de ingangs- en uitgangslijnen en pas het eerder beschreven telalgoritme toe. En er zullen bewegende objecten worden geteld!

Eindresultaat Zoals aan het begin van dit bericht te zien is, is hier het project in actie:

Aanbevolen: