Detta inlägg är något av ett återbesök av tidigare inlägg och handlar om hur man kan använda foton för att skapa 3D modeller med datorer.
Det finns flera kommersiella program som gör detta väldigt bra, men här handlar det om öppen källkod, och en av anledningarna till att jag gör ett återbesök är att jag helst jobbar med Linux.
Programmen jag använder är VisualSFM och Meshlab.
VisualSFM är ett GUI, eller användargränssnitt, för en mängd andra program som det är mer eller mindre beroende av. Det är detta som gör det lite krångligt att installera, speciellt på Linux. För Windows så finns det färdiga paket som går att hämta hem och packa upp, sedan är det mer eller mindre bara att köra.
Nu har jag dock hittat en instruktion som jag kunnat följa nästan helt utan att göra några anpassningar och därmed fått VisualSFM att fungera på min dator utan Nvidia grafikkort (eller annan avancerad GPU för den delen).
Jag kombinerar Scott Sawyers instruktion (länk) och de generella instruktionerna för Linux (länk), det senare mest för att jag som sagt inte har ett Nvidia grafikkort. Det är lite pilligt och man måste redigera konfigfiler och kompilera källkod upprepade gånger, men om man läser instruktionen och kommentarerna längre ner så borde det med lite tålamod gå att få allt att fungera.
Börja med att lägga in några bilder (Open Multiple Images). Här har jag valt ett enkelt objekt från Sveriges centrala delar, men det skulle lika gärna kunnat vara överlappande bilder tagna från en UAV/UAS. Att tänka på är att ju mer överlapp det är bland bilderna, desto bättre blir det.
Bilderna matchas (Compute Missing Matches) så att programmet vet vilka som hör ihop. Sedan är det bara att köra 3D rekonstruktionen (Compute 3D Reconstruction).
Detta skapar ett ”glest” punktmoln (Sparse point cloud) där punkterna och kamerapositionerna visas i 3D. Använd höger och vänster musknapp för att flytta runt modellen. Skrollhjulet zoomar och om man håller inne CTRL så ändras storleken på bilderna vid kamerapositionerna och med ALT så ändras storleken på punkterna.
Har man många bilder så kan det ta ett litet tag men hela processen går att följa i realtid i 3D.
Nästa steg blir att skapa ett ”tätt” punktmoln (Dense point cloud) genom att köra ”Run Dense Reconstruktion” (knappen med texten ”CMVS”).
I detta steg får man peka ut var man vill spara resultatet och det är även detta steg som brukar ta längst tid. Det går heller inte att följa resultatet i realtid så här gäller det helt enkelt att ha tålamod och vänta.
Växla mellan ”glest” och ”tätt” punktmoln med TAB och tänd och släck kamerapositioner med knappen ”f”.
Nästa steg blir att öppna modellen i Meshlab, vilket görs genom att helt enkelt öppna (CTRL+O) filen ”bundle.rd.out” som ligger i katalogen ”00” i den katalog som skapades i det förra steget. Man får också peka ut filen ”list.txt” som innehåller sökvägar till de bilder som används.
Som standard visas det glesa punktmolnet. I lagerdialogen (menyn View – Show Layer Dialog) kan man radera detta glesa punktmoln genom att högerklicka på modellen och välja ”Delete Current Mesh”. Nästa steg blir att importera den ”täta” modellen med CTRL-I (Import Mesh). Denna ligger i undermappen ”00/models” och heter i mitt fall ”option-0000.ply”.
I det täta punktmolnet finns en hel del punkter som är fel, men dessa kan enkelt markeras och tas bort med ”Select Vertexes” och ”Delete the current set of selected vertices…”.
I detta steg så kan Meshlab krascha då och då så det gäller att som vanligt spara sitt arbete med jämna mellanrum, men framför allt ha tålamod och låta datorn jobba färdigt.
Här skulle man kunna vara nöjd med något som bara är ”häftigt”, men låt oss ta det ett steg till. Genom att beräkna ”normals” så ger man programmet instruktioner om vad som är ”insida” och ”utsida”. Blir det fel så kan den lilla kryssrutan i bilden ovan användas. Inställningarna kan man justera i alla dialoger, men jag kör på standard i detta exempel.
Du startar dialogen under ”Filters – Point Set – Compute Normals for point set”.
Modellen består fortfarande av punkter (zooma in i din modell så får du se). Nästa steg blir att göra om den till ”ytor”. Det finns flera filter för detta och vilket som passar bäst kan variera. Här väljer jag ”Filters – Point Set – Surface Reconstruction: Poisson”, med standardvärden.
Det är nu man märker om man varit noggrann med att rensa bland punkterna tidigare (jag har inte varit så noggrann).
Vill man nu använda modellen för att skriva ut den med en 3D-skrivare så går det att exportera STL-filer från Meshlab, men detta har jag inte testat. Modellen kan även exporteras i mängder av andra format för fortsatt bearbetning.
Vill man lägga på texturer från fotografierna så går det också.
Använd ”Filters – Texture – Parameterization from registered rasters” och välj att hänsyn skall tas till det beräknade avståndet till kameran och bildernas kanter (bild nedan).
Klicka på ”Apply” och gå sedan till menyn ”Filters – Camera – Project Active Rasters ….” och klicka på ”Apply” i dialogrutan.
Beroende på vad du använder för motiv och vilka filter du använder så kan du nu få fram en bättre eller sämre textur på din modell. I bilden ovan så har jag fuskat och draperat en av bilderna ovanpå så att det skall bli extra tydligt i artikeln, men man får testa en hel del för att det skall bli ett skapligt resultat.
Samma princip som beskrivits ovan går som sagt att använda för att hantera UAV/UAS bilder och sedan skapa ortorektifierade bilder samt höjddata, men detta är något jag själv inte provat så det ger jag mig inte in på att förklara. Sök på YouTube efter VisualSFM och UAV eller motsvarande så går det att hitta massor av filmer (mer eller mindre bra). Använder du Windows och är intresserad av att skapa ortofoton och höjddata så kanske CMPMVS är ett alternativ att titta närmare på (YouTube exempel).