Specifikation av kandidatexjobb 3D-rekonstruktion av Rubiks kub André Gräsman Rasmus Göransson grasman@kth.se rasmusgo@kth.se 890430-3214 850908-8517
Introduktion Vi vill göra en förstudie om 3D rekonstruktion. För att göra ämnet lättare så vill vi fokusera på att göra rekonstruktion i ett specialfall där vi vet mycket om objektet. Vi har tänkt oss rekonstruera tillståndet för en Rubiks kub utifrån två fotografier i perspektiv. Vi utgår ifrån att varje bild har tre synliga sidor av kuben. De två bilderna visar tillsammans kubens alla sex sidor. Kubens sidor kan betecknas med bokstäverna U, R, F, D, B och L som står för Up, Right, Front, Down, Back och Left. Dessa beteckningar används genomgående i dokumentet. Problemet som skall lösas är att bestämma tillståndet på kuben utifrån de två fotografierna. Tillståndet kan representeras som en bokstav för varje etikett i en given ordning. Bokstaven beskriver vilken färg etiketten har genom att jämföra färgen med motsvande centrumbit. Den orangea centrumbiten finns på sidan F. Därför får alla orangea etiketter bokstaven F.
Programmets flöde Problemet kan delas upp i sex steg. Varje steg har sitt eget krav på in- och utdata. Stegen är: 1. Hitta etiketter på bilderna 2. Kategorisera och gruppera etiketterna 3. Anpassa koordinatsystem till de etiketter som hittats 4. Läs färger där etiketterna borde vara enligt koordinatsystemen 5. Bestäm på vilken sida etiketterna hör hemma 6. Formatera resultatet som en sträng 1. Hitta etiketter på bilderna I bilden placeras ett antal sökkoordinater där letandet efter etiketter börjar. Algoritmen börjar i en koordinat och letar sig i en rak riktning tills den upptäcker en kant i bilden. Kanten upptäcks genom att jämföra färgskillnaden mellan den aktuella positionen och omgivande positioner. Om skillnaden är stor har algoritmen hittat en kant [1]. När den första kanten har hittats följer algoritmen kanten tills algoritmen kommer tillbaka till positionen där den hittades. Det inringade området bildar en yta vars area och masscentrum beräknas.
För varje etikett som hittas läggs nya sökkoordinater till för att hitta fler etiketter. De nya sökkoordinaterna finns runt den hittade etikettens kanter och diagonaler. 2. Kategorisera och gruppera etiketterna Etiketterna på de synliga sidorna av kuben kategoriseras av sin form. Varje etikett liknar formen av en parallellogram som skiljer sig åt beroende på vilken sida av kuben man tittar på. Det som skiljer parallellogrammerna åt är vinklarna på sidorna. Programmet skapar tre typiska parallellogrammer, en för varje sida och granskar varje potentiell etikett som hittades i förra steget. För varje etikett bestäms den minimala storleken för de tre kända parallellogrammen så etiketten ringas in. Etiketten anses tillhöra sidan vars parallellogram ger bästa kvalité. Kvalitén på anpassningen bestäms av kvoten mellan en etiketts yta och en parallellograms yta. När alla etiketter har kategoriseras grupperas de för att hitta etiketter som hör samman och bildar en sida på kuben. Grupperingen görs genom att låta intilliggande etiketter av samma typ höra ihop.
3. Anpassa koordinatsystem till de etiketter som hittats Varje sida på kuben har ett koordinatsystem med samma koordinataxlar som sidans tillhörande parallellogram vid kategoriseringen. Detta koordinatsystem tar inte hänsyn till perspektivistiska förkrympningar i bilden. Det gör att anpassningen blir dålig om bilden är tagen på kort avstånd. För att skapa ett koordinatsystem som tar hänsyn till förkrympningarna måste linjerna mellan etiketternas centrum ha olika riktning. I bilden till vänster är linjerna helt parallella med varandra och därför inte helt anpassade till kubens sidor. Problemet löses genom att anpassa kvadratiska polynom till de funna etiketternas masscentrum. De kvadratiska polynomen kan uttryckas som funktionerna enligt nedan: ( ) ( ) Den första ekvationen tar emot x och y som kolumn och rad för etiketter och returnerar x- koordinaten för etiketten i bilden. Den andra funktionen bestämmer y-koordinaten. Konstanterna i polynomen bestäms genom minsta-kvadrat-anpassning [2]. Förhoppningsvis hittas nio etiketter som ger nio par av ekvationer. Varje ekvation har sex obekanta konstanter därför är detta ett överbestämt ekvationssystem.
4. Läs färger där etiketterna borde vara enligt koordinatsystemen I de tidigare stegen har etiketter hittats i bilden och grupperats efter vilka som utgör kubens tre synliga sidor. Därefter har funktioner anpassats så att det går att säga var varje etikett på kuben borde finnas i bilden. Därför går det att bestämma var färgerna ska avläsas för varje etikett även om enstaka etiketter inte hittats från början. För att kompensera olik belysning på olika sidor läses även punkter mellan etiketterna för att korrigera vitbalansen.
5. Bestäm på vilken sida etiketterna hör hemma Varje etikett hör hemma på en viss sida då kuben är löst. För att bestämma på vilken sida varje etikett hör hemma måste etiketternas färger jämföras. Ett problem som uppstår är att etiketterna kan vara skuggade eller belysta av olika ljus då de finns på olika sidor. För att komma runt det jämförs färgerna i ett färgplan där grått och vitt finns i mitten och alla klara färger runtomkring. Ljusstyrkan projicerats bort så att bara färginformationen finns kvar. Etiketter med färger som hamnar nära varandra i färgplanet har liknande färg. Det finns flera begränsningar i kuben som behöver tas hänsyn till. För det första kan inte mittenbitarna på kuben flyttas i förhållande till varandra. Det utnyttjas genom att låta dessa etiketter bestämma sidornas referensfärger. De övriga etiketterna på kuben jämförs med referensfärgerna och tilldelas en sida så att färgerna matchar. Algoritm för tilldelning av sidor In: Etiketternas färger i strukturerad ordning Ut: Kubens tillstånd 1. Låt mittenbitarnas färger vara referensfärger 2. Lista alla möjliga tilldelningar av etikett till referensfärg 3. Sortera möjliga tilldelningar efter kromatiskt avstånd 4. Så länge det går att göra fler tilldelningar a. Gör bästa möjliga tilldelning 5. Om resultatet är dåligt a. Uppdatera referensfärgerna från de tilldelningar som redan är gjorda b. Börja om från 2
6. Formatera resultatet som en sträng I det tidigare steget bestämdes kubens tillstånd. Vi har valt att presentera tillståndet som en sträng av bokstäver. Formatet beskriver på vilken sida varje etikett hör hemma. Detta görs genom att bestämma en indexeringsordning för kubens etiketter och lista vilka sidor etiketterna tillhör. Bokstäverna som använd i strängen är U, R, F, D, B och L som står för Up, Right, Front, Down, Back, och Left. Exempel på sträng: FDBRUFBDFLLLDRRFUBRFUFFBBBLDBDLDRDRRFFLLBBDLURUUULUUDR
Referenser [1] Wikipedia Edge detection (2011-02-18) http://en.wikipedia.org/wiki/edge_detection [2] Wikipedia Least Squares (2011-02-18) http://en.wikipedia.org/wiki/least_squares Kwon3D Camera Calibration (2011-02-18) http://www.kwon3d.com/theory/calib.html Kociemba Cube Explorer (2011-02-18) http://kociemba.org/cube.htm Tidsplan Vi har redan en fungerande prototyp. Det som återstår är testning, eventuell extra funktionalitet och rapporten. Vi har bestämt den första mars som slutdatum för implementation av ny funktionalitet (feature freeze). Då har vi också ett utkast av rapporten som inte beskriver saker i detalj men innehåller en bra överblick. Under mars ska vi testa programmet och olika varianter på lösningar av olika delsteg. Samtidigt beskriver vi dessa detaljer i rapporten. Första halvan av april fixar vi det sista på rapporten. Andra halvan granskar vi rapporten som vi ska opponera på och förbereder vår egen redovisning.