Tag Archive | Fotogrammetri

ODM med egna bilder

För att koppla tillbaka till inlägget om OpenDroneMap, där de exempelbilder jag använde inte riktigt stämde med verkligheten, eller med resultatet från ett professionellt fotogrammetriprogram, så har jag nu fått tag på lokala bilder från en DJI Phantom som jag vet exakt var de är tagna.

Om det blev någon skillnad tänker jag undersöka i detta inlägg.

Läs mer…

Dåligt väder…

Jaha, då har det varit långhelg men av allt planerat trädgårdsarbete blev det inte mycket. Så blir det när man vaknar en morgon i Maj och det ligger snö på marken… Nåja allt är inte dåligt, mitt nysådda gräs har faktiskt börjat titta upp nu efter 14 dagar, så nu kanske gräsmattan blir lite bättre i sommar.

När det är dåligt väder så frigörs tid till annat och vad gör man då om man har geosupport som intresse. Man förbättrar kanske tidigare arbete.

Sagt och gjort, det blev närmare 30 timmar framför datorn (usch), men ett resultat är att jag uppdaterat min webbapplikation för att mäta i panoramabilder.

En förbättring är att det nu går att göra uppskattningar av storlek direkt i bilderna. Jag säger uppskattning då mätningarna enbart baseras på ett mätvärde, och därför inte medger mätningar i 3 dimensioner.

helpMeasurePanoramat förutsätts vara 360 x 180 grader. Allt behöver inte vara täckt av bilder, men vinklarna måste vara korrekta. Ur två panoraman så räknar jag fram ett avstånd till en markerad punkt. Det nya är att det går att sätta denna punkt som referens för en ny punkt.

Den nya punkten använder den gamla och det beräknade avståndet för att i praktiken räkna fram längden på den motstående sidan i en rätvinklig triangel. En förutsättning för att det skall bli någorlunda rättvisa värden är att antingen referenspunkten eller mätpunkten representerar en rät vinkel mellan panoramapunkten och det objekt som skall mätas (se bild ovan).

Bland övriga nyheter är att jag även lagt till en hjälpfil, som ännu så länge bara finns på engelska. Gränssnittet startar på engelska, men det är enkelt att byta till svenska genom att klicka på den svenska flaggan. Vill man byta mer permanent så öppnar man ”pangeox.html” och redigerar en av de första raderna där man ändrar ”false” till ”true”.

Skärmbild från 2015-05-03 09:49:47Öppnar du koden så märker du också en annan ändring, nämligen att jag komprimerat så mycket av HTML- och JavaScript-koden som möjligt för att få ner storleken och därmed kanske snabba upp applikationen. Den var i och för sig inte särskilt långsam från början, men det är ingen ursäkt för att inte göra det.

Sådant jag tror att ”normala” användare kan tänkas vilja ändra i koden har jag låtit vara okomprimerat, vilket förhoppningsvis skall göra det enklare att hitta i och med att man inte behöver bläddra bland hundratals rader kod. Vill du exempelvis översätta allt till ett annat språk än engelska (eller svenska) så är det nu förhållandevis enkelt.

Se ”live” på: http://geosupportsystem.altervista.org/pangeox eller ladda ner paketet direkt (LÄNK ca 200 kB).

Som tidigare så skall applikationen packas upp i samma katalog där man har panoramabilderna och om man inte har Firefox så behöver man en webbserver (och en modern webbläsare) för att använda förhandsgranskningen av panoraman (dock inte nödvändigt för funktionen).

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

Mäta i fotografier – Uppföljning

Om du inte läst gårdagens inlägg så tycker jag att du börjar där. Här beskriver jag hur inmätningen på lite längre håll fungerade, och jag hoppar över alla matteförklaringar.

Den här gången använde jag en bättre kamera, men i övrigt ungefär samma metod. Tre panoramaplatser, räkna ut vinkeln för vänsterkanten i bilderna och platserna inmätta med Garmin GPS.

pano2_lr

Det var skapligt lätt att återfinna platserna där jag tagit bilderna ifrån i panoramabilderna. Jag kunde därför använda dessa platser som referens tillsammans med GPS punkter för att som jag uppfattar det få till en bättre orientering.

I bilderna valde jag ut en punkt nära (ca 100 m), en punkt långt borta (över 500 m) och en punkt med väldigt dåliga vinklar också längre bort.

Resultatet i noggrannhet blir ungefär som i från gårdagen, kanske lite bättre, men då avstånden är betydligt längre så rör sig felet om enstaka procent av avståndet, vilket jag anser vara riktigt bra.

Screenshot from 2014-06-01 15:06:04

Det som jag visste skulle bli svårt var den punkt som ligger med väldigt liten vinkelskillnad mellan mätpunkterna ( ca 1.1 grad). Trots detta så är felet ”bara” ca 10 % av avståndet. Det är dock tydligt att skall metoden användas längs väg så bör man begränsa utpekningen av objekt till sektorer åt vänster och åt höger.

Jag är faktiskt ganska imponerad av vad man kan uppnå med såhär enkla tekniker. Det är lite pillrigt så nästa steg blir att försöka automatisera så mycket som möjligt, kanske framför allt med någon form av formulär och skript. Ytterligare ett steg framåt blir att försöka samla in data medan man kör, vilket dock kräver en annan typ av kamera, eller flera synkade kameror.

Kan man sedan få till det så att alla punkter man märker ut åskådliggörs i en kartbild så blir det desto bättre. Jag tror faktiskt att det mesta går att utföra i javascript, men jag skulle föredra ett QGIS-plugin för att göra det lite mera automatiserat.

Mäta i fotografier

Jag har länge velat få till ett system där jag genom att markera punkter i bilder kan få fram deras position i verkligheten på ett enkelt sätt.

Nu finns det vad jag känner till ingen mjukvara som gör detta åt mig så därför tänkte jag experimentera lite med komponenter som finns, och se hur bra en eventuell produkt kan bli.

  1. Jag använder 360 graders panoraman som jag skapar i Hugin och exporterar till jpg-filer som är 3600 pixlar breda. Då blir det enkelt att omsätta punkter i bilden till vinklar.
  2. Jag mäter panoramapositionerna med enkel Garmin GPS, men det är framför allt principen och inte precisionen som är viktig nu.
  3. Orienteringen av panoraman görs manuellt i QGIS där jag tar ut en riktning som motsvarar vänsterkanten i varje panorama.

Panoraman väljer jag då dessa i en perfekt värld ger korrekta vinklar till alla objekt som går att observera. Jag har använt en GoPro kamera och Hugin för att skapa dessa, så precisionen är nog sådär. Det är naturligtvis bättre om man kan ha en sensor som fångar hela panoramat i ett ögonblick och därmed slippa förstörande bearbetning i ett bildbehandlingsprogram.

Positionsnoggrannheten blir framför allt intressant när objekten ligger nära mätpunkten. Jag kommer sannolikt att testa metoden även på lite längre avstånd för att se vad det blir för skillnad.

I en färdig sensorplattform så skall naturligtvis någon form av kompass finnas med som ger panoramats orientering. Antingen så att det framgår var norr är, men helst vilken riktning ”skarven” i panoramat har.

panoramaB

Jag använde två panoraman för försöket. Bilden ovan och en 10 meter bort. Jag började med att fastställa riktningen för varje bilds vänsterkant. Om man känner till riktningen i valfri punkt så är det bara att minska denna vinkel med en tiondel av pixelpositionen från vänster ( Vvänster = Vpunkt – Pixelvärde/10 ), eftersom panoramat som sagt är 3600 pixlar brett.

Sedan blir det matematik! Här får jag be alla mattegenier om ursäkt, men det var ett tag sedan jag gick i skolan och jag fick riva mig ordentligt i huvudet innan jag fick till alla formler. Det kan finnas bättre/enklare sätt att räkna och då får ni gärna höra av er.

vinklar

Jag har i punkt A och B mätt in positionen (Xa/Ya och Xb/Yb) och vinkeln till ett punktobjekt. Detta objekt vill jag nu ha reda på koordinaterna för.

Det sätt jag valt är att använda mig av ”räta linjens ekvation” där man relativt enkelt kan ta reda på var två linjer skär varandra, så länge man har formeln för båda linjer. En rät linje i ett koordinatsystem har formen:

y = k*x + m

