• No results found

Sammanfogning av videosekvenser från flygburna kameror

N/A
N/A
Protected

Academic year: 2021

Share "Sammanfogning av videosekvenser från flygburna kameror"

Copied!
59
0
0

Loading.... (view fulltext now)

Full text

(1)

Institutionen för systemteknik

Department of Electrical Engineering

Examensarbete

Sammanfogning av videosekvenser från flygburna

kameror

Examensarbete utfört i Informationskodning vid Tekniska högskolan vid Linköpings universitet

av

Rickard Hagelin och Thomas Andersson LiTH-ISY-EX-ET-13/0407--SE

Linköping 2013

Department of Electrical Engineering Linköpings tekniska högskola

Linköpings universitet Linköpings universitet

(2)
(3)

Sammanfogning av videosekvenser från flygburna

kameror

Examensarbete utfört i Informationskodning

vid Tekniska högskolan vid Linköpings universitet

av

Rickard Hagelin och Thomas Andersson LiTH-ISY-EX-ET-13/0407--SE

Handledare: Harald Nautsch

isy, Linköpings universitet

Examinator: Robert Forchheimer

isy, Linköpings universitet

(4)
(5)

Avdelning, Institution Division, Department

Avdelningen för Informationskodning Department of Electrical Engineering SE-581 83 Linköping Datum Date 2013-06-0 Språk Language Svenska/Swedish Engelska/English   Rapporttyp Report category Licentiatavhandling Examensarbete C-uppsats D-uppsats Övrig rapport  

URL för elektronisk version

http://urn.kb.se/resolve?urn=urn:nbn:se:liu:diva-97029

ISBN — ISRN

LiTH-ISY-EX-ET-13/0407--SE Serietitel och serienummer Title of series, numbering

ISSN —

Titel Title

Sammanfogning av videosekvenser från flygburna kameror Merging of video clips from airborne cameras

Författare Author

Rickard Hagelin och Thomas Andersson

Sammanfattning Abstract

Användningen av UAV:er för olika tillämpningar har ökat under senare år. Ett av möjliga användningsområden är flygfotografering och övervakning. För att göra bildupptagningen

mer effektiv kan flera UAV:er flyga i formation och på så vis kunna fotografera ett avsevärt

större område. För att kunna ta in flera bildsekvenser och foga samman dessa till en panora-mavideo, har ett program utvecklats och testats för denna uppgift.

All funktionalitet för inläsning av bilder och video har utvecklats i C++ med programbib-lioteket OpenCV. Implementeringen av dessa tekniker och metoder har gjort så generiskt som möjligt för att det ska vara lättare att lägga till andra tekniker och utöka programmets funktioner. Olika tekniker som har testats inkluderar: SIFT, SURF och RANSAC.

Nyckelord

(6)
(7)

Sammanfattning

Användningen av UAV:er för olika tillämpningar har ökat under senare år. Ett av möjliga användningsområden är flygfotografering och övervakning. För att gö-ra bildupptagningen mer effektiv kan flegö-ra UAV:er flyga i formation och på så vis kunna fotografera ett avsevärt större område. För att kunna ta in flera bildsekven-ser och foga samman dessa till en panoramavideo, har ett program utvecklats och testats för denna uppgift.

All funktionalitet för inläsning av bilder och video har utvecklats i C++ med programbiblioteket OpenCV. Implementeringen av dessa tekniker och metoder har gjort så generiskt som möjligt för att det ska vara lättare att lägga till and-ra tekniker och utöka progand-rammets funktioner. Olika tekniker som har testats inkluderar: SIFT, SURF och RANSAC.

(8)
(9)

Abstract

The usage of Unmanned Aerial Vehicles (UAV) for several applications has in-creased during the past years. One of the possible applications are aerial image capturing for detection and surveillance purposes. In order to make the captur-ing process more efficient, multiple, cameraequipped UAV:s could fly in a for-mation and as a result cover a larger area. To be able to receive several image sequences and stitch those together, resulting in a panoramavideo, a software application has been developed and tested for this purpose.

All functionality are developed in the language C++ by using the software li-brary OpenCV. All implementations of different techniques and methods has been done as generic as possible to be able to add functionality in the future. Common methods in computervision and object recognition such as SIFT, SURF and RANSAC have been tested.

(10)
(11)

Tack

Ett särskilt tack till vår examinator Robert Forchheimer och handledare Harald Nautsch på avdelningen för informationskodning vid ISY för alla tips och råd under loppet av denna avhandling och för deras synpunkter på rapporten. Vi vill också sända ett speciellt tack till Patrick Doherty, Piotr Rudol och Mariusz Wzorek för bildmaterial och möjligheten att jobba tillsammans.

Sist men inte minst vill vi sända ett stort tack till våra familjer och vänner för allt deras stöd.

Linköping, juni 2013 Rickard Hagelin och Thomas Andersson

(12)
(13)

Innehåll

1 Inledning 1 1.1 Allmänt om UAV . . . 1 1.2 Bakgrund . . . 1 1.3 Företaget . . . 1 1.4 Syfte . . . 2 1.5 Mål . . . 2 1.6 Metod . . . 2 1.6.1 Val av utvecklingsverktyg . . . 2 1.6.2 Design av program . . . 3 1.7 Avgränsningar . . . 3 2 Bakgrundsteori 5 2.1 Digital video . . . 5 2.2 Videoupptagning för testning . . . 5 2.3 MAT . . . 6 2.4 Image Features . . . 6 2.5 Feature descriptors . . . 7 2.6 SIFT . . . 7 2.7 SURF . . . 9 2.8 Matches . . . 9 2.9 Homography matrix . . . 9 2.10 RANSAC . . . 10 2.10.1 Förutsättningar . . . 11

2.10.2 Fördelar och nackdelar . . . 11

3 Hårdvara 13 3.1 Gumstix Overo . . . 13

3.2 LinkBoard . . . 14

3.3 Firefly MV . . . 14

3.4 Samsung Galaxy S III . . . 14

4 Mjukvara 17 4.1 OpenCV . . . 17

(14)

x INNEHÅLL

4.2 Microsoft Visual Studio 2010 Express . . . 17

4.3 FFMPEG . . . 17

5 Resultat 19 5.1 Programmets uppbyggnad . . . 19

5.2 Matches - Gemensamma intressepunkter . . . 21

5.3 SIFT eller SURF som Feature detector . . . 21

5.4 Metod för Homography . . . 22 5.5 Smoothing/stabilizing . . . 23 6 Avslutande kommentarer 25 6.1 Slutsats . . . 25 6.2 Diskussion . . . 25 6.3 Utvecklingsmöjligheter . . . 26 Litteraturförteckning 27 A Bilder 31 B Källkod 41

(15)

1

Inledning

Kapitlet ger en introduktion till rapporten samt beskrivning av målsättningen med examensarbetet.

1.1

Allmänt om UAV

En UAV (Unmanned Aerial Vehicle) (Figur 1.1) är en form av förarlös flygfarkost som kan fjärrmanövreras eller köras autonomt. Det finns flera tillämpningsom-råden där UAV:er kan användas för både civila och militära ändamål. Exempel på civila tillämpningar är flygfotografering eller kartering. Militärt har UAV:er använts till spaning och vapeninsats.

1.2

Bakgrund

Utvecklingen av styralgoritmer för UAV:er, har gått fort de senaste åren, och det finns idag många aktörer som utvecklar teknik inom området. Om ett flertal UAV:er kan hålla en bestämd formation i luften är det möjligt att förse dessa med kamerutrustning och utnyttja detta för att exempelvis utföra flygfotografering av stora områden.

1.3

Företaget

I examensarbetet har företaget UAS Technologies Sweden AB medverkat. Det är ett spin-off företag från Linköpings Universitet som har funnits sedan 2008. Före-taget utvecklar systemlösningar inom UAV-teknologi och erbjuder även konsult-tjänster inom området.

(16)

2 1 Inledning

Figur 1.1:MikroUAV utrustad med kamera [2]

1.4

Syfte

Syftet med examensarbetet är att hitta en metod för att avkoda och sammanfoga bildinformationen som skickas från ett flertal UAV:er. Varje UAV är således för-sedd med en kamera som antingen tar stillbilder eller video. Genom att möjliggö-ra att flemöjliggö-ra UAV:er håller en fast formation i luften och samtidigt filmar eller tar bilder av marken, kan denna bildinformation fogas samman till en panoramabild som baseras på varje enskild UAV:s bildupptagningsområde. Sammanfogningen av bildinformationen kan antingen göras av UAV:erna själva vilket förutsätter att informationen kan sparas. Alternativt skickas bildinformationen till en marksta-tion som utför sammanfogningen.

1.5

Mål

Målet är att möjliggöra parallell avkodning av två videosekvenser samt att där-efter foga samman dessa till en video. Om möjlighet finns ska denna lösning implementeras på utrustning som UAS Technologies tillhandahåller.

1.6

Metod

Arbetsflödet har kretsat runt att inledningsvis bekanta sig med de termer och begrepp som används inom bildbehandling och datorseende. Därefter har fokus lagts på att skapa enkla program som utför fogning av två enstaka bilder och få en känsla för hur olika parametrar och tillvägagångssätt påverkar slutresultatet. Slutligen gjordes huvudprogrammet med fokus på bra slutresultat och användar-vänlighet.

1.6.1

Val av utvecklingsverktyg

I examensarbetet har utvecklingsverktyget OpenCV använts, som är ett program-bibliotek skrivet i C/C++ avsett för utveckling av bildbehandlingsapplikationer.

(17)

1.7 Avgränsningar 3

Detta innehåller funktioner som gör det möjligt att behandla såväl stillbilder som video, och ansågs därför passande för detta examensarbete.

1.6.2

Design av program

Programmet har utformats för att klara av att sammanfoga två videoströmmar. Olika metoder för att genomföra detta har testats och utvärderats. Bland annat testades möjligheten att i realtid sammanfoga videoströmmar från två kameror.

1.7

Avgränsningar

Avgränsningar av arbetet har krävts för att kunna färdigställa det på utsatt tid. Från början var det tänkt att hela lösningen skulle implementeras på utrustning som UAS Technologies tillhandahåller, men dessa tankar har fått överges då tid ej har funnits för att genomföra det. Även vissa metoder för att finna intressepunk-ter har ej hunnit testas.

(18)
(19)

2

Bakgrundsteori

I detta kapitel förklaras de teorier och begrepp som använts under arbetet, samt en del uttryck som är vanliga inom bildbehandling.

2.1

Digital video

Digital video består av ett antal digitala bilder som visas i snabb följd under en konstant hastighet. Varje bild brukar i detta sammanhang benämnas frame, och hastigheten på antalet frames brukar anges i frames per second (FPS). Varje frame består i sin tur av ett antal pixlar som anger bredd respektive höjd, och brukar kallas frame size och anges i WxH, det vill säga width*height. En pixel har som enda egenskap en färg, och denna färg representeras av ett antal bitar. Ju fler bitar som representerar varje pixel desto större färgåtergivning kan pixeln ha, och denna egenskap kallas color depth (CD). Ett exempel på detta är om en bild har ett CD-värde på 1-bit så kan den återge två stycken färger vilket motsvarar svartvitt. [12] [15]

När en digital video spelas in och lagras på ett lagringsmedium brukar den kom-primeras från s.k råformat. Råformat i detta fallet är bilddata som kommer direkt från kamerans bildsensor, och denna data behöver komprimeras för att kunna lagras, eftersom råformat annars skulle uppta väldigt stort lagringsutrymme. Ett exempel på vanligt förekommande komprimerat videoformat är MPEG-4.

2.2

Videoupptagning för testning

Under arbetet har videosekvenser tagna med antingen mobilkamera eller från en kamera som monterats på en UAV använts för att testa lösningen. En

(20)

6 2 Bakgrundsteori

ning för att kunna testa lösningen har varit att de två videosekvenser som ska sammanfogas har ett överlapp, det vill säga att det finns områden i bilden som täcks av båda sekvenserna. Detta har inneburit att de båda videosekvenserna ej spelats in parallellt utan något förskjutna i tid i förhållande till varandra då en-dast en kamera har funnits tillgänglig för detta arbetet.

2.3

MAT

När en bild lagras digitalt representeras den av en matris (Figur 2.1). I Open-CV kallas dessa matriser för Mat. Varje Mat-objekt består av två delar, dels en så kallad header-del som innehåller information om matrisen som till exempel storlek, var i minnet den lagras. Den andra delen är en pekare till den matris där alla pixelvärden finns lagrade. Detta innebär att när ett Mat-objekt kopieras, ändras endast header-delen i det nya objektet, medan pekaren pekar till samma data som den ursprungliga matrisen. Fördelen med detta är att onödig kopiering av data kan undvikas, vilket är en viktig aspekt eftersom bildbehandling ofta är beräkningstungt.

Figur 2.1:Exempel på hur en Mat är uppbyggd. [10]

2.4

Image Features

Intressepunkter eller image features är ett område i en bild som utmärker sig från sitt omedelbara närområde. Dessa skillnader kan vara t.ex. förändringar i färg eller konturer där det finns en tydlig gräns mellan två objekt i bilden. In-tressepunkter är viktiga då de används av olika algoritmer som t.ex. SIFT, för att kunna göra det möjligt att t.ex. känna igen objekt i bilder. [6]

(21)

2.5 Feature descriptors 7

2.5

Feature descriptors

Att beskriva ett bildområde med deskriptorer istället för med enstaka intresse-punkter, ger en stabilare beskrivning och gör att området kan detekteras i en annan bild även om bildens skalning ändras. Deskriptorerna representeras av vektorer som innehåller värden för de punkter som omger den aktuella intresse-punkten. Värdena räknas ut genom att beräkna magnituden av gradienterna för pixlarna. [1]

Nedan presenteras olika typer av image features som kan förekomma i en bild:

Edgesär punkter där de finns en gräns (eller kant) mellan två delar av bilden.

I allmänhet kan en kant vara nästintill vilken form som helst. Kanterna define-ras oftast som en uppsättning av punkter med stark gradientmagnitud. dessutom för vissa av de vanligaste algoritmerna kedjas de höggradienta punkterna tillsam-mans för att skapa en mer fullständing beskriving av en kant. Dessa algoritmer sätter ofta även gränser för egenskaperna hos en kant såsom form, jämnhet och gradientvärde.

Cornershänvisar till punkt-liknande funktioner i en bild. detta genom att till

exempel leta efter höga nivåer av krökning i bildgradienten, vilket gör att en liten ljuspunkt på en mörk bakgrund kan detekteras.

Blobsger en kompletterande beskrivning av bildens strukturer i termer av

regi-oner, i motsats till corners som är mer punktliknande. Dock innehåller de ofta en punkt (lokal maximum, eller en tyngdpunkt) vilket innebär att många blob-detektorer också kan betraktas som corners-blob-detektorer. blob-blob-detektorer kan upp-täcka områden som är för “mjuka” för att detekteras av corners.

Ridgekan ur praktisk synvinkel ses som en endimensionell kurva som

represen-terar en symmetriaxel, samt har dessutom ett attribut för lokal ridge bredd asso-cierad med varje ridge punkt. Men tyvärr är det algoritmiskt svårare att utvinna ridge funktioner från allmänna klasser av gråskalebilder än edges-, corners- eller blob funktioner.

2.6

SIFT

I examensarbetet används SIFT (Scale-Invariant Feature Transform) som metod för att ta fram intressepunkter i de båda videosekvenserna.

SIFT är en så kallad feature detector, som används inom datorgrafik för att gene-rera intressepunkter ur en bild. Detta görs genom att bildinnehållet transforme-ras till koordinater baserat på de objekt som finns med i bilden, och dessa koordi-nater kan sedan användas för att göra det möjligt att detektera samma objekt i en annan bild där det förekommer. Tekniken används inom flera områden som t.ex. objekt-igenkänning, 3D-modellering och rörelseigenkänning för att nämna någ-ra exempel. Speciellt har metoden ansetts lämplig då bilder ska fogas samman

(22)

8 2 Bakgrundsteori

eftersom det då behövs punkter i bilderna som överensstämmer som används. [7]

För att kunna genomföra en bra detektering krävs att de koordinater som läses in från ursprungsbilden går att detektera i bilden även om det finns otydligheter, ändrade ljusförhållanden eller att objektet förekommer i annan storlek. Detta kallas att transfomeringen av bilden är skalinvariant, vilket innebär att ett visst objekt kan kännas igen även om det förekommer i annan storlek eller har roterats. [7]

Beroende på bildinnehåll kan denna metod generera ett stort antal intressepunk-ter och det är inte ovanligt att bilder som är av storleken 500x500 pixlar ger över 2000 intressepunkter. Detta är särskilt viktigt inom objektdetektering för att göra det möjligt att finna små objekt i bilder. [7]

SIFT bygger i huvudsak på fyra steg:

1.Första steget innebär att bilden filtreras i flera steg med olika filterparametrar.

För varje ändring på filtreringen tas differensen mellan den föregående bilden och den senast filtrerade. Ur detta fås max och min-värden som motsvarar intres-sepunkterna.

Detta kan beskrivas enligt följande:

D(x, y, σ ) = L(x, y, kiσ ) − L(x, y, kjσ ) (2.1)

där

L(x, y, kσ ) (2.2)

är faltningen av den ursprungliga bilden

I(x, y) (2.3)

med en Gaussisk funktion

G(x, y, kσ ) (2.4)

där skalningen motsvaras av

(2.5)

Detta ger uttrycket:

L(x, y, kiσ ) = G(x, y, kσ ) ∗ I(x, y) (2.6)

2.När föregående steg utförts fås ett stort antal punkter, varav flera av dessa är

instabila dvs har låg kontrast, vilket betyder att de är känsliga för brus. Dessa filtreras bort för att öka stabiliteten.

3. I detta steg tilldelas varje intressepunkt ett antal riktningar som baseras på

lokala gradienter som beräknas utifrån angränsande pixlar som omger intresse-punkten i bilden. Detta görs för att intresse-punkten ska vara oberoende av om bilden roteras.

(23)

2.7 SURF 9

4.Föregående steg har utförts för att säkerställa att punkterna är opåverkade av

bildens skala, rotation, samt var i bilden punkten lokaliserats. Som sista steg be-räknas en vektor till varje punkt för att göra punkten mer distinkt mot störningar i bilden eller ändrad ljussättning.

2.7

SURF

SURF (Speeded Up Robust Features) är en algoritm använd inom datorseende för att finna intressepunkter i en bild och kan i likhet med SIFT användas då man vill finna punkter i två eller flera bilder som är lika, i syfte att foga dessa samman till en bild. Den främsta anledningen att använda SURF jämfört med SIFT är att SURF är en snabbare algoritm samt att resultatet är jämförbart. Anledningen till att SURF är snabbare är att algoritmen består av endast tre steg, till skillnad mot SIFT som består av fyra steg. [5]

2.8

Matches

Matches kallas de intressepunkter i två bilder vars egenskaper överensstämmer. Sökning efter intressepunkter genererar ofta ett stort resultat och en del av de punkter som hittas är felaktiga och leder till att fogningen av bilderna misslyckas, vilket märks av att slutresultatet blir instabilt och att bildstörningar uppstår. För att på ett effektivt sätt kunna ta fram de punkter som stämmer överens i bilderna, dvs välja ut de punkter som ligger närmast varandra i de båda bilderna, behöver en sökning efter dessa göras. En sådan sökning kallas Nearest Neighbor Search (NNS), som är ett optimeringsproblem som förekommer i flera tillämpningar då man vill hitta närmsta avståndet mellan två objekt i en datamängd. Detta görs av en funktion som heter FLANN som står för Fast Library for Approximate Nearest Neighbor. [8]

Det finns även en alternativ metod till FLANN som heter BruteForceMatcher. Denna arbetar genom att ta en intressepunkt från en bild och finna den närmast matchande punkten i andra bilden genom att jämföra med var och en av intresse-punkterna i den andra bilden.

2.9

Homography matrix

Homography är den funktion som beskriver hur en bild ska förvrängas för att kompensera för perspektiv och avstånd. Om ingen metod specificeras använder funktionen alla matchande punktpar för att beräkna homografi-uppskattningen med en enkel minsta kvadrat-metod. Dock kan detta ge dåliga resultat om det finns många outliers eller falska matches (Figur 2.2).

(24)

10 2 Bakgrundsteori

Figur 2.2: Exempel på hur det kan

se ut när alla punktpar används.

Figur 2.3:Exempel på hur det kan

se ut om bara de bästa punktparen används.

Då kan LMEDS (Least-Median robust method) eller RANSAC (Random Sample Consensus) användas istället (Figur 2.3). LMEDS används inte i examensarbetet då de initiala försöken med denna funktion gav dåliga resultat och på grund av tidsbegränsning kunde denna metod inte testas med grundlighet. [11]

2.10

RANSAC

Ransac (Random Sample Consensus) är en iterativ metod för att anpassa en mate-matisk modell till en given datamängd. Som indata till algoritmen ges en mängd punkter och en matematisk modell som kan anpassas till punkterna, samt di-verse inställningsparametrar som t,ex antal iterationer och tröskelvärde för att bestämma när en given punkt kan anpassas till modellen. [9]

Metoden arbetar genom att välja ut en slumpmässigt vald delmängd av den givna datan. De data som går att anpassa till modellen benämns inliers, och de data som ej går att anpassa till modellen benämns outliers. De data som väljs ut antas vara inliers och därefter utförs ett antal tester för att utvärdera om så är fallet. [9] Ett slumpmässigt antal punkter väljs ut. En modell anpassas till de givna punk-terna. Därefter beräknas avståndet till de övriga punkterna i mängden utifrån modellen. De punkter som ligger inom tröskelvärdet räknas som inliers, resten antas vara outliers. [9]

(25)

2.10 RANSAC 11

Dessa steg genomförs ett bestämt antal gånger. Som resultat fås antingen en mo-dell som förkastas då alltför få punkter kan klassas som inliers, eller en förfinad modell.

2.10.1

Förutsättningar

För att metoden ska fungera krävs ett antal inparametrar:

• En datamängd D = {di}som innehåller totalt N = |D| punkter.

• En funktion F (S) som beräknar modellparametern p utifrån en delmängd S av totala antalet punkter i datamängden. Här eftersträvas att lägsta möjliga antalet punkter M = |S| används för att beräkna modellen på ett så effektivt sätt som möjligt.

• En kostnadsfunktion ρ (p, di) för att i varje punkt di beräkna kostnaden.

Denna kostnad baseras på jämförelser av hur nära punkterna ligger den an-passade modellen givet ett tröskelvärde k. Om en punkt klassas som outlier dvs di>k, sätts ρ = 1, om inte sätts ρ = 0. Totala kostnaden ges av:

C = s PN i=1ρ (di) N (2.7) Exempel

Figur 2.4: En datamängd med

många outliers. [9]

Figur 2.5:linje med RANSAC,

outli-ers har inte något inflytande på re-sultatet. [9]

2.10.2

Fördelar och nackdelar

En av fördelarna med RANSAC som metod är att den kan ge bra modeller trots att antalet outliers i den givna datamängden är stort. En nackdel är att metoden är tidskrävande samt att det kan krävas mycket justeringar av parametrarna innan ett bra resultat fås. [9]

(26)
(27)

3

Hårdvara

Här ges en genomgång av den hårdvara som sitter monterad på flygfarkosterna och som använts när bildmaterial har inhämtats

3.1

Gumstix Overo

Figur 3.1:Gumstix Overo [13]

Detta är en enkortsdator som har ett Linux operativsystem installerat och proces-sorn är en ARM Cortex A8-processor som arbetar i 600 Mhz. Ramminnet är 256 Mb och lagringsutrymmet består av ett SD-kort som kan lagra 16 GB. Till denna enhet går det att ansluta en kamera för att möjliggöra bildupptagning.

Kommunikationen mellan farkosterna och markstationen utgörs av Wi-Fi 802.11 b/g.[16]

(28)

14 3 Hårdvara

3.2

LinkBoard

LinkBoard är en enhet som används för att sköta styrning av farkosterna. Varje enhet har stöd för anslutning av GPS-mottagare, lasersensor för avståndsmätning. [16]

Figur 3.2:Linkboard IV. [14]

3.3

Firefly MV

Detta är kameran som var monterad på UAV:n när testbilderna togs. Firefly MV line erbjuder elva olika kombinationer av CMOS bildsensor (0,3 och 1,3 MP), formfaktor (board-level and housed) och gränssnitt (FireWire och USB 2.0) som är utformade för att hantera en mängd olika tillämpningar inom industri och icke-industriell avbildning. [3]

Figur 3.3:Firefly MV. [3]

3.4

Samsung Galaxy S III

Kameran från en Samsung Galaxy s III har använts under arbetet för att få till-gång till testbilder innan UAV:n kunde används och för att få högre upplösta bilder (8 megapixlar). [4]

(29)

3.4 Samsung Galaxy S III 15

(30)
(31)

4

Mjukvara

Detta kapitel förklarar kortfattat vilka mjukvaror som använts under examensar-betets gång.

4.1

OpenCV

OpenCV är ett programbibliotek avsett för programutveckling inom bildbehand-ling och datorseende och utvecklades ursprungligen av Intel. Det baseras på öp-pen källkod och kan användas på flertalet plattformar som Windows, Linux, Mac OS och Android. Från början skrevs OpenCV i C, men har senare implementerats i C++. Det finns även stöd för andra programspråk som t.ex. Java, Python och Ru-by.

4.2

Microsoft Visual Studio 2010 Express

Microsoft visual Studio är en programutvecklingsmiljö från Microsoft med stöd för de flesta programspråken såsom C/C++, C# och Phyton. Under examensarbe-tet har Visual Studio används för att skriva och testa all C++-kod.

4.3

FFMPEG

FFMPEG är ett program som används för att spela in, komprimera samt spela upp ljud och video. Det bygger på öppen källkod och har stöd för ett stort antal format. Detta program finns integrerat i OpenCV.

(32)
(33)

5

Resultat

I detta kapitel visas resultatet efter implementering av tekniker beskrivna i ti-digare kapitel, såväl som jämförelser mellan olika tekniker. Förslag på förbätt-ringar och utvecklingsmöjligheter diskuteras. Bilderna i detta kapitel finns även i appendix A fast i större skala.

5.1

Programmets uppbyggnad

Programmet som utgör lösningen för detta examensarbete kan illustreras med nedanstående flödesdiagram (Figur 5.1).

Figur 5.1:Flödesschema för program.

Programmet är uppbyggd så att användaren bara behöver välja de två filerna som ska sammanfogas och var den ska sparas. då sparas bara slutresultatet (Figur 5.2). Användaren kan även specificera om någon annan metod ska användas så som SURF istället för standardmetoden SIFT. Dessutom kan inställningar för olika parametrar göras.

(34)

20 5 Resultat

Figur 5.2:Exempel på resultat.

Det finns även möjlighet att spara info-resultatet (Figur 5.3) för enklare debugg-ning, jämföra resultatet och se matchningar.

Figur 5.3:Illustration av Info-resultat.

Medan programmet körs skrivs även information ut för varje bild i kommando-tolken (Figur 5.4) där spalterna representerat bild nr, antal matchningar och exekveringstid för det bildparet.

(35)

5.2 Matches - Gemensamma intressepunkter 21

Figur 5.4:Exempel tabell för BF-SIFT.

5.2

Matches - Gemensamma intressepunkter

Under arbetet har BruteForceMatcher och FlannBasedMatcher använts. Flann an-ses generellt vara snabbare än BruteForce då den inte testar alla intressepunkter mot varandra. Trots det är BruteForce både snabbare och ger ett bättre resultat i våra tester. (Figur 5.5) (Figur 5.6)

5.3

SIFT eller SURF som Feature detector

Under arbetets gång har tester med båda metoderna utförts. Bildsekvenser med olika upplösningar har prövats samt flertalet olika parameterinställningar har ut-värderats. Med utgångspunkt från dessa tester kan man konstatera att SIFT är en kraftfullare metod i fråga om att hitta intressepunkter. Vid tester med bildsekven-ser av en viss upplösning, märktes ett klart bättre slutresultat vid användande av SIFT då antalet bilder som blev förvanskade på grund av att de inte gick att foga samman tydligt minskade. SURF har även ett mycket mer varierat resultat när det kommer till matches (Figur 5.8). den har gett matches över 6000 på testklip-pen, problemet med detta är att många av dessa matches är falska. men SURF kan även ge färre än fyra matches vilket gör att den bilden inte kan användas (Figur 5.7).

(36)

22 5 Resultat

Figur 5.5:BFMatcher.

Figur 5.6:FlannBasedMatcher.

Figur 5.7:BF-SURF.

5.4

Metod för Homography

Om alla punktpar används misslyckas fogningen av i stort sett varje bildpar. En-dast ett litet antal lyckas, vilket inte är acceptabelt. Detta beror på att det finns för stor andel falska matches (Figur 5.9) med i den mängd av totala matches, som används för att beräkna homografi-matrisen. Detta leder till att bilden blir förvrängd och otydlig (Figur 5.10). Om istället RANSAC används fås ett bra re-sultat. Detta eftersom antalet falska matches blir lägre.

(37)

5.5 Smoothing/stabilizing 23

Figur 5.8:Tabell för BF-SURF. Tabellen anger antalet matchande punkter för

varje bildpar samt antalet sekunder det tar att foga samman varje bildpar.

5.5

Smoothing/stabilizing

För att undvika att videon ska bli för fladdrig och ryckig används en medelvär-desbildning av homografin för att ändra perspektivet på en av bilderna. Detta görs genom att föregående värden för homografi-matrisen sparas, och används i beräkningen av den nya matrisen. På så vis fås en mjukare övergång mellan varje fogning och då blir bilden som tänkt mer stabil.

(38)

24 5 Resultat

Figur 5.9:Exempel på falska matches.

(39)

6

Avslutande kommentarer

I detta avslutande kapitel summeras examensarbetet med en slutsats och avslu-tande diskussion av resultatet. Till sist ges förslag till framtida förbättringar och utvecklingsmöjligheter.

6.1

Slutsats

En metod för att kunna foga samman två videosekvenser till en panoramavideo har presenterats i denna rapport ihop med olika tekniker som används bland an-nat inom datorseende och objekt-igenkänning. Programmet är enkelt uppbyggt för att lätt kunna vidareutvecklas och anpassa parametrarna till olika kameror och bildupplösning. Resultatet blir bra så länge det är mycket överlapp eller att bilderna är högupplösta. De största problemen under arbetet har varit:

• Hitta bra parametrar för kameran som använts.

• Eftersom exekveringstiden är väldigt lång blir det svårt att göra snabba tes-ter med olika parametrar.

• Vår begränsade erfarenhet av bildbehandling.

6.2

Diskussion

Detta examensarbetet har lagt en grund för sammanfogning av bilder från UAV:er. Men har inte kunnat testas under flygning utan bara från exempel bilder från UAV:ns kameror. Förhoppningsvis kan en implementering göras vilket borde va-ra fullt möjligt. Som ett första steg mot att involveva-ra fleva-ra UAV:er kan man tänka sig att två UAV:er flyger i formation och skickar sina respektive bilddata till en

(40)

26 6 Avslutande kommentarer

markstation. När detta har uppnåtts med bra resultat, kan en tredje UAV ansluta sig till formationen. På detta vis kan man stegvis öka antalet involverade UAV:er och då successivt få en allt större panoramavideo som slutresultat.

All sammanfogning kan inledningsvis göras i icke-realtid dvs att videoupptag-ning och sammafogvideoupptag-ning görs i separata steg. Efterhand kan man tänka sig att vi-deoupptagning och sammafogning görs i realtid för att då kunna se resultatet av UAV:ernas bildupptagning omedelbart. Detta ställer förstås krav på att det finns en bra överföringslänk från UAV:erna till markstationen samt att övrig hårdvara och mjukvara klarar av de krav på prestanda som då blir större.

En förutsättning för att ovanstående ska vara möjligt är att det finns en regler-metod som gör att UAV:erna kan hålla formation samt att det går att ansluta godtyckligt många UAV:er beroende på hur stort bildupptagningsområde som önskas.

6.3

Utvecklingsmöjligheter

För att få en bättre skarv mellan de fogade videosekvenserna kan en teknik som heter blending användas. Det innebär att skarven görs mindre synlig genom att områdena som omger skarven kombineras på ett sätt så att skarven blir näst in-till osynlig. Detta är en viktig teknik för att få en bra kvalitet på den slutliga panoramavideon. I examensarbetet testades en blendningsmetod som heter Pyra-midBlending. Det gick tydligt att se att skarven blev mindre framträdande, men som nackdel blev bildens proportioner felaktiga, vilket gjorde att metoden valdes bort. Dock kommer det bli viktigt senare när ett större antal videosekvenser ska fogas samman.

En annan förbättring kan vara att göra det möjligt att foga samman videosekven-ser som har ett dynamiskt överlapp. Den nuvarande lösningen förutsätter att vi-deosekvenserna har ett överlapp i horisontalled, och därför finns ej möjligheten att foga samman videosekvenser som har ett annat överlapp än i horisontalled. Genom att implementera lösningen på den utrustning som används på UAV:erna går det att bättre utvärdera hur effektiv lösningen är och bestämma vad som even-tuellt behöver ändras. All testning av lösningen har gjorts på PC-datorer, och med anledning av det går det inte att säga huruvida lösningen fungerar på den hårdvara som finns på UAV:erna, eftersom dessa är utrustade med annan proces-sorarkitektur och annat operativsystem.

(41)

Litteraturförteckning

[1] Gary Bradski and Adrian Kaehler. Learning OpenCV: Computer Vision with the OpenCV Library. O’Reilly Media, first edition, 2008. Cited on page 7.

[2] Dkroetsch. Aeryon scout with camera (internet),

2011 April 5 (cited 2013 juni 3). Available from:

http://commons.wikimedia.org/wiki/File:Aeryon_Scout_With_Camera .jpg. Cited on page 2.

[3] Point Grey. Firefly ®mv (internet), 2011

april (cited 2013 juni 3). Available from:

http://www.ptgrey.com/products/fireflymv/fireflymv_usb_firewire_cmos-_camera.asp. Cited on page 14.

[4] Hector. Samsung galaxy s3 review (internet), 2012 Aug 21 (cited 2013 ju-ni 6). Available from: http://www.talesofinterest.net/samsung-galaxy-s3-review/. Cited on pages 14 and 15.

[5] Andreas Ess Herbert Bay. Speeded-up robust features (surf)

(in-ternet), 2008 September 10 (cited 2013 juni 6). Available from:

ftp.vision.ee.ethz.ch/publications/articles/eth_biwi_00517.pdf. Cited on

page 9.

[6] Tinne Tuytelaars Krystian Mikolajczyk. Color bit depth

[in-ternet], 2008 dec 14 (cited 2013 juni 3). Available from:

http://xm2vtsdb.ee.surrey.ac.uk/CVSSP/Publications/papers/Mikolajczyk-EB-2008.pdf. Cited on page 6.

[7] David G. Lowe. Distinctive image features from scale-invariant

key-points (internet), 2004 January 5 (cited 2013 juni 6). Available from:

http://www.cs.ubc.ca/ lowe/papers/ijcv04.pdf. Cited on page 8.

[8] David G. Lowe Marius Muja. Fast approximate nearest neighbors with auto-matic algorithm configuration (internet), 2009. http://people.cs.ubc.ca/ ma-riusm/uploads/FLANN/flann_visapp09.pdf. Cited on page 9.

(42)

28 Litteraturförteckning

[9] Mnm. Ransac (internet), 4 June 2013 (cited 2013 juni 5).

http://en.wikipedia.org/wiki/RANSAC. Cited on pages 10 and 11.

[10] OpenCV. Mat - the basic image container (internet), 2012 feb

5 (updated 2012 Apr 28; cited 2013 juni 3). Available from:

http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/-mat_the_basic_image_container.html. Cited on page 6.

[11] OpenCV. Camera calibration and 3d reconstruction

(inter-net), 2012 feb 5 (updated 2012 Apr 28; cited 2013 juni 3).

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d-_reconstruction.html. Cited on page 10.

[12] photopursue. Digital video basics (internet), 2010 (cited 2013 juni 3). Avai-lable from: http://www.photopursue.com/color-bit-depth.html. Cited on page 5.

[13] Shridhar Shah. Quadrotor control (internet), 2004

January 5 (cited 2013 juni 6). Available from:

https://www.sites.google.com/site/shridharshah/projects/quadrotor-control. Cited on page 13.

[14] Uas tech. Linkboard iii (internet), 2009 (cited 2013 juni 6). Available from: http://www.uastech.com/linkboard.htm. Cited on page 14.

[15] telairity. Color bit depth (internet), 2010 (cited 2013 juni 3). Available from: http://www.telairity.com/assets/downloads/Digital%20Video%20Basics.pdf. Cited on page 5.

[16] Uastech. Linkboard iv [internet]. Available from:

http://www.uastech.com/linkboard.htm. Cited on pages 13 and 14. *)

(43)
(44)
(45)

A

Bilder

(46)

32 A Bilder

(47)

33

(48)

34 A Bilder

(49)

35

(50)

36 A Bilder

(51)

37

(52)

38 A Bilder

(53)

39

(54)
(55)

B

Källkod

1 # i n c l u d e<iostream > 3 # i n c l u d e< s t r i n g > # i n c l u d e< c s t d l i b > 5 # i n c l u d e<sstream > # i n c l u d e<ctime > 7 # i n c l u d e<numeric> 9 # i n c l u d e<opencv2 \ c o r e \ c o r e . hpp>

# i n c l u d e<opencv2 \ imgproc \ imgproc . hpp> 11 # i n c l u d e<opencv2 \ f e a t u r e s 2 d \ f e a t u r e s 2 d . hpp>

# i n c l u d e<opencv2 \ highgui \ highgui . hpp> 13 # i n c l u d e<opencv2 \ n o n fr e e \ n o n f re e . hpp> # i n c l u d e<opencv2 \ n o n f r e e \ f e a t u r e s 2 d . hpp> 15 # i n c l u d e<opencv2 \ c a l i b 3 d \ c a l i b 3 d . hpp> 17 using namespace cv ; 19

void r o t a t e ( cv : : Mat& s r c , doubleangle , cv : : Mat& d s t ) 21 {

i n t l e n = s t d : : max ( s r c . c o l s , s r c . rows ) ; 23 cv : : P o i n t 2 f pt ( l e n / 2 . , l e n / 2 . ) ;

cv : : Mat r = cv : : getRotationMatrix2D ( pt , angle , 1 . 0 ) ; 25 cv : : warpAffine ( s r c , dst , r , cv : : S i z e ( len , l e n ) ) ;

} 27

i n t main ( ) 29 { /*

VideoCapture cap ( " C:\\1 30516\\ 6\\ frame0000 . j p g " ) ;

31 VideoWriter out ( " C : \ \ 6 . a v i " , CV_FOURCC( ’M ’ , ’ J ’ , ’ P ’ , ’G ’ ) , 1 5 . 0 , cv : : S i z e ( cap . g e t (CV_CAP_PROP_FRAME_WIDTH) , cap . g e t ( CV_CAP_PROP_FRAME_HEIGHT) ) , 1 ) ;

Mat frame ;

33

i n t i = 0 ;

35 Mat image1 = imread ( " C:\ \130516 \\6\\ frame0000 . j p g " ) ; i f ( image1 . empty ( ) | | ! out . isOpened ( ) )

37 { s t d : : cout << " Cannot open video d e v i c e or f i l e ! " << s t d : : endl ; r e t u r n −1;} while ( i <10) 39 { s t r i n g b i l d = "C:\\130 516\\6\ \ frame000 " ; 41 s t r i n g ending = " . j p g " ; s t d : : o s t r i n g s t r e a m c o n v e r t ; 43 c o n v e r t << i ; s t r i n g Res = b i l d + c o n v e r t . s t r ( ) + ending ;

45 s t d : : cout << Res << s t d : : endl ; VideoCapture cap ( Res ) ;

47 cap >> frame ;

i f ( frame . empty ( ) | | ! out . isOpened ( ) )

49 { s t d : : cout << " Cannot open video d e v i c e or f i l e ! " << s t d : : endl ; r e t u r n −1;} out . w r i t e ( frame ) ;

51 i ++; }

(56)

42 B Källkod 53 while ( i <100) { 55 s t r i n g b i l d = "C: \\13051 6\\6\\ frame00 " ; s t r i n g ending = " . j p g " ; 57 s t d : : o s t r i n g s t r e a m c o n v e r t ; c o n v e r t << i ; 59 s t r i n g Res = b i l d + c o n v e r t . s t r ( ) + ending ; s t d : : cout << Res << s t d : : endl ;

61 VideoCapture cap ( Res ) ; cap >> frame ;

63 i f ( frame . empty ( ) | | ! out . isOpened ( ) )

{ s t d : : cout << " Cannot open video d e v i c e or f i l e ! " << s t d : : endl ; break ; }

65 out . w r i t e ( frame ) ; i ++; 67 } while ( i <1000) 69 { s t r i n g b i l d = "C:\\130 516\\6\ \ frame0 " ; 71 s t r i n g ending = " . j p g " ; s t d : : o s t r i n g s t r e a m c o n v e r t ; 73 c o n v e r t << i ; s t r i n g Res = b i l d + c o n v e r t . s t r ( ) + ending ;

75 s t d : : cout << Res << s t d : : endl ; VideoCapture cap ( Res ) ;

77 cap >> frame ;

i f ( frame . empty ( ) | | ! out . isOpened ( ) )

79 { s t d : : cout << " Cannot open video d e v i c e or f i l e ! " << s t d : : endl ; break ; } out . w r i t e ( frame ) ; 81 i ++; } 83 out . r e l e a s e ( ) ; waitKey ( 0 ) ; 85 r e t u r n 0 ;*/ 87 boolShowKeyPoints = f a l s e; bool r o t a t e 9 0 =f a l s e; 89 booluse_SIFT = t r u e; booluse_BF =t r u e; 91 i n t minHessian = 4 0 0 ; double c o n t r a s t T h r e s h o l d = 0 . 0 1 ; 93 doubleedgeThreshold = 5 . 0 ; // 10 double m a g n i f i c a t i o n = 2 . 0 ;// 5 95 i n t framecount = 0 ; i n t t 0 = c l o c k ( ) ; 97 s t d : : v e c t o r <double> vec ; i n t c u r r =0; 99 VideoCapture c a p t u r e ; 101 VideoCapture c ap t u r e2 ; c a p t u r e . open ("C: \ \ high_window1 . mp4") ; 103 c ap t u re 2 . open ("C: \ \ high_window2 . mp4") ;

VideoWriter out ("C: \ \ t e x t t e s t . a v i ", CV_FOURCC(’D ’,’ I ’,’V ’,’X ’) , c a p t u r e . g e t ( CV_CAP_PROP_FPS ) , // ( ’H ’ , ’ 2 ’ , ’ 6 ’ , ’ 4 ’ )

105 cv : : S i z e ( 4* capture . get (CV_CAP_PROP_FRAME_WIDTH) ,2* capture . get (CV_CAP_PROP_FRAME_HEIGHT) ) , 1 ) ;

// i n t f p s = c a p t u r e . g e t ( CV_CAP_PROP_FPS ) ;

107 i f ( ! c a p t u r e . isOpened ( ) | | ! c a pt u r e2 . isOpened ( ) | | ! out . isOpened ( ) ) { s t d : : cout <<" Cannot open video d e v i c e or f i l e ! "<< s t d : : endl ; 109 waitKey ( 1 0 0 0 0 ) ;

r e t u r n −1;} 111

Mat gray_img1 , gray_img2 , frame1 , frame2 , H_old , H_old2 ; 113 f o r( i n t i =0; i <20; i ++) { 115 c a p t u r e >> frame2 ; } 117 //namedWindow ( " video " ) ; 119 while(t r u e) { 121 doublet 1 = c l o c k ( ) ; c a p t u r e >> frame1 ; 123 c ap t u re 2 >> frame2 ;

i f ( frame1 . empty ( ) | | frame2 . empty ( ) ) 125 break;

i f( r o t a t e 9 0 ==t r u e) { 127 r o t a t e ( frame1 , −90, frame1 ) ;

r o t a t e ( frame2 , −90, frame2 ) ;

129 }

c v t C o l o r ( frame1 , gray_img1 , CV_RGB2GRAY) ; 131 c v t C o l o r ( frame2 , gray_img2 , CV_RGB2GRAY) ;

133 // D e t e c t t h e k e y p o i n t s using SURF D e t e c t o r S i f t F e a t u r e D e t e c t o r d e t e c t o r ( 0 , 3 , 0 . 0 3 , 1 5 , 1 . 6 ) ; 135 S i f t D e s c r i p t o r E x t r a c t o r e x t r a c t o r ; // i f ( use_SIFT == f a l s e ) { 137 // S u r f F e a t u r e D e t e c t o r d e t e c t o r ( minHessian ) ; // S u r f D e s c r i p t o r E x t r a c t o r e x t r a c t o r ; 139 // } s t d : : v e c t o r <KeyPoint > k e y p o i n t s _ o b j e c t , k e y p o i n t s _ s c e n e ; 141 d e t e c t o r . d e t e c t ( gray_img1 , k e y p o i n t s _ o b j e c t ) ;

(57)

43 143 d e t e c t o r . d e t e c t ( gray_img2 , k e y p o i n t s _ s c e n e ) ; 145 // C a l c u l a t e d e s c r i p t o r s Mat d e s c r i p t o r s _ o b j e c t , d e s c r i p t o r s _ s c e n e ; 147 e x t r a c t o r . compute ( gray_img1 , k e y p o i n t s _ o b j e c t , d e s c r i p t o r s _ o b j e c t ) ; 149 e x t r a c t o r . compute ( gray_img2 , k e y p o i n t s _ s c e n e , d e s c r i p t o r s _ s c e n e ) ; Mat output ; 151 // Matching d e s c r i p t o r v e c t o r s

153 BFMatcher matcher (NORM_L2) ;

// i f ( use_BF == f a l s e ) {

155 // FlannBasedMatcher matcher ; // }

157

s t d : : v e c t o r < DMatch > matches ;

159 matcher . match ( d e s c r i p t o r s _ o b j e c t , d e s c r i p t o r s _ s c e n e , matches ) ;

161 // i f ( ShowKeyPoints == t r u e ) // show a l l matches found // {

163 //Mat allimg_matches ;

// drawMatches ( gray_img1 , k e y p o i n t s _ o b j e c t , gray_img2 , k e y p o i n t s _ s c e n e , matches , allimg_matches ) ;

165 //namedWindow ( " a l l Matches " ) ; // imshow ( " a l l Matches " , allimg_matches ) ;

167 // imwrite ( " C: \ \ matches . j p g " , allimg_matches ) ; // resizeWindow ( " a l l Matches " , 4 0 0 , 6 0 0 ) ;

169 // }

double max_dist = 0 ;double min_dist = 1 0 0 ; 171

// Quick c a l c u l a t i o n o f max and min d i s t a n c e s between k e y p o i n t s

173 f o r(i n t i = 0 ; i < d e s c r i p t o r s _ o b j e c t . rows ; i ++) { double d i s t = matches [ i ] . d i s t a n c e ; 175 i f( d i s t < min_dist ) min_dist = d i s t ; i f( d i s t > max_dist ) max_dist = d i s t ; 177 } 179 framecount ++; s t d : : cout << framecount ; 181

// Use only " good " matches ( i . e . whose d i s t a n c e i s l e s s than 3* min_dist )

183 s t d : : v e c t o r <DMatch> good_matches ;

185 f o r( i n t i = 0 ; i < d e s c r i p t o r s _ o b j e c t . rows ; i ++ ) { i f( matches [ i ] . d i s t a n c e <= 3* min_dist ) 187 { good_matches . push_back ( matches [ i ] ) ; }

189 }

s t d : : cout << " "<< good_matches . s i z e ( ) ; // p r i n t nr o f good frames found

191 i f( good_matches . s i z e ( ) == 0 ) {

193 s t d : : cout << " No good matches \n ";r e t u r n −1;}

195 // i f ( ShowKeyPoints == t r u e ) // shows a l l " good " matches found // {

197 Mat img_matches ;

drawMatches ( gray_img1 , k e y p o i n t s _ o b j e c t , gray_img2 , k e y p o i n t s _ s c e n e , good_matches , img_matches , S c a l a r ( 0 , 255 , 0 ) , S c a l a r ( 2 5 5 , 0 , 0 ) , v e c t o r <char> ( ) ,

199 DrawMatchesFlags : : NOT_DRAW_SINGLE_POINTS) ;

//namedWindow ( " Good matches " ) ;

201 // resizeWindow ( " Good matches " , 4 0 0 , 6 0 0 ) ; // imshow ( " Good matches " , img_matches ) ;

203 imwrite ("C: \ \ good_matches . j p g ", img_matches ) ;

// waitKey ( 0 ) ; 205 // } 207 s t d : : v e c t o r <P o i n t 2 f > o b j ; s t d : : v e c t o r <P o i n t 2 f > s c e n e ; 209 f o r(i n t i = 0 ; i < good_matches . s i z e ( ) ; i ++) { 211 //−−Get t h e k e y p o i n t s from t h e good matches

o b j . push_back ( k e y p o i n t s _ o b j e c t [ good_matches [ i ] . queryIdx ] . pt ) ; 213 s c e n e . push_back ( k e y p o i n t s _ s c e n e [ good_matches [ i ] . t r a i n I d x ] . pt ) ;

}

215 // Find t h e Homography Matrix

Mat H = findHomography ( obj , scene , CV_RANSAC) ; 217 //H = (H+H_old+H_old2 ) / 3 ;

// H_old2 = H_old ;

219 H = (H+H_old ) / 2 ; H_old = H; 221

// Use t h e Homography Matrix t o warp t h e images

223 Mat r e s u l t ;

225 w a r p P e r s p e c t i v e ( frame1 , r e s u l t , H, cv : : S i z e ( frame1 . c o l s +frame2 . c o l s , frame1 . rows ) , INTER_LINEAR , BORDER_TRANSPARENT) ;

cv : : Mat h a l f ( r e s u l t , cv : : Rect ( 0 , 0 , frame2 . c o l s , frame2 . rows ) ) ; 227 frame2 . copyTo ( h a l f ) ;

imwrite ("C: \ \ BFSIFTRESULT . j p g ", r e s u l t ) ; 229

S i z e sz1 = frame1 . s i z e ( ) ; 231 S i z e sz2 = img_matches . s i z e ( ) ;

(58)

44 B Källkod

S i z e sz3 = r e s u l t . s i z e ( ) ;

233 Mat save ( 2* sz1 . height , 4* sz1 . width , CV_8UC3) ; 235 Mat t o p L e f t 1 ( save , Rect ( 0 , 0 , sz1 . width , sz1 . h e i g h t ) ) ;

frame1 . copyTo ( t o p L e f t 1 ) ;

237 Mat t o p L e f t 2 ( save , Rect ( sz1 . width , 0 , sz1 . width , sz1 . h e i g h t ) ) ; frame2 . copyTo ( t o p L e f t 2 ) ;

239 Mat t o p R i g h t ( save , Rect ( 2* sz1 . width , 0 , sz2 . width , sz2 . height ) ) ;

// allimg_matches . copyTo ( t o p R i g h t ) ;

241 Mat l o w e r L e f t ( save , Rect ( 0 , sz1 . height , sz3 . width , sz3 . h e i g h t ) ) ; r e s u l t . copyTo ( l o w e r L e f t ) ;

243 //Mat lowerRight ( save , Rect ( 2* sz1 . width , sz1 . height , sz2 . width , sz2 . height ) ) ;

img_matches . copyTo ( t o p R i g h t ) ; 245 // imshow ( " save " , save ) ;

// imwrite ( " C: \ \ save . j p g " , save ) ;

247

vec . push_back ( good_matches . s i z e ( ) ) ;

249 doublea v e r a g e = s t d : : accumulate ( vec . begin ( ) , vec . end ( ) , 0 ) / vec . s i z e ( ) ; 251 doublet 2 = c l o c k ( ) ;

doublef p s = framecount / ( ( t2−t 0 ) /double( CLOCKS_PER_SEC ) ) ; 253 s t r i n g FPS =" FPS : ";

s t r i n g fframe = " Frame : ";

255 s t r i n g p r o c t e x t = " P r o c e s s i n g time / frame : "; s t r i n g nr ofm at che rs = " nr o f matches : "; 257 s t r i n g avrgmatches =" avrg matches ";

s t d : : o s t r i n g s t r e a m c o n v e r t ; 259 s t d : : o s t r i n g s t r e a m frameconvert ; s t d : : o s t r i n g s t r e a m p r o c c o n v e r t ; 261 s t d : : o s t r i n g s t r e a m matchesconvert ; s t d : : o s t r i n g s t r e a m a v e r a g e c o n v e r t ; 263 c o n v e r t << f p s ; frameconvert << framecount ; 265 p r o c c o n v e r t << ( t2−t 1 ) /double( CLOCKS_PER_SEC ) ; matchesconvert << good_matches . s i z e ( ) ; 267 a v e r a g e c o n v e r t << a v e r a g e ; s t r i n g Res = FPS + c o n v e r t . s t r ( ) ;

269 s t r i n g framenr = fframe + frameconvert . s t r ( ) ; s t r i n g proccount = p r o c t e x t + p r o c c o n v e r t . s t r ( ) ; 271 s t r i n g nrmatches = nro fma tc her s + matchesconvert . s t r ( ) ;

s t r i n g avgr = avrgmatches + a v e r a g e c o n v e r t . s t r ( ) ; 273 i n t fuu = 6 5 ;

i n t f o n t s i z e = 2 . 5 ;

275 putText ( save , " SIFT ", c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t+fuu ) , FONT_HERSHEY_SIMPLEX , f o n t s i z e , c v S c a l a r ( 0 , 0 , 0 ) , 2 ) ;

putText ( save , " BF ", c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*2) , FONT_HERSHEY_SIMPLEX, f ont siz e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

277 putText ( save , " EdgeThreshold : 5 . 0 ", c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*3) , FONT_HERSHEY_SIMPLEX, f on t siz e , c v S c a l a r ( 0 , 0 , 0 ) , 2 ) ;

// putText ( save , " minHessian : 4 0 0 " , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*3) , FONT_HERSHEY_SIMPLEX, fon t siz e , c v S c a l a r ( 0 , 0 , 0 ) , 2 ) ;

279 putText ( save , " M a g n i f i c a t i o n : 2 . 0 ", c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*4) , FONT_HERSHEY_SIMPLEX, f on t siz e , c v S c a l a r ( 0 , 0 , 0 ) , 2 ) ;

putText ( save , framenr , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*5) , FONT_HERSHEY_SIMPLEX, font siz e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

281 putText ( save , nrmatches , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t+fuu*6) , FONT_HERSHEY_SIMPLEX, f ont si z e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

putText ( save , avgr , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*7) , FONT_HERSHEY_SIMPLEX, f ont siz e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

283 putText ( save , proccount , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t+fuu*8) , FONT_HERSHEY_SIMPLEX, f ont si z e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

putText ( save , Res , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t +fuu*9) , FONT_HERSHEY_SIMPLEX, f ont siz e , cvScalar ( 0 , 0 , 0 ) , 2 ) ;

285 // putText ( save , " no RANSAC" , c v P o i n t ( sz3 . width +30 , sz3 . h e i g h t+fuu*10) , FONT_HERSHEY_SIMPLEX, fo n ts ize , c v S c a l a r ( 0 , 0 , 0 ) , 2 ) ;

out . w r i t e ( save ) ; // out << frame ;

287 imwrite ("C: \ \ save . j p g ", save ) ;

289

// imshow ( " video " , save ) ;

291 s t d : : cout <<" "<< ( t2−t 1 ) /double( CLOCKS_PER_SEC ) <<" s e c "<< s t d : : endl ; 293 i f ( waitKey ( 3 0 ) ==’ q ’)

break;

295 }

out . r e l e a s e ( ) ; 297 i n t t 3 = c l o c k ( ) ;

s t d : : cout <<" t o t a l time : "<< ( t3−t 0 ) /double( CLOCKS_PER_SEC ) /* t3−t 0 << s t d : : endl*/<<" s e c \ n P r e s s w t o e x i t or wait 10 s e c "<< s t d : : endl ;

299 waitKey ( 1 0 0 0 0 ) ;

r e t u r n 0 ; 301 }

(59)

Upphovsrätt

Detta dokument hålls tillgängligt på Internet — eller dess framtida ersättare — under 25 år från publiceringsdatum under förutsättning att inga extraordinära omständigheter uppstår.

Tillgång till dokumentet innebär tillstånd för var och en att läsa, ladda ner, skriva ut enstaka kopior för enskilt bruk och att använda det oförändrat för icke-kommersiell forskning och för undervisning. Överföring av upphovsrätten vid en senare tidpunkt kan inte upphäva detta tillstånd. All annan användning av dokumentet kräver upphovsmannens medgivande. För att garantera äktheten, säkerheten och tillgängligheten finns det lösningar av teknisk och administrativ art.

Upphovsmannens ideella rätt innefattar rätt att bli nämnd som upphovsman i den omfattning som god sed kräver vid användning av dokumentet på ovan beskrivna sätt samt skydd mot att dokumentet ändras eller presenteras i sådan form eller i sådant sammanhang som är kränkande för upphovsmannens litterära eller konstnärliga anseende eller egenart.

För ytterligare information om Linköping University Electronic Press se förla-gets hemsida http://www.ep.liu.se/

Copyright

The publishers will keep this document online on the Internet — or its possi-ble replacement — for a period of 25 years from the date of publication barring exceptional circumstances.

The online availability of the document implies a permanent permission for anyone to read, to download, to print out single copies for his/her own use and to use it unchanged for any non-commercial research and educational purpose. Subsequent transfers of copyright cannot revoke this permission. All other uses of the document are conditional on the consent of the copyright owner. The publisher has taken technical and administrative measures to assure authenticity, security and accessibility.

According to intellectual property law the author has the right to be men-tioned when his/her work is accessed as described above and to be protected against infringement.

For additional information about the Linköping University Electronic Press and its procedures for publication and for assurance of document integrity, please refer to its www home page: http://www.ep.liu.se/

References

Related documents

None the less, the purpose of this study was to investigate emergency nurses’ experi- ences of verbal handover situations from paramedics and through these experiences uncover

De skillnader som finns i det manliga och det kvinnliga missbruket måste naturligtvis tas hänsyn till i behandlingen men vi anser inte att det är samma sak som att män och kvinnor

Detta innebär att när kameran vitbalanserar för en temperatur med en liten mängd blått ljus måste kameran öka den blåa signalen i kameran för att kompensera för detta

Där har vi studerat hur förskollärare inom förskola/förskoleklass inspirerar barn till att finna glädjen i böcker och sagoläsning och förhoppningsvis väcka barnens lust till

Anna har under hösten inte haft någon sjukgymnastik eller terapi förutom FMT. Hon har dock själv haft ”hjärn-gympa” genom att lösa korsord och sudoku samt sjunga i kör på en

Urvalet i föreliggande studie bestod av personer med långvarig smärtproblematik som deltagit i behandlingsprogrammet vardagsrevidering vid en mottagning på SÄS. Deltagarna

Bark et al (2002 .s 35) menar att samtlig information kring ett ämne bör samlas på ett ställe inom ett intranät. Författarna lyfter ett exempel med möten och hur dessa

Trots att patienterna kände en ökad säkerhet i fler moment än vad de gjort innan programmet så kan det inte bevisas att det gäller för alla reducerade program då studiens