• No results found

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.

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.

24 5 Resultat

Figur 5.9:Exempel på falska matches.

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 involvera flera UAV:er kan man tänka sig att två UAV:er flyger i formation och skickar sina respektive bilddata till en

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

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.

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

A

Bilder

32 A Bilder

33

34 A Bilder

35

36 A Bilder

37

38 A Bilder

39

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 ++; }

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

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 ( ) ;

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 }

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/

Related documents