Konstanten k beskriver lutningen på linjen och m beskriver var linjen skär y-axeln.

Eftersom jag har vinkeln så kan jag räkna ut k med trigonometri:

k = tan(90 - V)

Det jag vill är att hitta en konstant att multiplicera x (närliggande katet) för att få y (motstående katet) och vinkeln är 90-v eftersom vinkeln mäts mot norr och inte i x-led.

rakna90grader

Eftersom formeln är likadan längs hela linjen så kan jag använda min kända punkt (A) för att räkna ut m.

m = y - k*x

Ovanstående görs för varje linje (punktobservation) och eftersom båda linjerna har samma X och Y i skärningspunkten så kan man kombinera ihop dessa.

y1 = x1 * k1 + m1
y2 = x2 * k2 + m2
x1 = x2, y1 = y2
x * k1 + m1 = x * k2 + m2
x = ( m2 - m1 ) / ( k1 - k2 )

För att använda formeln ovan så räknas k och m ut för varje linje och sedan sätts dessa in för att först räkna ut punktens x, och därefter kan man använda valfri linjeekvation för att räkna ut punktens y.

y = x * k + m

Jag skapar en tabell i ett kalkylark där jag kan fylla i koordinaterna för punkt A och B, samt riktningar från A och B till fyra objekt.

Screenshot from 2014-06-01 09:58:36

När jag sedan matar in de beräknade koordinaterna i QGIS och märker ut de faktiska punkterna (hämtat från google maps) så ser det ut som följande:

Screenshot from 2014-06-01 10:00:30Objekten är cirklar och beräknade punkter från panoraman kryss.

Som analys kan jag väl säga att överensstämmelsen finns där, men noggrannheten är för dålig i detta lilla område. Det går också att konstatera att alla punkter är inmätta öster om de angivna punkterna, vilket kan vara ett GPS problem (eller Google Maps problem). ”Felet” i mätningen ligger mellan en och sju meter och med tanke på att avståndet till mätpunkterna som längst är ca 40 meter, så är det inte helt imponerande.

Nåja, det var inte tänkt att det skulle bli mättekniskt helt korrekt utan som test av ett koncept. För att det skall bli bättre så måste följande förbättras:

  • GPS noggrannheten måste bli bättre, framför allt när avstånden är korta.
  • Riktningen är kritisk varför en exakt angivelse mot norr i varje panorama är avgörande.
  • Metoden för att skapa panoramat måste vara icke destruktiv så att vinklar bibehålls.

Nu tror jag att jag skall testa lite längre avstånd…

Fotogrammetri med Zephyr

I måndags så nämnde jag att jag skulle testa lite fotogrammetriprogram senare i veckan, så det är dags nu.

