Sisällysluettelo:

Raspberry Pi -objektien laskenta: 5 vaihetta
Raspberry Pi -objektien laskenta: 5 vaihetta

Video: Raspberry Pi -objektien laskenta: 5 vaihetta

Video: Raspberry Pi -objektien laskenta: 5 vaihetta
Video: НЕ ВЗДУМАЙ снимать аккумулятор с машины. Делай это ПРАВИЛЬНО ! 2024, Heinäkuu
Anonim
Raspberry Pi -objektien laskenta
Raspberry Pi -objektien laskenta

Tietokonenäkö on epäilemättä fantastinen asia! Tämän avulla tietokone saa kyvyn "nähdä" ja tunnistaa paremmin ympäröivän ympäristön, mikä mahdollistaa monimutkaisten, hyödyllisten ja viileiden sovellusten kehittämisen. Sovellukset, kuten kasvojentunnistus ja tunnistaminen, esineiden seuranta ja esineiden tunnistus, ovat yhä enemmän läsnä päivittäisessä toiminnassamme tietokonenäkymän ansiosta.

Kun otetaan huomioon, kuinka kehittyneet ja helppokäyttöiset ovat tietokonenäkökehykset ja -työkalut, tässä artikkelissa kuvattu sovellus sopii hyvin: yksinkertaisen Raspberry PI: n ja maksuttoman ja avoimen lähdekoodin tietokonenäkökehyksen käyttäminen OpenCV: nä liikkuvien esineiden laskemiseen, tarkemmin esineet menevät tietylle valvotulle alueelle ja poistuvat siitä.

Vaihe 1: Syventäminen: Kuinka esineiden liike voidaan havaita kuvavirrassa?

Saaminen syvemmälle: Kuinka kohteen liike tunnistetaan kuvavirrassa?
Saaminen syvemmälle: Kuinka kohteen liike tunnistetaan kuvavirrassa?

Nyt on aika syventyä kuvankäsittelyyn:

kuinka saada verkkokameran stream -kuvia ja havaita, että jotain on siirtynyt sinne

Se koostuu viidestä vaiheesta:

Vaihe 1: Korosta liikkeessä oleva esine

Kuten klassisessa fysiikassa määritellään, viittaus on välttämätön havaitakseen, että jokin liikkuu tai seisoo paikallaan. Täällä sen määrittämiseksi, onko jotain muuttunut, se on melko sama: jokaista verkkokameran stream -kaapattua kehystä verrataan viitekehykseen. Jos jokin on toisin, jotain on siirretty. Se on yksinkertaista, miltä se kuulostaa.

Tämä vertailukehys on otettava täydellisimmissä olosuhteissa (esimerkiksi mikään ei liiku). Kuvankäsittelyn maailmassa tämä vertailu kaapatun kehyksen ja viitekehyksen välillä koostuu tekniikasta, jota kutsutaan taustavähennykseksi. Taustamääritys koostuu kirjaimellisesti vähentämällä pikselien välistä väritietoa kaapatusta kehyksestä ja viitekehyksestä. Joten tämän prosessin tuloksena oleva kuva korostaa / näyttää yksityiskohtaisemmin vain sen, mikä eroaa näiden kahden kehyksen välillä (tai mikä on siirtynyt / saanut liikkeen), ja kaikki muu on kuvassa mustaa (harmaalla nolla -arvon väri -skaalauspikseli). Tärkeää: valaistusolosuhteet ja otetun verkkokameran kuvan laatu (kuvausanturien laadun vuoksi) voivat vaihdella hieman kuvasta toiseen. Se tarkoittaa, että vertailukehyksen ja muiden kehysten "yhtä suuret osat" eivät ole täysin mustia taustan vähennyksen jälkeen. Tästä käyttäytymisestä huolimatta tämän projektin kuvankäsittelyssä ei ole vakavia seurauksia.

Kuvankäsittelyajan lyhentämiseksi kaapattu kehys ja vertailukehys muunnetaan harmaasävyiseksi kuvaksi ennen taustan subtratointia. Mutta miksi? Se on laskentatehokkuusongelma: kuvassa, jossa on useita värejä (värikuva), on kolme tietoa kuvapistettä kohti: punainen, sininen ja vihreä värikomponentit (vanha mutta kultainen RGB -standardi). Matemaattisesti jokainen pikseli voidaan määritellä kolmen arvon matriisiksi, joista jokainen edustaa värikomponenttia. Täten lopullinen kuva, joka ulottuu koko kuvaan, on itse asiassa kolmen kuvan komponentin sekoitus: punainen, sininen ja vihreä kuvan osat.

Sen käsittely vaatii paljon työtä! Harmaasävyisissä kuvissa jokaisella pikselillä on kuitenkin vain yksi väritieto. Värikuvan käsittely on siis kolme kertaa hitaampaa kuin harmaasävykuvassa (vähintään kolme kertaa, riippuen tekniikasta). Ja on muutakin: joissain tarkoituksissa (kuten tässä projektissa) kaikkien värien käsittely ei ole välttämätöntä tai tärkeää ollenkaan. Siksi tulimme siihen johtopäätökseen: harmaasävyisten kuvien käyttöä suositellaan kuvankäsittelyyn. Taustamäärityksen jälkeen on tarpeen käyttää Gaussian Blur -suodatinta.

Taustasta vähennetyn kuvan päälle levitetty Gaussin sumennus -suodatin tasoittaa liikkuvan havaitun kohteen kaikki muodot. Se on varmasti avuksi kuvankäsittelyn seuraavissa vaiheissa.

Vaihe 2: Binarisointi

Binarisointi
Binarisointi

Useimmissa kuvankäsittelytapauksissa binääritys on melkein pakollinen vaihe korostettaessa objektin / hahmon ominaisuuksia kuvassa. Syy: binäärikuvassa jokainen pikseliväri voi ottaa vain kaksi arvoa: 0x00 (musta) tai 0xFF (valkoinen). Tämä auttaa paljon kuvankäsittelyssä, jotta kuvankäsittelytekniikoiden käyttäminen seuraavissa vaiheissa vaatii vielä vähemmän "laskentatehoa". Binarisointi voidaan tehdä vertaamalla harmaasävyisen kuvan kutakin pikseliväriä tiettyyn kynnykseen. Jos pikselin värin arvo on suurempi kuin kynnys, tämä pikseliväri ottaa valkoisen arvon (0xFF), ja jos pikselin värin arvo on pienempi kuin kynnys, tämä pikselin väri olettaa mustan arvon (0x00). Valitettavasti kynnysarvon valinta ei ole niin helppoa. Se riippuu ympäristötekijöistä, kuten valaistusolosuhteista. Kynnysarvon väärä valinta voi pilata kaikki vaiheet edelleen. Joten suosittelen vahvasti, että säädät projektisi kynnystä manuaalisesti tapauksellesi ennen muita toimenpiteitä. Tämän kynnysarvon on varmistettava, että liikkuva kohde näkyy binäärikuvassa. Minun tapauksessani kynnyksen riittävän valinnan jälkeen tuloksena on se, mitä näet kuvassa 5.

Kuva 5 - binäärikuva

Vaihe 3: Laajenna

Tähän asti oli mahdollista havaita liikkuvia kohteita, korostaa niitä ja soveltaa binaarisointia, mikä johtaa melko selkeään kuvaan liikkuvasta kohteesta (= melko selkeä kuva objektista kuvankäsittelyä varten). Esineiden laskemisen valmistelu on melkein valmis. "Lähes" tarkoittaa tässä sitä, että joitakin hienosäätöjä on tehtävä ennen siirtymistä. Tässä vaiheessa on todellisia mahdollisuuksia esiintyä "reikiä" esineissä (mustia pikselimassoja valkoiseen korostettuun kohteeseen). Nämä reiät voivat olla mitä tahansa, erityisistä valaistusolosuhteista johonkin esineen muodon osaan. Kun reiät voivat "tuottaa" vääriä esineitä todellisten esineiden sisällä (riippuen siitä, kuinka suuria ja missä ne sijaitsevat), kuvassa olevien reikien seuraukset voivat olla katastrofaalisia esineiden laskemiselle. Yksi tapa poistaa nämä reiät on käyttää kuvankäsittelytekniikkaa Dilate. Käytä tätä ja reiät poistuvat.

Vaihe 4: Muotojen (ja niiden keskikohtien) etsiminen

Muotojen (ja niiden keskikohtien) etsintä
Muotojen (ja niiden keskikohtien) etsintä

Tässä vaiheessa meillä on korostetut kohteet, ilman reikiä sen sisällä ja valmiina seuraavaan: ääriviivojen (ja sen keskipisteiden) etsimiseen. OpenCV: ssä on resursseja havaita ääriviivat automaattisesti, mutta havaitut muodot on valittava viisaasti (vain todellisen objektin tai kohteiden valitsemiseksi). Joten ääriviivojen havaitsemisen kriteerit ovat kohteen pinta -ala pikseleinä². Jos ääriviivan pinta -ala on suurempi kuin raja (määritetty ohjelmistossa), sitä on pidettävä laskettavana todellisena objektina. Tämän aluerajan/kriteerien valinta on erittäin tärkeää, ja huono valinta tarkoittaa väärää laskentaa. Sinun on kokeiltava joitakin aluearvojen raja -arvoja ja tarkistettava, mikä sopii paremmin käyttöösi. Älä huoli, näitä rajoja ei ole vaikea löytää / säätää. Kun kaikki kuvan objektit on valittu, seuraava vaihe on piirtää sille uudelleen (tämän uudelleenmuotoilun on sisällettävä koko havaittu objekti sen sisällä). Ja tämän suorakulmion keskipiste on…. esineen keskipiste! Ehkä ajattelet "Mikä on tämän centroidin iso juttu?", Eikö? Tässä on vastauksesi: ei ole väliä kuinka suuri tai miten esine on, sen liike on sama kuin keskipiste. Toisin sanoen: tämä yksinkertainen piste nimeltä centroid edustaa koko kohteen liikettä. Se tekee laskemisesta erittäin helppoa nyt, eikö niin? Katso alla oleva kuva (kuva 6), jossa kohteen keskipiste on musta piste.

Vaihe 5: Centoridin liike ja esineiden laskeminen

Suuri finaali: vertaa objektin keskikoordinaatteja sisään- ja poistumislinjojen koordinaatteihin ja käytä edellä kuvattua laskentaalgoritmia. Ja liikkuvia esineitä lasketaan!

Lopputulos Kuten tämän postauksen alussa näkyy, tässä on projekti toiminnassa:

Suositeltava: