Oj vad hett fotogrammetri är! Det handlar om att använda foton för att skapa punktmoln, 3D modeller och från drönare ortofoto samt höjddata. Ur ett geo-perspektiv så handlar det mycket om drönare, men för branschen som helhet så är det framför allt för att skapa 3D modeller som kan användas i andra sammanhang, exempelvis VR, filme och spel.
Jag har skrivit om Open Drone Map och WebODM tidigare, vilket är perfekt om man ”bara” vill hantera drönarbilder. Om man vill använda bilder tagna från marken, för att undvika regelverk och bestämmelser förknippade med drönare, så får man göra på ett annat sätt.
Det finns flera kommersiella program som gör detta, men nu är det Open Source som gäller. För mig så är det dessutom Linux som är fokus, så det måste vara program och metoder som fungerar då, men det jag i slutändan väljer finns även för Windows och Mac.
För det första så är processen med fotogrammetri uppbyggd i flera steg. Varje sådant steg är så unikt att det går att utföra med ett separat program. Det är faktiskt så många av programmen (även de kommersiella) är uppbyggda. Först körs a, sedan b, följt av c.
- Räkna fram vilka bilder som hör ihop och kan jämföras (bildpar) för att inte alla bilder skall jämföras med alla andra, vilket skulle ta väldigt lång tid.
- Räkna fram kamerornas position och riktning genom att jämföra bildparen grovt och skapa ett enkelt punktmoln (kan exempelvis göras med SIFT).
- Gör en ny beräkning och ta fram ett ”tätt” punktmoln som exempelvis använder CMVS/PMVS.
- Skapa en ytmodell från punktmolnet. Denna och punktmolnet i sig kan även behöva ”städas”.
- Skapa texturer för modellen baserat på tagna fotografier.
Resultatet kan vara punktmoln, djupbilder/höjddata, modeller (mesh), texturer, med mera.
Bilder
Något om bilder först. Det är viktigt att man har väldigt mycket överlapp i bilderna! Ju större objekt/område, desto fler bilder. Man bör dessutom använda manuell exponering så att alla bilder exponeras likadant, vilket underlättar framför allt i SIFT processen.
MVE/MVS
Detta är två olika terminalprogram, det vill säga inget GUI. På Linux (Ubuntu) så installeras dessa enklas med ”snap”.
sudo snap install mve sudo snap install mvs-texturing-mardy
MVE gör allt utom att skapa texturer, vilket görs med MVS. (Alla texter med hakparenteser är meningen att bytas ut mot något som representerar en sökväg, eller i vissa fall ett filnamn.)
mve.makescene -i <bilder> <scen>
Ovanstående kommando använder bilderna på angiven sökväg och skapar en ”scen” på den sökväg som anges. För att skapa ”struktur” så körs ett nytt kommando med den skapade scenen som argument.
mve.sfmrecon <scen>
Kommandot kan ta lite tid, och det låser upp alla tillgängliga trådar på datorn, så det bästa är att bara ta det lugnt och vänta. Efter detta så är kamerapositioner med mera fastställt, men det behövs även lite punkter. Först så skall ”djupinformation” tas fram.
mve.dmrecon <scen>
Ett punktmoln skapas sedan med ännu ett kommando.
mve.scene2pset -F2 <scen> <punkter>.ply
Detta kan sedan visas i exempelvis MeshLab, men det går att fortsätta med mve-kommandon lite till. Först kan man skapa ytmodeller (mesh).
mve.fssrecon <punkter>.ply <yta>.ply
Efter ännu lite väntan så kan det vara läge att ”städa” lite i modellen med:
mve.meshclean -t10 <yta>.ply <ren-yta>.ply
Nästa steg blir att byta program till MVS för att skapa texturer.
mvs-texturing-mardy.texrecon scene::undistorted <ren-yta>.ply <texturobjekt>
Imponerande resultat! Det tog lite tid att beräkna, men oj vad bra!
Importera bara <texturobjekt> som mesh i Meshlab eller CloudCompare, sedan är det bara att beundra resultatet.
Jag undrar om man kan skapa ett eget bash skript som tar ett antal input i början och sedan bara kör det ena kommandot efter det andra utan mer input? Borde inte vara så svårt. Då kan man ju sätta igång en eller flera körningar innan man går och lägger sig, så slipper man låsa upp datorresurser eller sitta och vänta.
Alla gillar dock inte terminalkommandon, så då får man leta efter alternativ med GUI.
VisualSFM
Detta kanske är det mest populära i sammanhanget och det finns färdiga binärfiler för Windows på http://ccwu.me/vsfm/. För Linux så är det enklast att installera via snap.
sudo snap install visualsfm-mardy
Programmet startas sedan som vanligt. VisualSFM är inte speciellt krångligt och det finns tydliga instruktioner på hemsidan. Jag hade lite problem med att få programmet att förstå att jag hade ett nVidia grafikkort, så jag valde att köra på CPU i stället för GPU (får bli ett senare problem).
VisualSFM är bra, om det fungerar, men man får jobba lite för det. Just när jag skriver detta så är det mest strul. VisualSFM är sedan inte helt Open Source! Det fick mig att söka efter andra alternativ…
Regard3D
Regard3D är Open Source för alla plattformar och det finns binärfiler klara för Windows och Mac, medan jag får kompilera koden själv. Detta är lite struligt ibland med många beroenden som skall installeras separat, där somliga beroenden i sin tur skall kompileras.
Nåja, Regard3D har ett ganska enkelt GUI som anpassas allt eftersom projektet fortgår. Det börjar med att ett projekt skapas. Därefter läser man in bilder. Nästa steg är triangulering (vilket är det samma som sker med SIFT och skapar ett glest punktmoln). Det täta punktmolnet kan skapas antingen med CMVS/PMVS eller MVE. Regard3D har inga egna lösningar för beräkningarna utan använder samma verktyg som de tidigare.
Även texturer kan skapas i programmet och modeller kan exporteras för användning i andra program. Regard3D är ett trevligt alternativ framför allt eftersom allt görs i ett och samma GUI.
Slutsatser
Är det drönarbilder man vill bearbeta så är WebODM det bästa att använda! Har man däremot något annat man vill skapa 3D data från så gillar jag MVE/MVS, men både VisualSFM och Regard3D är bra om man vill ha ett GUI.
Det jag inte tycker om är att det är ganska krångligt att få det att fungera, åtminstone på Linux, men även Windows strular ibland (Regard3D strulade minst). Just det här att man måste använda flera olika program i olika steg av bearbetningen är också något som är lite omständligt.
Har man ekonomi för det så skulle jag nog rekommendera att man överväger en kommersiell licens, för exempelvis AgiSoft PhotoScan. Detta är så mycket enklare att hantera och det klarar både drönarbilder och bilder tagna från marken. Dessutom så upplever jag att PhotoScan är ganska rejält mycket snabbare i beräkningarna. Det finns även andra kommersiella lösningar, men få som jag känner till där så många tillämpningar fungerar i ett och samma program. Exempelvis kan man använda bilder från 360 kameror, vilket är utmärkt om man exempelvis skall skanna ett rum.
Vi som inte har 35’000 kronor liggande att investera i PhotoScan och inte nöjer oss med Demoversionen får bita ihop och stå ut med att installationer strular ibland. Är resultatet i sig sämre med Open Source? Det tycker jag inte!
Jag har provat en enkel gratisversion av agisoft med bilder på en stol (funkade inte) och bilder på ett hus (funkade!) tagna från alla möjliga vinklar med min gamla mobil. Säger du att det du gör ovan är jämförbart? Kan du visa resultatet i QGIS (screenshot)? Går det att pilla in i gimp också? Vore kanon! 🙂
mvh
//Erik
Se svar nedan…
PhotoScan gör allt mycket enklare och snabbare. Dessutom i ett och samma gränssnitt. Om jag tar en av scenerna från artikeln, som råkar ha med lite byggnader runt omkring och registrerar mot koordinater från Google Maps, exporterar till GeoTiff och öppnar i QGIS så blir det OK (?). Egna noggranna referenspunkter och inhämtning med syfte att skapa geodata skulle inte göra det sämre. (https://github.com/klakar/geosupportsystem/raw/master/bilder/Sk%C3%A4rmbild%20fr%C3%A5n%202017-07-04%2012-15-29.png).
Gimp är ju bara ett ritprogram så den skärmdunp som finns här går ju att öppna i Gimp… Jag exporterade bilden som GeoTiff, vilket också går att öppna i Gimp, men det går även att exportera scener som bilder från programmen. Scener går även att exportera till 3D program som Blender om man vill det.
Det blir mer fotogrammetri längre fram, med fler bilder.
Förlåt, det var ju Blender jag menade! 🙂 Försökte rita huset manuellt som en punkt-matris (wireframe) men gav upp för det blev för jobbigt att mäta upp vettiga referensavstånd. Ser fram emot din nästa postning 🙂 Tack!
Prova med SketchUp i stället om det är byggnader du vill modellera. Väldigt enkelt att skapa modeller med verkliga mått, men även tillräckligt avancerat för att skapa mycket detaljrika modeller. Då blir det förstås betydligt mycket mera jobb. En modell i SketchUp är betydligt mycket mindre resurskrävande än ett punktmoln med 10-tals miljoner punkter.