Tag Archive | Meshlab

Kartor för blinda…

… men mest för mitt eget nörderi.

Har ni sett inlägget om kartor för blinda på GIS-Lounge (http://www.gislounge.com/3d-maps-blind/)?

Då jag numera är stolt ägare till en 3D-skrivare så tänkte jag testa detta (GIS-nörd + 3D-skrivare = kartor i 3D).

Först och främst, det finns säkert massor med sätt att göra detta på och jag har bara provat ett par stycken, så här redovisar jag det som fungerade bäst av dessa. Vald metod fungerar även med andra GIS program så även ESRI-användare kan vara med på instruktionerna här.

Höjddata är ofta rasterbilder medan 3D-skrivare behöver styrkoder i ett speciellt format. Styrkoder beräknas i program som är anpassade till aktuell skrivare, lite som drivrutiner för vanliga skrivare. Filformatet som de flesta sådana styrkodsprogram vill läsa in är STL, vilket är ett format för att hantera 3D-modeller. Detta format är dock inget som finns att exportera till från QGIS, varför gör det inte det förresten? Kanske ett uppseglande behov av QGIS insticksprogram som en engagerad pythonprogrammerare där ute kan ta tag i.

Jag började först med att klippa raster i QGIS och exportera som xyz-fil för att döpa om till ”asc” och importera i MeshLab. Detta gick bra, men jag kan MeshLab lite för dåligt för att gå vidare därifrån med den typ av data som skapades. Om det är någon som lyckas så får ni gärna höra av er med en instruktion hur man får ut användbara stl-filer av dessa xyz/asc filer. Det fungerar dock utmärkt att visualisera höjddata i 3D på detta vis, så det kan vara intressant att titta på MeshLab för detta ändamål.

Efter lite efterforskningar så hittade jag däremot ett litet javaprogram som underlättade ganska mycket för mig. Metoden blev därför mycket enklare och helt oberoende av vilken GIS-mjukvara som används.

Screenshot from 2014-10-18 13:18:12Jag började med att läsa in ett lager med höjddata och gå till det område jag var intresserad av. Det skall vara höjddata som är symboliserat i svart till vitt där vitt är högsta punkten. I bilden ovan har jag använt data från Danmark över Helsingör med Kronborgs slott till höger.

Screenshot from 2014-10-18 12:31:43Det är skapligt viktigt att använda sig av rätt stil i egenskaperna för lagret för att få så hög ”upplösning” som möjligt i modellen. I QGIS så väljer jag Min/Max och ändrar ”Full” till ”Nuvarande” och ”Uppskattad” till ”Verklig”, klickar på ”Läs in” och därefter ”OK”. Detta ger svart i det synliga områdets lägsta punkt och vitt i det synliga områdets högsta.

För att gå vidare behövs det bara en bild i gråskala så från QGIS exporterar jag den synliga delen av kartan med menyalternativet ”Spara som bild…”. I mina försök har jag valt png-format på bilden och det fungerar bra.

Screenshot from 2014-10-18 13:19:52Nästa steg blev att köra javaprogrammet som går att hämta hem från SourceForge (http://sourceforge.net/projects/heightmap2stl/). Kommandot som gör om bilden till stl-format ges i ett terminalfönster. Det enklaste är att ha bild och jar-fil på samma sökväg och navigera dit i terminalen (hur du gör beror på om du kör Windows/Mac/Linux).

Jar-filen måste vara ”körbar” och du måste ha Java installerat:

java -jar heightmap2stl.jar bild.png 20 2

Kommandot ovan består av ett java-anrop och tre parametrar. Den första anger vilken bildfil som skall användas. Den andra hur hög modellen skall vara som högst. Den tredje hur hög den minst skall vara.

Här får man experimentera lite för att uppnå den effekt man önskar och det går exempelvis att räkna lite i förväg om man vill få det så verklighetstroget som möjligt.

Programmet skapar en stl-fil med samma namn som bilden och i samma katalog. Denna stl-fil kan man sedan öppna i MeshLab.

Screenshot from 2014-10-18 14:45:58Det går egentligen att läsa in stl-filen direkt i ditt program för 3D-skrivaren men i mitt fall så får jag modeller med mycket fler än 1 miljon punkter, vilket är helt onödigt i många fall och genererar stora modellfiler. I MeshLab så är det enkelt att reducera punkterna med ett filter (Remeshing, Simplification and Reconstruction/Quadric Edge Collaps Decimation):

Screenshot from 2014-10-18 10:57:02Jag tror inte du behöver vara speciellt försiktig här, lite beroende på hur många punkter du börjar med. Jag har valt reduceringar allt från 50% till 10% (i bilden ovan angiven som 0.1), och då tror jag att man hamnar på en rimlig nivå med ett par hundra tusen punkter.

Spara modellen på nytt och sedan är det dags för 3D-programmet. Vilket program som används för detta är helt beroende av vilken typ av 3D-skrivare man har.

Jag använder Slic3r för att skapa styrkoden för 3D-skrivaren (g-code). När jag läser in min modell så blir den på tok för stor för skrivaren, men då finns det en skalningsfunktion i Slic3r som löser detta.

Mitt försök här fick jag dock skala ner till 10% i storlek, så min inställning på 2 (mm) som minsta höjd skalades också om, vilket gav en väldigt tunn modell, där även några av detaljerna försvann:

SONY DSCEftersom utskriften i huvudsak är endast ett lager tjock så böjde den sig lite när jag bände loss den. Jag får ändå säga att det fungerade väldigt bra och utskriften tog ”bara” 42 minuter.

3D i bilder

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.

Screenshot from 2014-08-23 10:13:42

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.

Screenshot from 2014-08-23 10:27:23

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).

Screenshot from 2014-08-23 10:34:24

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.

Screenshot from 2014-08-23 10:47:10

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”.

Screenshot from 2014-08-23 11:02:07

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.

Screenshot from 2014-08-23 11:18:58

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.

Screenshot from 2014-08-23 11:29:27

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).

Screenshot from 2014-08-23 12:51:20

Klicka på ”Apply” och gå sedan till menyn ”Filters – Camera – Project Active Rasters ….” och klicka på ”Apply” i dialogrutan.

Screenshot from 2014-08-23 13:10:04

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).

Structure from Motion (SFM) – Foto till 3D

Det finns många kommersiella system som gör om foton till 3D, men nu har jag hittat ett Open Source som fungerar (ganska bra).

Visual SFM (structure from motion) går att ladda ner för flera operativsystem, men det är enklast att ladda ner en förkompilerad version för Windows.

Jag använder ett par hundra bilder från baksidan av trädgården, ju mera överlapp desto bättre. Det som avgör är inte bara antalet bilder utan även att de är tagna från lite olika platser.

Tyvärr så har min laptop inte en NVIDIA GPU så programmet kommer bara att använda processorn för beräkningar, vilket tar ganska lång tid…

Nåja, genom att klicka på rätt knapp så körs en SIFT (scale-invariant feature transform) funktion för att identifiera nyckelpunkter i alla bilder. Därefter så matchas bilderna mot varandra för att hitta överensstämmelser.

Det sista steget blir att rekonstruera 3D miljön. Detta fungerar inte helt felfritt, om det inte är helt ideala förutsättningar så skapar programmet flera modeller. Det är hur som helst ganska imponerande att allt görs automatiskt.

Jag passar även på att köra ett tillägg för att förtäta punktmolnet kallat CMVS/PMVS, som gör att objekten framträder lite tydligare. Detta skapar även nya filer med de resulterande modellerna. Dessa visualiseras i programmet, men jag tycker det blir snyggare i Meshlab.

Nu väntar jag bara på ett plug-in till Sketch-Up (numera distribuerat av Trimble) för att kombinera automatiskt med lite manuellt arbete för att snabba upp 3D byggandet. Kan bara data sparas i ett bra format som gör det användbart i olika GIS system så är lycken fullständig 😉

CRP – Close Range Photogrammetry

Begreppet som sådant innebär att man utifrån tagna fotografier i efterhand kan skapa geografiska punkter, mäta olika avstånd och på annat sätt göra beräkningar i 3D.

Här kommer jag endast att titta på två program och visa lite exempel på vad man kan göra med Open Source. Det finns kommersiell programvara som gör detta mycket bättre, men i denna blogg så försöker jag hålla mig till Open Source och fri programvara.

Vi börjar med programmet som skall skapa 3D informationen. Insight3D är ett Open Source program som tar en serie med bilder med lite olika vinkel och räknar ut gemensamma punkters position i 3D.

Jag har tagit en serie bilder på en sten (mycket texturer och goda möjligheter att automatiskt hitta gemensamma punkter).

Läs mer…