2008-08-29

Vecka 35

I veckan har jag till största del programmerat. Jag har äntligen en funktion som räknar kopplade komponenter och tilldelar de färger automatiskt och den fungerar ganska bra, så bilderna nedan är en liten demo. Den första bilden har ett schackmönster där varje ruta (nätt och jämnt) sitter ihop med de andra, vilket betyder att bilden innehåller en enda kopplad komponent och får en grå färg.
Nästa bild är identisk, förutom att en erosion nu har gjort att rutorna nu inte sitter ihop. De är alltså olika kopplade komponenter och får olika färger (men de börjar bli så många att man har svårt att särskilja vissa färger).
Slutligen en riktig bild, där jag med binär thresholding har behållit alla föremål med vissa ljusvärden och sedan "öppnat bilden" (opening) för att bli av med några tusen pixlar som orsakats av brus (som annars skulle räknats som "kopplade komponenter" och tilldelats unika färger).
Arbetet med kopplade komponenter tog oväntat lång tid, men resultatet är väldigt praktiskt i många sammanhang. Exempelvis antar några författare att den största kopplade komponenten i bilden som är hudfärgad är användarens hand/arm, vilket verkar fungera bra.

Den nuvarande tanken för mitt projekt är att mjukvaran först genomgår en kalibreringsfas där användaren håller upp handen framför kameran. Snakes (aktiva konturer) är nuvarande det starkaste hoppet för att kunna följa handens form, men som bilden nedan visar skulle en väldigt enkel lösning vara att indikera ett område där alla pixlar antas vara hud och be användaren att hålla handen innanför.
Oavsett hur färgvärdena plockas ut så används den informationen sen för att uppskatta vilka färgvärden som antas tillhöra hudområden och vilka som inte gör det (färgmodellen tränas/kalibreras). Med hjälp av färginformationen och rörelse i bilden och/eller formen/texturen på objekt spåras sedan handen mellan varje bildruta. Detta har fördelen att området av bilden som behöver genomsökas blir mindre eftersom handen rimligtvis inte bör röra sig alltför långt mellan två bildrutor som kommer med cirka 0.03 sekunders mellanrum. Detta förutsätter dock att programmet hinner med att göra beräkningarna i realtid, eller att det är acceptabelt att köra långsammare (vilket det bör vara om ett existerande videoklipp används).

Det viktigaste som behövs just nu är robust kantdetektering, eftersom det som jag beskrivit vore bättre att inte behöva förlita sig på färginformation för att hitta handen, utan istället semi-automatiskt hitta handen och extrahera den informationen under kalibreringen.
Bilden ovan visar en snake med 25 punkter som knappt syns och förvirrat försöker inhägna inget i allmänhet, men tre av punkterna har ett "energilandskap" utritat kring sig. Varje punkt använder flera olika mått för att bestämma sin nya position men tanken är alltid att minimera energin, där måttet på "energi" är saker som att försöka hålla jämna avstånd till sina grannar, behålla en fin, rund form, söka sig mot ljusa föremål och kanter. Av de fyra måtten jag nyss nämnde visar de färgade områdena de första tre (röd - "ballongenergi", grön - "kontinuititetsenergi", blå - "intensitetsenergi"). De mörkare områdena inom de färgade grannskapen för punkterna visar vars energin är lägst, vilket är vars punkten vill röra sig. Det sista måttet på energi är att söka sig mot kanter, vilket är det viktigaste och något som jag inte har fungerande i alla olika situationer än (närmare bestämt i nerskalade/subsamplade bilder, vilket jag tänkt använda med snakes för att låta dom hierarkiskt söka sig till bättre anpassningar).

Jag har också utökat min faltningsfunktion i veckan för att bland annat hantera kanteffekter bättre genom att reflektera delar av bilden och skapa en större utökad version under operationen. Detta ledde oväntat nog till ett ganska roligt tidsfördriv, eftersom det inte är något som hindrar att man reflekterar 100% av bilden, live.

Min LCD-skärm är större än din (och mer självrefererande).
Det här är en del av ett fönster.
Nu är det vecka 35, vilket betyder att nästa vecka är den tionde och halva tiden för exjobbet är över nu. Det känns som om jag fått mycket gjort, men jag uppskattar att jag inte varit framsynt nog att inse hur mycket arbete vissa saker skulle kräva i förväg. Om jag hade vetat det i förväg är det inte lika säkert att jag kommit igång. Högst på dagsordningen nästa vecka står att ordna kantdetektering som fungerar bra vid låg upplösning, jag har några redan implementerade metoder som kan fungera, annars finns Canny. Utöver det vill jag få gråskalemorfologi att fungera, halvt av samma anledning (kantdetektering) och titta på om varians/standardfördelningen i bilden ger några ledtrådar till vilka områden som innehåller hud. Rapporten börjar hamna bakom det jag faktiskt gjort också, så förr eller senare borde jag gå över till att skriva mer och programmera mindre, men just nu vill jag få mer resultat.

Inga kommentarer: