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