Innehållsförteckning:
- Steg 1: Att bli djupare: Hur kan objektrörelse detekteras i en bildström?
- Steg 2: Binärisering
- Steg 3: Späd ut
- Steg 4: Sökningen efter konturerna (och dess centroider)
- Steg 5: Centorids rörelse och objekträkning
Video: Raspberry Pi -objekträkning: 5 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:45
Datorsyn är utan tvekan en fantastisk grej! Med hjälp av detta får en dator förmågan att "se" och avkänna omgivningen bättre, vilket möjliggör utveckling av komplexa, användbara och coola applikationer. Applikationer som ansiktsdetektering och igenkänning, spårning av objekt och objektdetektering är mer och mer närvarande i våra dagliga aktiviteter, tack vare framsteg i datorsyn.
Med tanke på hur avancerade och tillgängliga är datorsynsramar och verktyg passar applikationen som beskrivs i den här artikeln bra: med en enkel Raspberry PI och en kostnadsfri och öppen källkod för datorsyn kallad OpenCV för att räkna objekt i rörelse, mer exakt hur mycket objekt går in och ut ur en viss övervakad zon.
Steg 1: Att bli djupare: Hur kan objektrörelse detekteras i en bildström?
Nu är det dags att bli djupare i bildbehandlingssaker:
hur man får några webbkameraströmbilder och upptäcker att något har flyttat dit
Den består av fem steg:
Steg 1: För att markera objektet i rörelse
Enligt definitionen i klassisk fysik är en referens nödvändig för att se att något rör sig eller om det står stilla. Här, för att avgöra om något har flyttat, är det ungefär detsamma: varje enskild webbkameraström fångas ram jämförs med en referensram. Om något är annorlunda har något flyttats. Det är enkelt som det låter.
Denna referensram måste fångas in under de mest perfekta förhållandena (inget rör sig, till exempel). I bildbehandlingsvärlden består denna jämförelse mellan en fångad ram och en referensram i en teknik som kallas bakgrundssubtraktion. Bakgrundsubtration består i att bokstavligen subtrahera pixel-till-pixel-färginformation från den fångade ramen och referensramen. Så den resulterande bilden från denna process kommer bara att markera / visa med mer detaljer bara vad som är annorlunda mellan dessa två ramar (eller, vad som har flyttat / fått rörelse) och allt annat kommer att vara svart i bilden (färgen på nollvärde på en grå -skala pixel). Viktigt: belysningsförhållandena och kvaliteten på webbkamerabilden som tas (på grund av kvaliteten på fångssensorerna) kan variera något från bild till bild. Det innebär att "lika delar" från referensramen och andra ramar inte kommer att vara totalt svarta efter bakgrundssubtraktion. Trots detta beteende finns det inga allvarliga konsekvenser i nästa steg bildbehandling i detta projekt.
För att minimera bildbehandlingstiden, innan du gör en bakgrundssubtration, konverteras den tagna ramen och referensramen till en gråskalebild. Men varför? Det är ett datoreffektivitetsproblem: en bild som presenterar flera färger (färgbild) har tre informationer per pixel: Röd, blå och grön färgkomponenter (den gamla men guld RGB -standarden). Så matematiskt kan varje pixel definieras som en matris med tre värden, var och en representerar en färgkomponent. Därför kommer den slutliga bilden i själva verket att vara en blandning av tre bildkomponenter: röda, blå och gröna bildkomponenter.
För att bearbeta det krävs mycket arbete! Men i gråskalebilder har varje pixel bara en färginformation. Så bearbetningen av en färgbild är tre gånger långsammare än i gråskalebilder (minst tre gånger, beroende på vilken teknik det handlar om). Och det finns mer: för vissa ändamål (som detta projekt), bearbeta alla färger är inte nödvändigt eller viktigt alls. Därför kom vi till slutsatsen: användning av gråskalebilder rekommenderas starkt för bildbehandlingsändamål. Efter bakgrundssubtration är det nödvändigt att applicera Gaussian Blur -filter.
Det Gaussiska oskärpa -filtret som appliceras över den subtraherade bilden i bakgrunden jämnar ut alla konturer av det rörliga detekterade objektet. Visst kommer det att vara till hjälp i nästa steg i bildbehandling.
Steg 2: Binärisering
I de flesta fall av bildbehandling är binärisering nästan ett obligatoriskt steg efter markering av objekt / karaktäristik i en bild. Orsak: i en binär bild kan varje pixelfärg anta endast två värden: 0x00 (svart) eller 0xFF (vit). Detta hjälper mycket bildbehandlingen för att kräva ännu mindre "datorkraft" för att tillämpa bildbehandlingsteknik i nästa steg. Binärisering kan göras genom att jämföra varje pixelfärg i gråskalebilden med ett visst tröskelvärde. Om värdet på pixelfärgen är större än tröskeln, kommer denna pixelfärg att anta vitt värde (0xFF), och om värdet på pixelfärgen är lägre än tröskeln, kommer denna pixelfärg att anta svart värde (0x00). Tyvärr är tröskelvärdes val inte så lätt att göra. Det beror på miljöfaktorer, till exempel ljusförhållanden. Ett felaktigt val av ett tröskelvärde kan förstöra alla steg ytterligare. Så jag rekommenderar starkt att du manuellt justerar en tröskel i projektet för ditt ärende innan du gör ytterligare åtgärder. Detta tröskelvärde måste säkerställa att det rörliga objektet visas i binär bild. I mitt fall, efter ett tröskelns tillräckliga val, resulterar det i det du ser i figur 5.
Figur 5 - binär bild
Steg 3: Späd ut
Fram till nu var det möjligt att upptäcka rörliga objekt, markera dem och tillämpa binärisering, vilket resulterar i en ganska klar bild av rörligt objekt (= ganska klar bild av objektet för bildbehandlingsändamål). Förberedelsen för objekträkning är NÄSTAN klar. "NÄSTAN" här betyder att det finns några fina justeringar att göra innan vi går vidare. Vid denna tidpunkt finns det verkliga chanser att det finns "hål" i föremålen (svarta massor av pixlar i det vita markerade objektet). Dessa hål kan vara vad som helst, från särskilda ljusförhållanden till någon del av objektets form. När hål kan "producera" falska föremål inuti verkliga föremål (beroende på hur stora och var de är placerade) kan konsekvenserna av håls närvaro i en bild vara katastrofala för objekts räkning. Ett sätt att eliminera dessa hål är att använda en bildbehandlingsteknik som kallas Dilate. Använd detta och hål försvinner.
Steg 4: Sökningen efter konturerna (och dess centroider)
Vid denna tidpunkt har vi de markerade objekten, inga hål inuti och redo för vad som är nästa: sökningen efter konturerna (och dess centroider). Det finns resurser i OpenCV för att upptäcka konturer automatiskt, men de upptäckta räknarna måste väljas klokt (för att bara välja det eller de riktiga föremålen). Så kriterierna för att detektera konturerna är objektets yta, mätt i pixlar². Om en kontur har en högre yta än en gräns (konfigurerad i programvara), så måste den betraktas som ett verkligt objekt som ska räknas. Valet av denna områdegräns/kriterier är mycket viktigt, och ett dåligt val här betyder felräkningar. Du måste prova några gränsvärden för områdevärden och kontrollera vad som passar bättre för din användning. Oroa dig inte, dessa gränser är inte så svåra att hitta / justera. När alla objekt i bilden är plockade är nästa steg att rita en retangle på den (denna retangle måste innehålla ett helt upptäckt objekt inuti den). Och mitten av denna rektangel är…. objektet centroid! Du kanske tänker "Vad är grejen med denna centroid?", Eller hur? Här är ditt svar: spelar ingen roll hur stor eller hur formen på objektet är, dess rörelse är densamma som centroiden. Med andra ord: denna enkla punkt som kallas centroid representerar all rörelse av objektet. Det gör räkningen väldigt enkel nu, eller hur? Se bilden nedan (figur 6), där objektets centroid representeras som en svart punkt.
Steg 5: Centorids rörelse och objekträkning
Den stora finalen: jämför objekts centroidkoordinater med koordinater för in- och utgångslinjer och tillämp räkningsalgoritmen som beskrivits tidigare. Och det kommer att räkna på föremål i rörelse!
Slutresultat Som visas i början av detta inlägg, här är projektet i aktion:
Rekommenderad:
Arduino Car Reverse Parking Alert System - Steg för steg: 4 steg
Arduino Car Reverse Parking Alert System | Steg för steg: I det här projektet kommer jag att utforma en enkel Arduino Car Reverse Parking Sensor Circuit med Arduino UNO och HC-SR04 Ultrasonic Sensor. Detta Arduino -baserade bilomvändningsvarningssystem kan användas för autonom navigering, robotavstånd och andra
Steg för steg PC -byggnad: 9 steg
Steg för steg PC -byggnad: Tillbehör: Hårdvara: ModerkortCPU & CPU -kylarePSU (strömförsörjningsenhet) Lagring (HDD/SSD) RAMGPU (krävs inte) CaseTools: Skruvmejsel ESD -armband/mathermisk pasta med applikator
Tre högtalarkretsar -- Steg-för-steg handledning: 3 steg
Tre högtalarkretsar || Steg-för-steg-handledning: Högtalarkretsen förstärker ljudsignalerna som tas emot från miljön till MIC och skickar den till högtalaren varifrån förstärkt ljud produceras. Här visar jag dig tre olika sätt att göra denna högtalarkrets med:
Akustisk levitation med Arduino Uno Steg-för-steg (8-steg): 8 steg
Akustisk levitation med Arduino Uno Steg-för-steg (8-steg): ultraljudsgivare L298N Dc kvinnlig adapter strömförsörjning med en manlig DC-pin Arduino UNOBreadboardHur det fungerar: Först laddar du upp kod till Arduino Uno (det är en mikrokontroller utrustad med digital och analoga portar för att konvertera kod (C ++)
Installera Raspbian i Raspberry Pi 3 B Utan HDMI - Komma igång med Raspberry Pi 3B - Konfigurera din Raspberry Pi 3: 6 -steg
Installera Raspbian i Raspberry Pi 3 B Utan HDMI | Komma igång med Raspberry Pi 3B | Konfigurera din Raspberry Pi 3: Som några av er vet är Raspberry Pi-datorer ganska fantastiska och du kan få hela datorn bara på ett enda litet kort. Raspberry Pi 3 Model B har en fyrkärnig 64-bitars ARM Cortex A53 klockade på 1,2 GHz. Detta ger Pi 3 ungefär 50