maanantai 23. marraskuuta 2015

Algoritmin kehityskaari vol II



Kuvanvakautus ja valojen identifioiminen

Valonlähteiden löytämisen jälkeen seuraavaksi haasteeksemme muodostui löydettyjen valojen lajittelu. Jotta Pystyisimme vastaanottamaan viestejä luotettavasti meidän täytyisi pystyä yhdistämään aiemmin havaitut valonlähteet nykyisiin ilman virheitä. Hankalaa tästä prosessista tekee mahdolliset liikkuvat valonlähteet, ja erityisesti vastaanottajan kädestä aiheutuva tärinä ja kameran liikkuminen.
Kameran tärinä on mahdollista poistaa digitaalisesti kuvanvakautuksen avulla. Tähän löytyy valmiita ratkaisuja, mutta halusimme tässäkin kokeilla omia voimiamme. Päätimme tässäkin lähteä ensin hyödyntämään x- ja y-histogrammeja, jotka voitaisiin täsmätä pienimmän neliösumman menetelmällä. Toteutus osoittautui todella nopeaksi, mutta varsin epätarkaksi, sillä liikkuvia kohteita saattaa olla useita. 


Seuraavana toteutuksena yritettiin järjestelmäkameran tarkennuspisteiden innovoima sample-aluemenetelmä. Tässä menetelmässä kuvasta valitaan useita pieniä alueita, jotka yritetään sovittaa kuvien välillä. Tämän toteutuksen eduiksi havaittiin yksinkertaisuus ja tarkempi sovitus kuin histogrammiversiossa. Ongelmaksi muodostui algoritmin hitaus. Tarkempi analyysi osoitti, että sample-aluemenetelmä on nopeudeltaan neliöllinen tai jopa kuutiollinen, kun taas histogrammimenetelmä on lineaarinen.
 

Emme olleet tyytyväisiä edellisten algoritmien suorituskykyyn, joten päätimme lopulta jättää kuvanvakautuksen pois lopullisesta algoritmikokonaisuudesta. Pohdimme, että kuvanvakautuksen käyttäminen ei muutenkaan ole välttämätöntä, jos valonlähteitä ei ole todella paljon. Kameran kuvataajuus on sen verran suuri, että kahden kuvan välillä yksittäiset valonlähteet eivät ehdi paljon liikkua. 

Jatkokehityksen kannalta tähän jäi selvästi aukko, joka on helpohko täyttää. Luultavasti kuvanvakautuksessa kannattaisi käyttää jonkinlaista hahmontunnistusalgoritmia, jolla saataisiin todella tarkka sovitus, mutta samalla suoritus saatettaisiin saada riittävän nopeaksi. Projektikurssin aika ei kuitenkaan ryhmämme osalta riitä tällaisten menetelmien opetteluun, ja lisäksi valmiiden algoritmien käyttäminen sotii alkuperäistä ideologiaamme vastaan. 

Aiempien valojen yhdistämisessä nykyisiin valonlähteisiin käytettiin lopulta melko yksinkertaista algoritmia. Lopullisessa toteutuksessa todella lähekkäin olevat valot yhdistetään toisiinsa ja kirjataan tämän havaitun valonlähteen sijainti. Jos jatkossa havaitaan valonlähde tämän sijainnin lähettyvillä, tulkitaan tämä havaittu valo samaksi kuin aiemmin havaittu. Näin voidaan kirjoittaa muistiin kunkin valonlähteen vilkuttelut.

Viestin lähettäminen ja dekoodaus

Projektiaiheemme alkuperäinen nimi on MORSE. Totesimme kuitenkin jo sovelluksen kehityksen alkuvaiheessa, että morse-aakkosten käyttäminen on turhan rajoittavaa, eikä välttämättä kovinkaan tehokasta. Päätimme, että viestit lähetetään ASCII-koodattuna (vähän muokattuna), jolloin jatkokehityksessä on helppo toteuttaa viesteihin salaus, virheentunnistus ja muuta vastaavaa.
Suoraviivainen lähestymistapa lähettämisen toteuttamiseksi olisi sopia, että salamavalo päällä tarkoittaa bittiä 1 ja salamavalo pois päältä tarkoittaa bittiä 0. Tähän menettelyyn liittyy kuitenkin huomattavia ongelmia:

  • Miten tunnistetaan kaksi peräkkäistä nollaa tai ykköstä?
  • Jos nollia on paljon peräkkäin, valonlähde saattaa liikkua tämän aikana todella paljon. Miten siis pystytään seuraamaan pois päältä olevaa lamppua?
  • Kaikki valonlähteet voidaan tulkita lähettävän tämän kaltaista signaalia, joten datan tallentamiseen joudutaan käyttämään paljon muistia.

Ehkä hieman yllättävästi ratkaisut näihin ongelmiin löytyy morsesta. Sopimalla, että salamavalon lyhyt päällä tarkoittaa 0 ja pitkä päällä tarkoittaa 1, voidaan välttyä edellä mainituilta ongelmilta. Koska jokaisen bitin välissä on lyhyt tauko, bittien erottaminen toisistaan on helppoa. Toisaalta salamavalo ei ole koskaan pitkäaikaisesti pois päältä, joten valojen seuraaminen on helpohkoa. Lisäksi lähetystapa on hyvin spesifi, joten tarvittaessa voidaan tunnistaa esimerkiksi kiinteät katulamput, jotka ovat koko ajan päällä. Ainoana pienenä miinuksena tällaiselle lähetystavalla on hienoinen häviö lähetysnopeudessa. Kuitenkin lähetysnopeus ei ole muutenkaan meidän kilpailuvaltti, joten nopeudesta voidaan hieman karsia.

Viestien dekoodaaminen on lopulta helppoa, kun pohjatyö on tehty hyvin. Pitkän ja lyhyen välähdyksen tunnistamisessa voidaan tehdä yksinkertainen vertailu: oliko välähdys lyhempi kuin annettu arvo.  Mittauksissa havaittiin, että salamavalon välähdystaajuus ei välttämättä pysy koko ajan vakiona. Kuitenkin tämän vaikutus voidaan häivyttää valitsemalla lyhyen ja pitkän välähdyksen ajat sopivasti.
     

Ei kommentteja:

Lähetä kommentti