3DF Zephyr (http://www.3dflow.net/) utger sig för att vara ett mycket användarvänligt och allsidigt program som skall klara det mesta med enkelhet, om du har datorkraft för det.

Utvärderingsversionen av programmet klarar av allt som den fulla versionen gör, utom att spara och exportera data. Den verkar inte heller kunna klara av kontrollpunkter enligt informationsrutan vid uppstart.

zephyr_evaluationbox

Nedladdning av utvärderingsversionen görs genom att man fyller i ett formulär på hemsidan och så skall det skickas en länk till installationsfilen automatiskt. Jag hade problem med detta men inom 5 minuter från att jag mailat deras kontaktmail så fick jag nedladdningslänken via svarsmail.

Observera att programmet bara finns till Windows (8.1/8/7/Vista) i 32- eller 64-bitar.

zephyr_gui

Ett ganska rent och avskalat GUI är vad man möter när programmet öppnas, och det gillar jag. Stilen på programmet ger en känsla av Adobe programmen och kanske lite Blender och 3DStudio…

En av få knappar som är aktiva (de flesta går inte att trycka på, än) startar en Wizard i fem steg som om man accepterar förvalen bara handlar om att peka ut ett antal bilder som man vill bearbeta.

När bearbetningen kör så använder programmet alla resurser den kan på datorn, men jag upplever att det är minnesmängd och inte CPU som är gränssättande, så mycket minne är nog bra. Om man har Nvidia Cuda GPU så kommer denna att användas vid beräkningen (enligt hemsidan, jag har inget sådant grafikkort).

zephyr_run1Steg ett: ”Key Points”

zephyr_run2Steg två: ”Finding Neighbors”

zephyr_run3Steg tre: Bearbeta bildpar.

zephyr_run5Steg fyra: ”Merging Clusters”

Resultatet blir ett punktmoln med orienterade foton, om man har tur, men mer om det senare. Sedan kan man klicka på nästa knapp som skapar ett tätare punktmoln och därefter en tredje knapp som skapar texturer och ytor.

Principen är den samma som för Photo Scan Pro från Agisoft, men bildserier som Photo Scan Pro fixar utan problem har jag inte lyckats få igenom i Zephyr. Vid en körning med 42 bilder så lyckades programmet bara koppla ihop 8 av dessa.

Det kan vara så att jag måste ändra lite inställningar, men direkt efter installation så fungerar det sådär bra för mig.

zephyr_objekt

När jag provar att fota ett objekt (eller en hög med ”objekt” på golvet hemma, se ovan) så fungerar det däremot klanderfritt. Programmet kanske är bättre intrimmat för att hantera den här typen av fotogrammetri?

Zephyr kostar lite mindre än Photo Scan Pro, men just nu så tror jag att Photo Scan Pro är värt det, om det är orthofoton man är ute efter i alla fall. Priset är 2’900 $ per licens för Zephyr och det går att få mängdrabatt om man köper flera.

Vi får se om jag får något svar från Acute3D så småningom och kan testa även deras alternativ till fotogrammetrimjukvara.

Mera 3D-foto

Jag har tidigare skrivit om fotogrammetri och den skyddade mjukvaran Photo Scan Pro från Agisoft och Photo Modeller Scanner, men även Open Source alternativet Visual SFM.

Nu har jag hittat ännu ett par företag som erbjuder programvaror för fotogrammetri. Italienska 3DFlow (http://3dflow.net) har ett antal olika skyddade mjukvaror för detta ändamål, men de säljer även tjänster för att skapa 3D modeller. Acute 3D (http://www.acute3d.com) ligger bakom mjukvaran i Autodesks online-tjänst med 123D-Catch och erbjuder även de olika mjukvaror för fotogrammetri. Mest intressant kanske Smart3DCapture Mapper Edition är, som utlovar enkelt skapande av stora 3D modeller direkt hanterbara i GIS-program.

Något av dessa mjukvaror kommer jag att testa senare i veckan, men först ett test av en för icke-kommersiella ändamål gratis mjukvara att skapa 3Dpunkter med.

3DF Samantha går att ladda ner från 3DFlows hemsida och är ett litet program utan egentligt användargränssnitt, men som jag skall visa ganska enkelt ändå att komma igång med.

När man laddat hem mjukvaran (välj 32- eller 64-bitars windows) och packat upp den så går det direkt att köra programmet med de exempelbilder som skickats med. Bilderna ligger i mappen ”Test” och det är även här de resulterande filerna kommer att hamna.

3df_samantha_run2

För att köra med egna bilder så behöver man bara byta ut bilderna i mappen och sedan är det bara att köra programmet igen.

 

För att titta på resultatet så kan man använda exempelvis Meshlab (http://meshlab.sourceforge.net/) och öppna filen i ”*.ply” format, vilket är alla 3D-punkter.

meshlab

I Meshlab kan man sedan ”städa” lite bland punkterna och generera en ytmodell (surface) om man så önskar.

3DF Samantha kan dock leverera mer än detta och alla inställningar görs i den *.ini fil som finns i samma mapp som programmet. Här finns även en instruktion för hur man ställer in programmet, dels i *.ini filen och dels för att skapa kalibreringsfiler för kameran med mera.

Programmet kan dra nytta av Nvidia Cuda GPU:er om du har sådana i din dator, vilket avsevärt snabbar upp beräkningarna. Trots det så är fotogrammetri en tidsödande verksamhet så det hjälper med ett stort mått av tålamod.

För GIS-användning så är programmet inte helt optimalt, inte minst för att det inte skapas några direkt hanterbara filer, men vi får se hur det går senare i veckan när jag testar ett annat program.

Testa gärna programmet själva, men förvänta er inga mirakel. Det är inte helt lätt att jobba med programmet, även om det blir resultat om än små…