2008-08-01

Vecka 31

Denna vecka har jag ägnat helt åt att implementera funktionalitet i den ordning som känns mest logisk. Jag började med att skriva rutiner för att läsa tangentbordstryckningar så jag dynamiskt kunde uppdatera inställningar för hur en enstaka bildruta skulle visas. Systemet som jag började med växte snabbt i komplexitet och i nuläget hanteras följande tangenter:
  • F1-F5 byter modes
  • 1-6 byter submodes
  • Pil upp/ner och vänster/höger ändrar värdet på två aktiva parametrar
  • Vänster CTRL, ALT, SHIFT och höger CTRL fungerar som modifiers
  • Q/Esc stänger ner programmet
Exempelvis innebär F4 att man byter till Post-processing mode, där en binär tröskling görs enligt en lägre och övre gräns för genomsnittligt färgvärde. Gränserna kan ändras med piltangenterna. Som standard är submode = 1 när man byter mode, men genom att byta till 2-5 kan man i Post-processing se olika varianter av kantdetektering, medan submode = 5 är en Gaussian smoothing (utjämning av brus). Jag har som detta antyder skrivit funktioner för att lagra matriser och utföra faltning (convolution) med godtyckliga kärnor (kernels) och också börjat på morfologiska funktioner.

Tidigt i veckan upptäckte jag att det var mycket enklare än förväntat att strömma video live från AXIS-kameran som jag använder, så jag anpassade mina funktioner till att manipulera och visa det kameran ser i realtid. Jag hittade också ett exempel på hur RGB kan användas för att rendera direkt med SDL, vilket var enormt mycket smidigare än den YUVOverlay (YCbCr) som jag tidigare använde. Jag har också implementerat konvertering till diverse format som HSI och normaliserad RGB. Utöver det redan nämnda fick jag också en ganska smidig snapshot-funktion att fungera, så man under körningen kan spara bilder i PPM eller BMP-format. Mot slutet av veckan skrev jag en mode för att interaktivt kunna kalibrera vilket målvärde för hud som systemet letar efter (korset styrs med piltangenterna), vilket syns på bilden nedan.
Den översta delen av skärmen indikerar vilket färgvärde som man pekar på. Segmenteringsdelen av systemet är ungefär likadant som förut och bör räcka till, förutsatt att inspelningsmiljön blir bättre. För att demonstrera vad jag menar visar bilden nedan hur det såg ut på eftermiddagen samma dag som jag kalibrerat systemet efter min uppfattade hudfärg.
Den hudfärg som kameran uppfattar har här ändrats ganska långt från det systemet letar efter (överst på bilden), enkom på grund av solens rörelse och att det blivit molnigare. Slutligen visar den tredje bilden nedan varför min inspelningsmiljö allmänt är problematisk.
De gröna områdena är de där systemet tror det finns hud. Utöver de korrekta kommer även stora delar av taket med eftersom lysrören belyser ytan på sådant sätt att alla uppfattade färgvärden som hud rimligtvis kan ha finns med någonstans på taket, från vitare än mig till ganska mörk. Detta är orsaken till att alla tidigare artiklar som jag hittat har genomförts i känd miljö utan ljuskällor på bilden. Alltså; när jag ska börja spela in träningsdata där systemet verkligen behöver kunna hitta hudområdena kommer jag behöva använda en annan miljö.

Nästa vecka kommer jag fortsätta implementera saker som känns viktiga, främst de morfologiska grundoperationerna, en region growing-algoritm för att testa den segmenteringsmetoden och någon metod för att räkna kopplade komponenter (connected components). Eventuellt kommer jag ägna någon dag åt att skriva om neurala nätverk, support vector machines eller tidigare artiklar så jag har lite mer att komma med om jag skickar in ett uppdaterat utkast till rapporten under veckan.

Inga kommentarer: