• Rezultati Niso Bili Najdeni

Pretvorba vsesmerne fotografije v panoramsko sliko

N/A
N/A
Protected

Academic year: 2022

Share "Pretvorba vsesmerne fotografije v panoramsko sliko"

Copied!
65
0
0

Celotno besedilo

(1)

Univerza v Ljubljani

Fakulteta za raˇ cunalniˇ stvo in informatiko

Aleˇs Hribar

Pretvorba vsesmerne fotografije v panoramsko sliko

DIPLOMSKO DELO

VISOKOˇ SOLSKI STROKOVNI ˇ STUDIJSKI PROGRAM PRVE STOPNJE RA ˇ CUNALNIˇ STVO IN INFORMATIKA

Mentor : viˇs. pred. dr. Borut Batagelj

Ljubljana 2012

(2)
(3)

Rezultati diplomskega dela so intelektualna lastnina avtorja in Fakultete za ra- ˇ cunalniˇ stvo in informatiko Univerze v Ljubljani. Za objavljanje ali izkoriˇ sˇ canje rezultatov diplomskega dela je potrebno pisno soglasje avtorja, Fakultete za raˇ cu- nalniˇ stvo in informatiko ter mentorja.

Besedilo je oblikovano z urejevalnikom besedil L A TEX.

(4)

Spodaj podpisani Aleˇs Hribar, z vpisno ˇstevilko 63010041, sem avtor di- plomskega dela z naslovom:

Pretvorba vsesmerne fotografije v panoramsko sliko.

S svojim podpisom zagotavljam, da:

• sem diplomsko delo izdelal samostojno pod mentorstvom viˇs. pred. dr Boruta Batagelja,

• so elektronska oblika diplomskega dela, naslov (slov., angl.), povzetek (slov., angl.) ter kljuˇ cne besede (slov., angl.) identiˇ cni s tiskano obliko diplomskega dela,

• soglaˇsam z javno objavo elektronske oblike diplomskega dela v zbirki

”Dela FRI”.

V Ljubljani, dne 24. septembra 2012 Podpis avtorja:

(5)

Zahvala za to diplomsko delo gre moji druˇ zini ter mentorju, viˇ s. pred. dr.

Borutu Batagelju. Brez njih mi ne bi uspelo.

(6)

Povzetek Abstract

1 Uvod 1

2 Opis kamere 3

2.1 Hiperboliˇ cno zrcalo . . . . 5

2.2 Paraboliˇ cno zrcalo . . . . 8

2.3 Krogelno zrcalo . . . . 10

3 Pretvorba v panoramo z inverzno transformacijo 13 3.1 Bi-linearna interpolacija [1] . . . . 14

3.2 Iskanje centra vsesmerne fotografije s Houghovo transformacijo 15 3.3 Implementacija s programsko knjiˇ znico CUDA . . . . 17

4 Pretvorba v panoramo z Matlabom 19 4.1 Program za izbiro vrste slike . . . . 19

4.2 Osnovna pretvorba brez upoˇstevanja zrcala . . . . 20

4.3 Objektiv s hiperboliˇ cnim zrcalom . . . . 22

4.4 Objektiv s paraboliˇ cnim zrcalom . . . . 24

4.5 Objektiv s krogelnim zrcalom . . . . 24

5 Sklepne ugotovitve 27

(7)

KAZALO

6 Priloga 33

(8)

Vsesmerna fotografija ali videoposnetek za praktiˇ cno rabo ni preveˇ c upora-

ben, ker je popaˇ cen. Z uporabo ustrezne programske opreme ga je moˇ zno

predelati v panoramo. Panorama je za ˇ cloveka laˇ zje gledljiva, raˇ cunalnik pa

na njej laˇ zje prepozna objekte s pomoˇ cjo raˇ cunalniˇskega vida. V tej diplom-

ski nalogi so opisani tipi vsesmernih kamer, njihova uporaba ter postopki

transformacije slike. Dva postopka sta v sklopu diplomskega dela tudi re-

alizirana in sta podrobneje opisana. Eden je spisan v programskem okolju

Matlab, drugi pa s pomoˇ cjo knjiˇ znice CUDA. Algoritmiˇ cno sta si podobna in

oba uporabljata inverzno transformacijo slik. Naˇstete so tudi moˇ zne uporabe

vsesmernih kamer.

(9)

Abstract

Omnidirectional photos or videos are not very useful in practice. However, they can be transformed into a panoramic picture or video using relevant software. Panoramic pictures are easily viewable by human and also com- puter software can much easily recognize objects using computer vision on panoramic pictures. This thesis describes different types of omnidirectional cameras, their use and transformations to panoramic image. Furthermore, two different programs are implemented and described in thesis, one be- ing implemented in Matlab platform, the other using CUDA library. They are algorithmically similar and they both use reverse image transformation.

Additionally, different applications of omnidirectional cameras are stated in

thesis.

(10)
(11)

Poglavje 1 Uvod

Vsesmerna kamera je sestavljena iz objektiva obiˇ cajne kamere in nanj pritrje- nega zrcala, ki zbira ˇ zarke z vseh strani. Informacija je shranjena v kolobarju med dvema ˇ crnima krogoma. En krog je ˇ crn od znotraj, drugi od zunaj, vmes je kolobar s popaˇ ceno sliko. Ne oziraje se na ˇ crnino je treba za laˇ zjo obde- lavo slike in prepoznavo objektov na njih sliko pretvoriti v panoramsko sliko.

Panoramska slika naj bo taka, da ˇ cim bolje ohranja kote v naravi, oziroma kote, pod katerim ˇ zarki pridejo na zrcalo (da so na razliˇ cnih koncih enako obravnavani). Pri tem moramo upoˇstevati obliko zrcala. Od zrcal smo si ogledali hiperboliˇ cno in paraboliˇ cno ter tudi krogelno.

Moˇ znosti uporabe so: avtonomna navigacija, teleprisotnost (prisotnost na daljavo), navidezna resniˇ cnost in oddaljeni nadzor [2]. Z dvema zamaknje- nima posnetkoma ali z dvema kamerama lahko posnamemo 3-dimenzionalno 360 panoramo [3]. Za oddaljeni nadzor je uporaba teh kamer zanimiva, ker jih, da pokrijemo ves prostor, potrebujemo manj kot obiˇ cajnih kamer. Pri telekonferenci se z uporabo zaznavanja obrazov lahko loˇ ci posamezne osebe, ujete v objektiv. Moˇ zne pa so seveda tudi zaznavanja drugih objektov s pomoˇ cjo raˇ cunalniˇskega vida. Raˇ cunalniˇski vid se uporablja skupaj s vse- smerno kamero tudi pri avtonomni navigaciji robotov. Pri teleprisotnosti sistem lahko sledi glede na azimut osebi v okolju kot je muzej ali razstava [2].

Nekateri primeri detekcij so: izdelava zemljevida, navigacija glede na ze-

1

(12)

mljevid ali zaznane toˇ cke, izogibanje trkom, nadzor nad plinovodi in vodovodi s pomoˇ cjo robota...

Pri tem diplomskem delu je bil izdelan program za pretvorbo vsesmerne fotografije v panoramo in program za avtomatiˇ cno doloˇ canje centra kamere, ˇ ce je zrcalo zamaknjeno. Pri ugotavljanju centra je bila uporabljena Ho- ughova transformacija za kroge, kjer se izbere najveˇ cji krog na sliki, ˇ ce je le dovolj velik. Najprej so bile uprabljene standardne Matlabove funkcije za inverzne transformacije slik (preslikuje se od ponora do izvora), nato smo im- plementirali algoritem ˇse s CUDA grafiˇ cno knjiˇ znico. Rezultata sta identiˇ cna, ˇ ce ne uporabimo filtriranja. Opisane pa so tudi druge metode pretvorb vse- smernih slik v panoramo.

1.0.1 Avtonomna navigacija [2]

Prednosti vsesmerne kamere niso samo velik zoren kot, ampak tudi posebne lastnosti kot sta nespremenljivost azimutov in kroˇ zna kontinuiteta.

Ker se navpiˇ cne linije v prostoru preslikajo v linije, ki gredo skozi srediˇsˇ ce

slike, so lahko zanesljivo zaznane. Poleg tega kot v sliki sovpada z azimutom,

kar tudi pomaga pri zanesljivi oceni lokacije linij v prostoru.

(13)

Poglavje 2 Opis kamere

Slika 2.1: Fotografija robota Π s krogelnim zrcalom [4].

Kamere, ki zavzamejo velik zorni kot, delimo na katadioptriˇ cne in diop- triˇ cne. Katadioptriˇ cne kamere so sestavljene iz konkavnega zrcala in obiˇ cajne kamere. Dioptriˇ cne kamere imajo leˇ co pred obiˇ cajno kamero, ki zbere ˇ zarke z ˇ zelenih smeri. Med katadioptriˇ cne kamere sodijo vsesmerne kamere (slika 2.2) s hiperboliˇ cnim, paraboliˇ cnim ali krogelnim zrcalom (slika 4.5) [5].

3

(14)

Slika 2.2: Kamera 0-360 [6].

Zrcala so lahko razliˇ cnih dimenzij in parametrov, vaˇ zna pa je tudi od-

daljenost od objektiva [6]. Med dioptriˇ cne kamere spada ribje oko [6] (slika

2.3).

(15)

2.1. HIPERBOLI ˇ CNO ZRCALO 5

Slika 2.3: “Fisheye” kamera [7].

S kamero ribje oko, ki ima kot pogleda 180 , lahko s transformacijami in veˇ c slikami v razliˇ cne smeri dobimo z lepljenjem 360 panoramo [8]. Vse- smerne slike morajo biti pred obdelavo z raˇ cunalniˇskim vidom obdelane, ker so dosedanja orodja tipiˇ cno prirejena perspektivnim slikam. Pogost cilj je izdelava perspektivnih izrezkov, ki omogoˇ cajo uporabo teh orodij brez mo- difikacij. S tem izgubimo prednost velikega zornega kota. Zato je valjˇ cna panorama pogosto najboljˇsa moˇ znost. Pri tej preslikamo vsesmerno sliko na notranjost valja. Taka slika je podobna perspektivni in omili kroˇ zna popaˇ cenja katadioptriˇ cnih in dioptriˇ cnih projekcij.

V nadaljevanju bomo podrobneje opisali hiperboliˇ cna, paraboliˇ cna in kro- gelna zrcala ter njune pretvorbe v valjˇ cne slike.

2.1 Hiperboliˇ cno zrcalo

Povzeto po [7]. Naj bo C = (0, 0,-2e) srediˇsˇ ce kamere na luknjico. ˇ Ce je ˇ zariˇsˇ cna toˇ cka F hiperboloida C 2 izvor prostora koordinatnega sistema, je hiperboloid izraˇ zen z:

(x, y, z, 1)

1

a

2

0 0 0

0 a 1

2

0 0

0 0 − b 1

2

b e

2

0 0 − b e

2

e b

22

+ 1

 x y z 1

= 0 (2.1)

(16)

V enaˇ cbi (2.1) je

e = a 2 + b 2 (2.2)

Projekcija toˇ cke X = (X, Y, Z) > v 3D prostoru v toˇ cko x = (x, y, z) > na hiperboloidu C 2 je izraˇ zen z x = χX, kjer je (2.3).

χ = a 2

b|X| − eZ (2.3)

Projekcija toˇ cke x v ustrezno toˇ cko m = (u, v) > v ravnini slike π je izraˇ zena kot:

m 1

!

= 1

z + 2e

f 0 0 0 0 f 0 0 0 0 1 0

 x 1

!

(2.4)

Preslikava iz X v m je:

u = f a 2 X

(a 2 − 2e 2 )Z + 2be|X| (2.5)

v = f a 2 Y

(a 2 − 2e 2 )Z + 2be|X| (2.6)

Transformacija hiperboliˇ cne v valjˇ cno sliko je prikazana desno na sliki 2.4.

Slika 2.4: Pretvorba hiperboliˇ cne v valjˇ cno sliko. Levo: sistem kamere s hiper- boliˇ cnim zrcalom. Desno: hiperboliˇ cni in valjˇ cni kombiniran sistem [7].

.

(17)

2.1. HIPERBOLI ˇ CNO ZRCALO 7

Naj bo C p srediˇsˇ ce valjˇ cne projekcije Naj bo C p = F. Potem toˇ cki x p na valjˇ cni sliki in toˇ cka x na hiperboloidu leˇ zita na ˇ crti, ki povezuje toˇ cko X v 3D prostoru s toˇ cko ˇ zariˇsˇ ca bf F na hiperboloidu. V valjˇ cnem koordinatnem sistemu je toˇ cka x p = (x p , y p , z p izraˇ zena z x p = r cos θ, y p = r sin θ in z p = r tan ϕ. Tu lahko brez izgube sploˇsnosti nastavimo r = 1. Enaˇ cbi za pretvorbo toˇ cke med valjˇ cno sliko I(u, v) in toˇ cko na valju (slika 2.4) I(θ, ϕ) sta potem

u = f a 2 cos θ

(a 2 ∓ 2e 2 ) tan ϕ ± 2be p

1 + tan 2 ϕ (2.7)

v = f a 2 sin θ

(a 2 ∓ 2e 2 ) tan ϕ ± 2be p

1 + tan 2 ϕ (2.8)

kjer je e = a 2 + b 2 , 0 ≤ θ < 2π in −π/2 ≤ ϕ < π/2. Tako dobljeno toˇ cko potem interpoliramo z bi-linearnim, bi-kubiˇ cnim ali kakˇsnim drugim filtrom.

Opisane enaˇ cbe izpeljujejo preslikavo s srediˇsˇ cno valjˇ cno projekcijo. Valjnˇ ce

slike so lahko osnovane tudi na drugaˇ cnih projekcijah (recimo, ˇ ce nastavimo

z p = rϕ, dobimo ekvi-pravokotno projekcijo).

(18)

2.2 Paraboliˇ cno zrcalo

Slika 2.5: Pretvorba paraboliˇ cne v valjˇ cno sliko. Levo: sistem kamere s para- boliˇ cnim zrcalom. Desno: paraboliˇ cni in valjˇ cni kombiniran sistem [7].

Najprej si poglejmo skico, prikazano levo na sliki 2.5. Naj bo C = (0, 0, −∞) srediˇsˇ ce ortografske kamere. ˇ Ce je ˇ zariˇsˇ ce F paraboloida C 2 izvor prostora koordinatnega sistema, je paraboloid C 2 izraˇ zen z (2.9).

(x, y, z, 1)

1

4c 0 0 0

0 4c 1 0 0

0 0 0 −1

0 0 −1 −1

 x y z 1

= 0 (2.9)

Projekcija toˇ cke X = (X, Y, Z) > v 3D prostoru v toˇ cko x = (x, y, z) > na paraboloidu je izraˇ zen z x = χX, kjer je (2.10).

χ = 2c

|X| − Z (2.10)

(19)

2.2. PARABOLI ˇ CNO ZRCALO 9

Projekcija toˇ cke x v ustrezno toˇ cko m = (u, v) > v ravnini slike π je izraˇ zena kot (2.11):

m 1

!

= 1

z + 2e

1 0 0 0 0 1 0 0 0 0 0 1

 x 1

!

(2.11)

Preslikava iz X v m je (2.12) in (2.13).

u = f2cX

|X| − Z (2.12)

v = f2cY

|X| − Z (2.13)

Ce nastavimo ˇ C p = F, toˇ cka x p na panoramski sliki in toˇ cka x na para- boloidu leˇ zita na ˇ crti, ki povezuje toˇ cko X v 3d prostoru z ˇ zariˇsˇ cno toˇ cko F na paraboloidu. Naj bo x p = (x p , y p , z p ) toˇ cka na povrˇsini valja. Enaˇ cbi za pretvorbo toˇ cke med valjˇ cno sliko I(u, v) in toˇ cko na valju (slika 2.5) I(θ, ϕ) sta (2.14) in (2.15).

u = 2c cos θ

p 1 + tan 2 ϕ − tan ϕ (2.14)

v = 2c sin θ

p 1 + tan 2 ϕ − tan ϕ (2.15)

Tako dobljeno toˇ cko potem interpoliramo z bi-linearnim, bi-kubiˇ cnim ali

kakˇsnim drugim filtrom.

(20)

2.3 Krogelno zrcalo

φ

Slika 2.6: Shema kamere s krogelnim zrcalom [9].

Premica, ki doloˇ ca kot α, je (2.16) [1]. Enaˇ cba kroga v ravnini je (2.17) [1].

y = kx = cot(α)x = f

ϕ x (2.16)

R 2 = x 2 + (y − d) 2 (2.17)

Reˇsimo sistem enaˇ cb za α in posebej za x(ϕ). Dobimo (2.18).

α = cot −1 d + p

g 2 − x 2 x

!

(2.18)

x = d f ϕ 1 + f ϕ

22

− q

d 2 f ϕ

22

− (d 2 − g 2 )(1 + f ϕ

22

) 1 + f ϕ

22

(2.19)

(21)

2.3. KROGELNO ZRCALO 11

Izpeljemo enaˇ cbe za u (2.20) in v (2.21), kjer je x funkcija (2.19).

u = f

d+ √

g

2

−x

2

x

cos θ (2.20)

v = f

d+

g

2

−x

2

x

sin θ (2.21)

(22)
(23)

Poglavje 3

Pretvorba v panoramo z inverzno transformacijo

V tem diplomskem delu bomo opisali najprej povratno (inverzno) transfor- macijo slike. Pri teh transformacijah za vsako slikovno piko na ciljni sliki poiˇsˇ cemo preslikavo v izvorni sliki.

Konˇ cna slika zavzame kot 360 valja, torej 2πr. Velikost izvorne slike je viˇsina krat ˇsirina, dimenziji sta enaki in sta enakovredni dvakratnemu pol- meru kroga, torej 2r. Obseg kroga 360 izvorne slike je 2πr. Optimalna viˇsina je r. Tako na vrhu (obodu) konˇ cne slike dobimo sliko toˇ cka za toˇ cko, niˇ zje pa se ena izvorna toˇ cka preslika v veˇ c konˇ cnih toˇ ck, ˇ ce namesto interpo- lacije uporabimo zaokroˇ zevanje k najbliˇ zjemu celemu ˇstevilu. Za preslikavo uporabimo enaˇ cbo preslikave karteziˇ cnega v polarni koordinatni sistem, ki je:

u = r ∗ cosθ (3.1)

v = r ∗ sinθ (3.2)

Najprej pretvorimo toˇ cko s konˇ cne slike (x, y) v prostor(x 0 , y 0 ), x ∈ (0, ...2πr), y ∈ (r, ...0). Slikovna pika (x, y) postane toˇ cka (x’, y’). Pri tem sta x’ in y’ elementa v plavajoˇ ci vejici. Z enaˇ cbama (3.1) in (3.2) pa pretvorimo vsak tak element v prostor (u, v), u∈ [1,1] ter v ∈[-1,1]. Nato element (u,v) raztegnemo na izvorno sliko (x 0 , y 0 ), x i ∈0,...,2r, y i ∈0,...,2r. Elementu

13

(24)

(x i , y i ) lahko poreˇ zemo decimalke ali ga zaokroˇ zimo na najbliˇ zje celo ˇstevilo in dobimo koordinate izvore slikovne toˇ cke (x, y), ki ga nato preslikamo na konˇ cno sliko, kot je opisano. Lahko pa nad (x i , y i ) uporabimo filtriranje.

Shema je predstavljena na sliki 3.1.

0,0

2r

2r

-1 0,0

1 -1

1

0,1 2π,1

0,0 2π,0

r- piksla

r-piksla

r=1 r=1 (x,y)- celi števili

θ,r - števili v plavajoči vejici

interpolacija ali zaokroževanje k celemu številu

r= višina-y θ=x/2πr

θ

u=r*cosθ v=r*sinθ

premik,razteg, pretvorba x,y v plavajočo vejico

premik,razteg, pretvorba u,v v celi števili

panorama

vsesmerna fotografija

Slika 3.1: Shema za pretvorbo vsesmerne fotografije v panoramo

V tem delu smo opisali bi-linearno filtriranje. V jeziku Matlab je filtrira- nje opcijsko, izberemo ga z ukazom pri transformaciji.

3.1 Bi-linearna interpolacija [1]

Pri bi-linearni interplolacijski metodi je intenziteta slikovne pike v izhodni

sliki odvisna od ˇstirih slikovnih pik izvorne slike v okolici elementa (x 0 , y 0 )

po enaˇ cbi (3.3) in sliki 3.2.

(25)

3.2. ISKANJE CENTRA VSESMERNE FOTOGRAFIJE S HOUGHOVO

TRANSFORMACIJO 15

I(x, y) = I(x

0

, y

0

) + [I(x

1

, y

0

) − I(x

0

, y

0

)] ∗ ∆x + [I(x

0

, y

1

) − I(x

0

, y

0

) ∗ ∆y+

+I(x

1

, y

1

) + I(x

0

, y

0

) − I(x

0

, y

1

) − I(x

1

, y

0

)] ∗ ∆x ∗ ∆y (3.3)

[1]

x

0

x

1

Slika 3.2: Interpolacija z bilinearnim filtrom [1].

Obstajajo ˇse druge interpolacije, kot je bi-kubiˇ cna, vendar jih v tem delu ne bomo obravnavali.

3.2 Iskanje centra vsesmerne fotografije s Ho- ughovo transformacijo

Zrcalo za vsesmerno sliko je teˇ zko centrirati na objektiv. Zato potrebujemo

postopek, ki ugotavlja center slike. Najlaˇ zje za programerja je roˇ cni vnos,

kjer uporabnik sam doloˇ ci center razvijanja. Boljˇsi je avtomatiˇ cni naˇ cin, kjer

s Houghovo transformacijo poiˇsˇ cemo kroge (slika 3.3). Center najveˇ cjega

kroga je zelo verjetno center pripenjanja zrcala.

(26)

Slika 3.3: Detekcija krogov s Houghovo transformacijo.

Ni pa nujno. Krog mora biti v celoti na sliki, ˇ ce ne, ne moremo pretvoriti slike v panoramo (nastopajo slikovne toˇ cke, ki niso na izvorni sliki). Tudi krog, s premerom, manjˇsim od 80 % viˇsine slike verjetno ni pravi, ker obiˇ cajno fotograf poskusi kar se da optimalno namestiti zrcalo. Poleg tega obstaja ˇse ena ˇ crna notranjost kroga, kjer kamera posname objektiv in je precej manjˇsi. Z upoˇstevanjem teh postopkov lahko precej natanˇ cno doloˇ cimo center razvijanja slike.

Veˇ c o detekciji krogov s Houghovo transformacijo si lahko preberete v [10].

(27)

3.3. IMPLEMENTACIJA S PROGRAMSKO KNJI ˇ ZNICO

CUDA 17

3.3 Implementacija s programsko knjiˇ znico CUDA

Programska knjiˇ znica CUDA je namenjena poganjanju GPGPU (General- purpose computing on graphics processing units) kode na Nvidia grafiˇ cnih karticah. Koda se izvaja paralelno na veˇ c procesnih enotah. Programska koda se piˇse v C/C++ podobni sintaksi. Loˇ cimo kodo, ki se izvaja na centralni procesni enoti (CPU) in kode (imenovano kernels), ki se izvajajo na GPU-jih. Konkurenˇ cna knjiˇ znica programski knjiˇ znici CUDA (Compute Unified Device Architecture) je programska knjiˇ znica OpenCL, ki poleg na Nvidijinih deluje tudi na GPU-jih ostalih proizvajalcev (AMD, Intel). Trans- formacije v programu na GPU-jih so predstavljene v kodi 3.1.

Koda 3.1 (Transformacije s pomoˇ cjo knjiˇ znice CUDA)

. . .

// p o i s c e m o x i n y i z h o d n e s l i k e s pomocjo i n d e x a i , k i // t e c e c e z v s e e l e m e n t e

i n t x = r e m a i n d e r ( ( double ) i , ( double ) n e w w i d t h ) ; i n t y = f l o o r f ( ( double ) ( i / n e w w i d t h ) ) ;

// p o s t a v i m o x1 med 0 i n 2∗ p i ∗ r , r = v i s i n a

double x1 = −(( double ) ( x ) ∗ 2 ∗CUDART PI F / ( double ) n e w w i d t h ) ;

// p o s t a v i m o y med 0 i n ena po o b r a t n i v r e d n o s t i r double y1 = ( ( double ) ( y ) / ( double ) n e w h e i g h t ) −1;

// e n a c b i t r a n s f o r m a c i j e double o l d x 1 = y1 ∗ c o s f ( x1 ) ; double o l d y 1 = y1 ∗ s i n f ( x1 ) ;

// r a z t e g na koncno s l i k o i z v o r n e g a x ( o l d x ) i n y ( o l d y ) . double o l d x = ( ( o l d x 1 + 1 ) ∗ ( double ) w i d t h / 2 ) ;

double o l d y = ( ( o l d y 1 + 1 ) ∗ ( double ) h e i g h t / 2 ) ;

(28)

// d o l o c i m o nov i n d e x s l i k e i , k i t e c e od z a c e t k a od l e v e p r o t i d e s n i

i n t o l d i = f l o o r f ( o l d y ) ∗ w i d t h+ f l o o r f ( o l d x ) ;

// f i l t r i r a n j e

f i l t e r ( imagem , o u t i m a g e , w i d t h , h e i g h t , o l d x , o l d y , i ) ;

. . .

(29)

Poglavje 4

Pretvorba v panoramo z Matlabom

Drugi program za pretvorbo vsesmerne slike v panoramo smo spisali s pomoˇ cjo Matlaba. Slike lahko naloˇ zimo kot matriko v Matlab in ji doloˇ cimo spremen- ljivko. Program vsebuje pet funkcij: unroll.m, unroll hyperbolic.m, unroll pa- rabolic.m, unroll basic.m in unroll krogla.m. Poleg teh funkcija unroll.m kliˇ ce zunanji C++ program, unroll center (unroll center.exe v okolju Win32), ki doloˇ ci center preslikave in polmer kroga za preslikavo. Polmer se v nadalj- njih izraˇ cunih izpusti. Tu je samo zaradi kompatibilnosti s CUDA progra- mom, v katerega je ta program tudi vkljuˇ cen. Za doloˇ canje kroga preslikave in njegovega centra ter polmer smo uporabili knjiˇ znico OpenCV, namenjeno uporabi pri raˇ cunalniˇskem vidu.

4.1 Program za izbiro vrste slike

Vrsta slike se poda funkciji unroll.m v Matlabovi lupini v obliki:

unroll(’Slika.jpg;’, ’tip’, parametri);

Slika.jpg kaˇ ze na pot do fotografije, ki jo ˇ zelimo pretvoriti, tip je ena od ˇ crk ’b’, ’h’, ’p’ ali ’k’ in doloˇ ca tip transformacije, oziroma vrsto uporabljenega objektiva v izvorni fotografiji.

19

(30)

Za osnovno pretvorbo moramo vpisati v Matlabovo lupino

unroll(’vsesmerna_slika’,’b);.

To nam naredi osnovno pretvorbo. Funkcija zahteva uporabnikovo inte- rakcijo za obrezovanje slike. Doloˇ ci se samo spodnja in zgornja meja.

Funkcija unroll vraˇ ca dva parametra: sliko in ˇ cas raˇ cunanja. Pokliˇ cemo jo kot:

[img,time]=unroll(...);.

4.2 Osnovna pretvorba brez upoˇ stevanja zr- cala

Osnovna pretvorba je bila matematiˇ cno opisana v prejˇsnjem poglavju. Ma-

tlab ima moˇ cno orodje za transformacijo slik in nam ni treba skrbeti za

malenkosti, kot so razteg slike. Treba je samo napisati enaˇ cbo inverzne trans-

formacije in obmoˇ cje [x, y] konˇ cne slike 4.2 in [u, v] zaˇ cetne 4.1 slike.

(31)

4.2. OSNOVNA PRETVORBA BREZ UPOˇ STEVANJA ZRCALA 21

Slika 4.1: Fotografija, posneta s 0-360 zrcalom [7].

Slika 4.2: Razˇ sirjena fotografija 4.1 s programom unroll [7].

(32)

4.3 Objektiv s hiperboliˇ cnim zrcalom

Slika 4.3: Fotografija, posneta s hiperboliˇ cnim zrcalom [11].

Slika 4.4: Razˇ sirjena fotografija 4.3 s programom unroll [11].

(33)

4.3. OBJEKTIV S HIPERBOLI ˇ CNIM ZRCALOM 23

Pri pretvorbi vsesmernih slik bi ˇ zeleli, da se enaki koti, ki prihajajo do zrcala, preslikajo po navpiˇ cni osi v enako ˇstevilo slikovnih toˇ ck.

Hiperboliˇ cna kamera je sestavljena iz hiperboliˇ cnega ogledala in obiˇ cajnega digitalnega fotoaparata [8,10]. Vsi svetlobni ˇ zarki, ki pridejo na kamero, se- kajo navidezno skozi toˇ cko F hiperboloida, kot je prikazano na sliki 2.4.

Iz enaˇ cb za u in v se vidi, da je razlika med njima samo v funkcijah cos in sin, ostali ˇ cleni pa so si identiˇ cni, in tvorijo razteg po y-osi v konˇ cni sliki.

Funkcija nas zanima samo med njeno niˇ clo in −π/2, ker drugaˇ ce dobimo dvojno sliko. Niˇ clo funkcije je v Matlabu enostavno izraˇ cunati s funkcijo fsolve, kot na primeru programa 4.1.

Koda 4.1 (Transformacije s pomoˇ cjo Matlabovih funkcij)

f u n c t i o n [ i m g W r i t e ] = u n r o l l _ h y p e r b o l i c ( i m e S l i k e , ...

x , y , a , b , f o c u s )

% U N R O L L _ H Y P E R B O L I C V r n e r a z v i t o p a n o r a m s k o s l i k o

% v s e s m e r n e f o t o g r a f i j e . s o u r c e v = i m r e a d ( i m e S l i k e );

% ... c e l o t e n p r o g r a m je v p r i l o g i

e = s q r t (( a . ^ 2 ) + ( b . ^ 2 ) ) ;

% F u n k c i j e p r e s l i k a v e :

% I z p o s t a v i m o qt v x in y

qt = @ ( x ) f o c u s .*( a . ^ 2 ) . / ( ( ( a . ^ 2 ) - 2 . * ( e . ^ 2 ) ) . * tan ( x ) + ...

2.* b .* e .* s q r t (1+ tan ( x ) . ^ 2 ) ) ;

iks = @ ( x ) qt ( x ( : , 2 ) ) . * cos ( x (: ,1));

y p s i l o n = @ ( y ) qt ( y ( : , 2 ) ) . * sin ( y (: ,1));

i p a n o r a m a = @ ( x ) [ iks ( x ) , y p s i l o n ( x )];

i n v e r s e = @ ( x , t ) i p a n o r a m a ( x );

% Iskanje niˇ cle funkcije qt1 z fsolve in izraˇ cun slike;

qt1 = @ ( x ) qt ( x ) -1;

% Zaˇ cnemo v -pi/2;

(34)

x0 = - pi /2;

t f o r m 2 = m a k e t f o r m ( ’ c u s t o m ’ , 2 , 2 , [] , inverse , [ ] ) ; i m g W r i t e = i m t r a n s f o r m ( source , tform2 , ’ b i l i n e a r ’ , ...

’ U D a t a ’ , [ -1 1] , ...

’ V D a t a ’ , [ -1 1] , ’ X D a t a ’ , [2* pi 0] , ...

’ Y D a t a ’ , [ f s o l v e ( qt1 , x0 ) - pi /2] , ...

’ S i z e ’ , [ n e w h e i g h t n e w w i d t h ]);

end

Za pretvorbo slike s hiperboliˇ cnim zrcalom poˇ zenemo

unroll(’hiperbolicna_slika.jpg’, ’h’, 39.292, 19.646, 2.3);

Parametri: a = 39.292, b = 19.646, ˇ zariˇsˇ cna razdalja = 2.3. Lahko pa so tudi drugaˇ cni, glede na lastnosti zrcala.

4.4 Objektiv s paraboliˇ cnim zrcalom

Za pretvorbo paraboliˇ cne slike vpiˇsemo v lupino Matlaba:

unroll(’parabolicna_slika.jpg’,’p’, 2.343);,

kjer zadnji parameter 2.343 doloˇ ca parameter c parabole.

4.5 Objektiv s krogelnim zrcalom

Za pretvorbo paraboliˇ cne slike vpiˇsemo v lupino Matlaba:

unroll(’krogelna_slika.jpg’,’k’,g,d,focus);, kjer je g polmer zr-

cala, d razdalja med srediˇsˇ cem krogelnega zrcala in kamero ter focus ˇ zariˇsˇ cna

razdalja kamere.

(35)

4.5. OBJEKTIV S KROGELNIM ZRCALOM 25

Slika 4.5: Fotografija, posneta s krogelnim zrcalom [4].

Slika 4.6: Razˇ sirjena fotografija 4.5 s programom unroll [4].

(36)
(37)

Poglavje 5

Sklepne ugotovitve

Za inverzno transformacijo so paralelni algoritmi smiselni. Cas izvajanja ˇ na CUDA pri 96 procesnih enotah (Nvidia Optimus 540M) je za 10-krat hitrejˇsi, kot pa algoritem, ki deluje v Matlabu na istem raˇ cunalniku, Core i7.

Konkretno, za transformacijo brez upoˇstevanja zrcala je CUDA program na sliki Marsket0.jpg velikosti 2448x2448 (obrezana slika na podlagi Hughove transformacije), potreboval 0,19 sekund, proogram s programsko zanko 0,62 sekunde, zgoraj opisan Matlabov program pa 2,27 sekunde 5.1. Matlabovim programom se priˇsteje ˇse 10 % k ˇ casu izvajanja, ko se upoˇsteva oblika zrcala.

Z uporabo grafiˇ cnih procesnih enot za preslikavo lahko preslikavo v valjˇ cno panoramo ob ustrezni strojni podpori izvajamo tudi v realnem ˇ casu, kar programsko pri visoki loˇ cljivosti ˇse ni mogoˇ ce.

Realizacija ˇ cas (s) Nvidia Optimus 540M 0,19 Programska zanka 0,62

Matlab 2,27

Slika 5.1: Realizacije in ˇ casi izvajanja.

27

(38)
(39)

Slike

2.1 Fotografija robota Π s krogelnim zrcalom [4]. . . . 3 2.2 Kamera 0-360 [6]. . . . 4 2.3 “Fisheye” kamera [7]. . . . 5 2.4 Pretvorba hiperboliˇ cne v valjˇ cno sliko [7]. . . . 6 2.5 Pretvorba paraboliˇ cne v valjˇ cno sliko [7]. . . . 8 2.6 Shema kamere s krogelnim zrcalom [9]. . . . 10 3.1 Shema za pretvorbo vsesmerne fotografije v panoramo . . . . . 14 3.2 Interpolacija z bilinearnim filtrom [1]. . . . 15 3.3 Detekcija krogov s Houghovo transformacijo. . . . 16 4.1 Fotografija, posneta s 0-360 zrcalom [7]. . . . 21 4.2 Razˇsirjena fotografija 4.1 s programom unroll [7]. . . . . 21 4.3 Fotografija, posneta s hiperboliˇ cnim zrcalom [11]. . . . 22 4.4 Razˇsirjena fotografija 4.3 s programom unroll [11]. . . . 22 4.5 Fotografija, posneta s krogelnim zrcalom [4]. . . . 25 4.6 Razˇsirjena fotografija 4.5 s programom unroll [4]. . . . . 25 5.1 Realizacije in ˇ casi izvajanja. . . . 27

29

(40)
(41)

Literatura

[1] Y. Ba¸stanlar, “Parameter extraction and image enhancement for cata- dioptric omnidirectional cameras,” Dostopno na: http://www.ii.metu.

edu.tr/ yalinb/publications/Bastanlar-Thesis.pdf, 2012.

[2] Y. Yagi, “Omnidirectional sensing and its applications.” v IEICE Tran- sactions on Information and Systems, jul 1995, stran 568 – 579.

[3] A. Simon, R. Smith, in R. Pawlicki, “Omnistereo for panoramic vir- tual environment display systems,” v Virtual Reality, 2004. Proceedings.

IEEE, marec 2004, stran 67 – 279.

[4] “Pi robot,” Dostopno na: http://www.pirobot.org/blog/0001/, 2012.

[5] T. Svoboda, “Central panoramic cameras: Geometry and design,” 1997.

[6] “Some omnidirectional shots durin flying,” Dostopno na:

http://wwwlasmea.univ-bpclermont.fr/Personnel/Maxime.Lhuillier/

OmniPara.html, 2012.

[7] A. Torii in R. Klette, “Panoramic and 3d computer vision,” v ArtsIT, LNICST, 2012, stran 9 – 16.

[8] H. Bakstein in T. Pajdla, “Panoramic mosaicing with a 180 deg; fi- eld of view lens,” v Omnidirectional Vision, 2002. Proceedings. Third Workshop on, 2002, stran 60 – 67.

31

(42)

[9] A. Ohte, O. Tsuzuki, in K. Mori, “A practical spherical mirror omni- directional camera,” v Robotic Sensors: Robotic and Sensor Enviro- nments, 2005. International Workshop on, 30 2005-oct. 1 2005, stran 8 – 13.

[10] D. Kerbyson in T. Atherton, “Circle detection using hough transform filters,” v Image Processing and its Applications, 1995., Fifth Internati- onal Conference on, jul 1995, stran 370 –374.

[11] “Catadioptric cameras for 360 degree imaging,” Dostopno na: http:

//www1.cs.columbia.edu/CAVE/projects/cat cam 360/, 2012.

(43)

Poglavje 6 Priloga

Priloˇ zeni so programi, ki smo jih razvili za potrebe te diplomske naloge. Prvi je program, napisan za knjiˇ znico CUDA, opisan v poglavju 3.

Priloga k 3.1:

33

(44)
(45)

Program unroll cuda

Program poˇ zenemo kot: unroll vhodna_datoteka.jpg izhodna_datoteka.jpg.

Pri tem je vhodna_datoteka.jpg vhodna datoteka tipa jpg in izhodna_datoteka.jpg izhodna datoteka tipa jpg.

Program prebere vhodno vsesmerno sliko iz datoteke, s Hughovo trans- formacijo poiˇ sˇ ce center in izpiˇ se panoramsko sliko vhodne slike v izhodno datoteko.

Razdeljen je v tri datoteke:

unroll.cpp

Glavni program s funkcijo main():

1 #i n c l u d e ” u n r o l l k e r n e l s . h ” 2 #i n c l u d e <o p e n c v / c v . h>

3 #i n c l u d e <o p e n c v / h i g h g u i . h>

4 #i n c l u d e <i o m a n i p>

5 #i n c l u d e <i o s t r e a m>

6 #i n c l u d e <math . h>

7 #i n c l u d e <s y s / t i m e b . h>

8 #i n c l u d e <t i m e . h>

9 10

11 #d e f i n e DEBUG TIME

12

13 i n t n o t E n t i r e l y (i n t x , i n t y , i n t r , i n t w i d t h , i n t h e i g h t ) { 14 i f ( ( x−r<0) | | ( x+r>w i d t h ) | | ( y−r<0) | | ( y+r>h e i g h t ) ) r e t u r n 1 ; 15 e l s e r e t u r n 0 ;

16 }

17

18 i n t main (i n t a r g c , c h a r∗∗ a r g v )

19 {

20 i f ( a r g c < 3 )

21 {

22 s t d : : c o u t << ” U p o r a b i : ”<< a r g v [ 0 ] << ” <i n p u t>” <<” <o u t p u t>” <<

23 << s t d : : e n d l ;

24 e x i t ( 1 ) ;

25 }

26

35

(46)

27 I p l I m a g e∗ i n p u t i m a g e = NULL ;

28 i n p u t i m a g e = c v L o a d I m a g e ( a r g v [ 1 ] , CV LOAD IMAGE UNCHANGED ) ; 29 i f( ! i n p u t i m a g e )

30 {

31 s t d : : c o u t << ”ERROR: F a i l e d t o l o a d i n p u t i m a g e ” << s t d : : e n d l ;

32 r e t u r n −1;

33 }

34

35 I p l I m a g e∗ g r a y = c v C r e a t e I m a g e ( c v G e t S i z e ( i n p u t i m a g e ) , 8 , 1 ) ; 36 CvMemStorage∗ s t o r a g e = c v C r e a t e M e m S t o r a g e ( 0 ) ;

37 c v C v t C o l o r ( i n p u t i m a g e , g r a y , CV BGR2GRAY ) ; 38 c v S m o o t h ( g r a y , g r a y , CV GAUSSIAN , 9 , 9 ) ; 39 CvSeq∗ c i r c l e s = c v H o u g h C i r c l e s ( g r a y , s t o r a g e ,

40 CV HOUGH GRADIENT, 2 , g r a y−>h e i g h t / 8 ,

41 2 0 0 , 1 0 0 , g r a y−>h e i g h t / 8 , ( g r a y−>w i d t h>

42 g r a y−>h e i g h t ?

43 g r a y−>h e i g h t :

44 g r a y−>w i d t h ) ) ;

45

46 i n t w i d t h = i n p u t i m a g e−>w i d t h ; 47 i n t h e i g h t = i n p u t i m a g e−>h e i g h t ; 48

49 // u g o t o v i n a j v e c j i k r o g

50 i n t maxx =0; i n t maxy =0; i n t maxr =0; i n t i ;

51

52 f o r ( i = 0 ; i < c i r c l e s−>t o t a l ; i ++)

53 {

54 f l o a t∗ p = (f l o a t∗) c v G e t S e q E l e m ( c i r c l e s , i ) ; 55

56 i n t x=cvRound ( p [ 0 ] ) ; i n t y=cvRound ( p [ 1 ] ) ; i n t r=cvRound ( p [ 2 ] ) ; 57

58 i f ( r>maxr ) {

59 maxx=x ; maxy=y ; maxr=r ;

60 }

61

62 /∗ c v C i r c l e ( s i m g , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,

63 3 , CV RGB ( 0 , 2 5 5 , 0 ) , −1, 8 , 0 ) ;

64 c v C i r c l e ( s i m g , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,

65 cvRound ( p [ 2 ] ) , CV RGB ( 2 5 5 , 0 , 0 ) , 3 , 8 , 0 ) ;

66 ∗/

67 }

68

69 // Ce k r o g n i v c e l o t i na s l i k i , v z e m i k a r g e o m e t r i j s k o s r e d i s c e s l i k e . . . 70 i f ( n o t E n t i r e l y ( maxx , maxy , maxr , g r a y−>w i d t h , g r a y−>h e i g h t ) ) {

71 maxx=cvRound ( g r a y−>w i d t h / 2 ) ; 72 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

73 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

74 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ;

75 }

76

77 // Ce j e k r o g m a n j s i od 80% n a j m a n j s e z u n a n j e d i m e n z i j e s l i k e , 78 // v z e m i g e o m e t r i s k o s r e d i s c e s l i k e

79

80 i f ( maxr<0 . 8∗( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

81 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ){

82 maxx=cvRound ( g r a y−>w i d t h / 2 ) ; 83 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

84 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

85 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ;

86 }

87

88 i n t r =0;

89 i n t n e w h e i g h t=r ; 90

(47)

37

91 i f ( h e i g h t > 2 ∗ maxy ) n e w h e i g h t = maxy ; 92 e l s e n e w h e i g h t = h e i g h t−maxy ;

93

94 r=maxr−(maxr % 8 ) ;

95 n e w h e i g h t=r +(16−r % 1 6 ) ;

96 i n t n e w w i d t h= CUDART PI F∗r +(16−(i n t) ( CUDART PI F∗r ) % 1 6 ) ; 97

98 p r i n t f ( ”%d %d %d\n ” , n e w h e i g h t , n e w w i d t h , r ) ; 99

100 c v S e t I m a g e R O I ( i n p u t i m a g e , c v R e c t ( maxx−r , maxy−r , 2∗r , 2∗r ) ) ; 101 I p l I m a g e∗ img = c v C r e a t e I m a g e ( c v S i z e ( 2∗r , 2∗r ) , i n p u t i m a g e−>d e p t h ,

102 i n p u t i m a g e−>n C h a n n e l s ) ;

103 c v C o p y ( i n p u t i m a g e , img , NULL ) ; 104 c v R e s e t I m a g e R O I ( i n p u t i m a g e ) ;

105 /∗

106 cvNamedWindow ( ” c i r c l e s ” , 1 ) ; 107 c v S h o w I m a g e ( ” c i r c l e s ” , img ) ;

108 c v S a v e I m a g e ( ” c i r c l e o u t p u t . j p g ” , img ) ;

109 cv Wai tKe y ( 0 ) ;

110 ∗/

111

112 i n t b p p = i n p u t i m a g e−>n C h a n n e l s ; 113

114 # i f d e f DEBUG

115 s t d : : c o u t << ”>> Width : ”<< w i d t h << s t d : : e n d l <<

116 ”>> H e i g h t : ” << h e i g h t << s t d : : e n d l <<

117 ”>>Bpp : ”<< b p p << s t d : : e n d l ; 118

119 s t d : : c o u t << s t d : : e n d l << ”>>> D e b u g g i n g O r i g i n a l d a t a : ”<< s t d : : e n d l ; 120 f o r (i n t i =0; i < w i d t h∗h e i g h t∗b p p ; i+=b p p )

121 {

122 i f ( ! ( i % ( w i d t h∗b p p ) ) ) 123 s t d : : c o u t << s t d : : e n d l ; 124

125 s t d : : c o u t << s t d : : d e c << ”R : ”<< (i n t) i n p u t i m a g e−>i m a g e D a t a [ i ] <<

126 ” G: ” << (i n t) i n p u t i m a g e−>i m a g e D a t a [ i +1] <<

127 ” B : ” << (i n t) i n p u t i m a g e−>i m a g e D a t a [ i +2] << ” ” ;

128 }

129 s t d : : c o u t << s t d : : e n d l << s t d : : e n d l ; 130 #e n d i f

131

132 f l o a t∗ c p u i m a g e = new f l o a t[ w i d t h ∗ h e i g h t ∗ 4 ] ; 133 i f ( ! c p u i m a g e )

134 {

135 s t d : : c o u t << ”ERROR: F a i l e d t o a l l o c a t e memory ”<< s t d : : e n d l ;

136 r e t u r n −1;

137 }

138

139 f o r (i n t i = 0 ; i < 2∗r ∗ 2∗r ; i ++)

140 {

141 c p u i m a g e [ i ∗ 4 + 0 ] = (u n s i g n e d c h a r) img−>i m a g e D a t a [ i ∗ b p p + 0 ] / 2 5 5 . f ; 142 c p u i m a g e [ i ∗ 4 + 1 ] = (u n s i g n e d c h a r) img−>i m a g e D a t a [ i ∗ b p p + 1 ] / 2 5 5 . f ; 143 c p u i m a g e [ i ∗ 4 + 2 ] = (u n s i g n e d c h a r) img−>i m a g e D a t a [ i ∗ b p p + 2 ] / 2 5 5 . f ;

144 }

145

146 f l o a t∗ c p u o u t i m a g e = new f l o a t[ n e w w i d t h ∗ n e w h e i g h t ∗ 4 ] ; 147 i f ( ! c p u o u t i m a g e )

148 {

149 s t d : : c o u t << ”ERROR: F a i l e d t o a l l o c a t e memory ”<< s t d : : e n d l ;

150 r e t u r n −1;

151 }

152

153 # i f d e f DEBUG TIME

154 // S t a r t c l o c k

(48)

155 s t r u c t t i m e b s t a r t t i m e s t ; 156 f t i m e (& s t a r t t i m e s t ) ; 157 #e n d i f

158

159 f l o a t∗ g p u i m a g e = NULL ;

160 c u d a E r r o r t c u d a e r r = c u d a M a l l o c ( (v o i d ∗∗)(& g p u i m a g e ) ,

161 ( 2∗r ∗ 2∗r ∗ 4 ) ∗ s i z e o f(f l o a t) ) ;

162 i f ( c u d a e r r != c u d a S u c c e s s )

163 {

164 s t d : : c o u t << ”ERROR: F a i l e d c u d a M a l l o c ”<< s t d : : e n d l ;

165 r e t u r n −1;

166 }

167

168 c u d a e r r = cudaMemcpy ( g p u i m a g e , c p u i m a g e , ( 2∗r ∗ 2∗r ∗ 4 ) ∗ s i z e o f(f l o a t) ,

169 c u d a M e m c p y H o s t T o D e v i c e ) ;

170 i f ( c u d a e r r != c u d a S u c c e s s )

171 {

172 s t d : : c o u t << ”ERROR: F a i l e d cudaMemcpy ” << s t d : : e n d l ;

173 r e t u r n −1;

174 }

175

176 f l o a t∗ g p u o u t i m a g e = NULL ;

177 c u d a E r r o r t c u d a e r r 1 = c u d a M a l l o c ( (v o i d ∗ ∗)

178 (& g p u o u t i m a g e ) ,

179 ( n e w w i d t h ∗ n e w h e i g h t ∗ 4 )

180 ∗ s i z e o f(f l o a t) ) ;

181 i f ( c u d a e r r 1 != c u d a S u c c e s s )

182 {

183 s t d : : c o u t << ”ERROR: F a i l e d c u d a M a l l o c ”<< s t d : : e n d l ;

184 r e t u r n −1;

185 }

186

187 dim3 b l o c k ( 1 6 , 1 6 ) ;

188 dim3 g r i d ( (i n t) c e i l (d o u b l e( ( n e w w i d t h ∗ n e w h e i g h t ) / 2 5 6 . 0 ) ) ) ; 189

190 c u d a t r a n s f o r m ( g p u i m a g e , g p u o u t i m a g e , 2∗r , 2∗r , 191 n e w w i d t h , n e w h e i g h t , g r i d , b l o c k ) ; 192

193 cudaMemcpy ( c p u o u t i m a g e , g p u o u t i m a g e , ( n e w w i d t h ∗ n e w h e i g h t ∗ 4 ) 194 ∗ s i z e o f(f l o a t) , c u d a M e m c p y D e v i c e T o H o s t ) ;

195 i f ( c u d a e r r != c u d a S u c c e s s )

196 {

197 s t d : : c o u t << ”ERROR: F a i l e d cudaMemcpy ” << s t d : : e n d l ;

198 r e t u r n −1;

199 }

200

201 # i f d e f DEBUG TIME

202 // S t o p c l o c k

203 s t r u c t t i m e b s t o p t i m e s t ; 204 f t i m e (& s t o p t i m e s t ) ;

205 d o u b l e e l a p s e d = ( (d o u b l e) s t o p t i m e s t . t i m e +

206 ( (d o u b l e) s t o p t i m e s t . m i l l i t m ∗ 0 . 0 0 1 ) ) −

207 ( (d o u b l e) s t a r t t i m e s t . t i m e + ( (d o u b l e) s t a r t t i m e s t . m i l l i t m ∗ 0 . 0 0 1 ) ) ; 208

209 s t d : : c o u t << ”∗ Time e l a p s e d : ” << s t d : : s e t p r e c i s i o n ( 5 ) <<

210 << e l a p s e d << ” s e c ”<< s t d : : e n d l ;

211 #e n d i f 212

213 c h a r∗ b u f f = new c h a r[ n e w w i d t h ∗ n e w h e i g h t ∗ b p p ] ; 214 i f ( ! b u f f )

215 {

216 s t d : : c o u t << ”ERROR: F a i l e d t o a l l o c a t e memory ”<< s t d : : e n d l ;

217 r e t u r n −1;

218 }

(49)

39

219 220

221 f o r (i n t i = 0 ; i < ( n e w w i d t h ∗ n e w h e i g h t ) ; i ++)

222 {

223 b u f f [ i ∗ b p p + 0 ] = (c h a r) f l o o r ( c p u o u t i m a g e [ i ∗ 4 + 0 ] ∗ 2 5 5 . f ) ; 224 b u f f [ i ∗ b p p + 1 ] = (c h a r) f l o o r ( c p u o u t i m a g e [ i ∗ 4 + 1 ] ∗ 2 5 5 . f ) ; 225 b u f f [ i ∗ b p p + 2 ] = (c h a r) f l o o r ( c p u o u t i m a g e [ i ∗ 4 + 2 ] ∗ 2 5 5 . f ) ;

226 }

227

228 # i f d e f DEBUG

229 s t d : : c o u t << s t d : : e n d l << ”>>> D e b u g g i n g O u t p u t d a t a : ”<< s t d : : e n d l ; 230 f o r (i n t i =0; i < w i d t h∗h e i g h t∗b p p ; i+=b p p )

231 {

232 i f ( ! ( i % ( w i d t h∗b p p ) ) ) 233 s t d : : c o u t << s t d : : e n d l ; 234

235 s t d : : c o u t << s t d : : d e c << ”R : ”<< (i n t) b u f f [ i ] <<

236 ” G: ” << (i n t) b u f f [ i +1]<<

237 ” B : ” << (i n t) b u f f [ i +2]<< ” ” ;

238 }

239 s t d : : c o u t << s t d : : e n d l << s t d : : e n d l ; 240 #e n d i f

241

242 I p l I m a g e∗ o u t i m a g e = c v C r e a t e I m a g e ( c v S i z e ( n e w w i d t h , n e w h e i g h t ) ,

243 i n p u t i m a g e−>d e p t h , b p p ) ;

244 i f ( ! o u t i m a g e )

245 {

246 s t d : : c o u t << ”ERROR: F a i l e d c v C r e a t e I m a g e ”<< s t d : : e n d l ;

247 r e t u r n −1;

248 }

249

250 o u t i m a g e−>i m a g e D a t a = b u f f ; 251

252 i f ( ! c v S a v e I m a g e ( a r g v [ 2 ] , o u t i m a g e ) )

253 {

254 s t d : : c o u t << ”ERROR: F a i l e d c v S a v e I m a g e ”<< s t d : : e n d l ;

255 }

256

257 c u d a e r r = c u d a F r e e ( g p u i m a g e ) ; 258 i f ( c u d a e r r != c u d a S u c c e s s )

259 {

260 s t d : : c o u t << ”ERROR: F a i l e d c u d a F r e e ”<< s t d : : e n d l ;

261 r e t u r n −1;

262 }

263

264 c u d a e r r 1 = c u d a F r e e ( g p u o u t i m a g e ) ; 265 i f ( c u d a e r r 1 != c u d a S u c c e s s )

266 {

267 s t d : : c o u t << ”ERROR: F a i l e d c u d a F r e e ”<< s t d : : e n d l ;

268 r e t u r n −1;

269 }

270

271 c v R e l e a s e I m a g e (& i n p u t i m a g e ) ; 272 c v R e l e a s e I m a g e (& o u t i m a g e ) ; 273

274

275 d e l e t e[ ] c p u i m a g e ; 276 d e l e t e[ ] b u f f ; 277

278 r e t u r n 0 ;

279 }

(50)

unroll kernels.h

Zaglavna datoteka:

1

2 #i n c l u d e <c u d a r u n t i m e a p i . h>

3 #i n c l u d e <c u d a . h>

4 #i n c l u d e <m a t h c o n s t a n t s . h>

5 #i n c l u d e <c u t i l m a t h . h>

6

7 e x t e r n ”C” v o i d c u d a t r a n s f o r m (f l o a t∗ imagem , f l o a t∗ o u t i m a g e , i n t w i d t h ,

8 i n t h e i g h t , i n t n e w w i d t h , i n t n e w h e i g h t ,

9 dim3 b l o c k s , dim3 b l o c k s i z e ) ;

unroll kernels.cu

Funkcije, ki se izvajajo na grafiˇ cni kartici:

1 #i n c l u d e ” i n t e r n a l / c u t i l m a t h b u g f i x e s . h ” 2 #d e f i n e WEIGHTS b s p l i n e w e i g h t s

3 #i n c l u d e ” i n t e r n a l / b s p l i n e k e r n e l . c u ” 4 #i n c l u d e <m a t h c o n s t a n t s . h>

5

6 d e v i c e v o i d f i l t e r ( f l o a t 4∗ img , f l o a t 4∗ o u t i m a g e , i n t w i d t h , i n t h e i g h t ,

7 d o u b l e x , d o u b l e y ,i n t i )

8 {

9 f l o a t d x=r e m a i n d e r ( x , 1 ) ;

10 f l o a t d y=r e m a i n d e r ( y , 1 ) ;

11 i n t o l d i = f l o o r ( y−0 . 5 )∗( w i d t h )+ f l o o r ( x−0 . 5 ) ;

12

13 i n t b p p = 4 ;

14 i n t p x = (i n t) x ; // f l o o r o f x

15 i n t p y = (i n t) y−0 . 5 ; // f l o o r o f y

16 c o n s t i n t s t r i d e = w i d t h ;

17

18 // C a l c u l a t e t h e w e i g h t s f o r e a c h p i x e l

19 d o u b l e f x = d x ;

20 d o u b l e f y = d y ;

21 d o u b l e f x 1 = 1 . 0 f − f x ;

22 d o u b l e f y 1 = 1 . 0 f − f y ;

23

24 d o u b l e w1 = 0 . 0 1 + f x 1 ∗ f y 1 ∗ 0 . 9 f ;

25 d o u b l e w2 = 0 . 0 1 + f x ∗ f y 1 ∗ 0 . 9 f ;

26 d o u b l e w3 = 0 . 0 1 + f x 1 ∗ f y ∗ 0 . 9 f ;

27 d o u b l e w4 = 0 . 0 1 + f x ∗ f y ∗ 0 . 9 f ;

28

29 f l o a t r = ( img [ o l d i ] . x ∗ w1 +

30 img [ o l d i + 1 ] . x ∗ w2 +

31 img [ o l d i + s t r i d e ] . x ∗ w3 +

32 img [ o l d i + s t r i d e + 1 ] . x ∗ w4 ) ;

33 f l o a t g = ( img [ o l d i ] . y ∗ w1 +

34 img [ o l d i + 1 ] . y ∗ w2 +

35 img [ o l d i + s t r i d e ] . y ∗ w3 +

36 img [ o l d i + s t r i d e + 1 ] . y ∗ w4 ) ;

37 f l o a t b = ( img [ o l d i ] . z ∗ w1 +

38 img [ o l d i + 1 ] . z ∗ w2 +

39 img [ o l d i + s t r i d e ] . z ∗ w3 +

40 img [ o l d i + s t r i d e + 1 ] . z ∗ w4 ) ;

41 o u t i m a g e [ i ] = m a k e f l o a t 4 ( r , g , b , 0 ) ;

42 }

(51)

41

43

44 g l o b a l v o i d t r a n s f o r m ( f l o a t 4∗ imagem , f l o a t 4∗ o u t i m a g e , i n t w i d t h , 45 i n t h e i g h t , i n t n e w w i d t h , i n t n e w h e i g h t )

46 {

47 c o n s t i n t i = b l o c k I d x . x ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ) + 48 b l o c k D i m . x ∗ t h r e a d I d x . y + t h r e a d I d x . x ;

49

50 i f( i < n e w w i d t h ∗ n e w h e i g h t )

51 {

52

53 // i n t x = b l o c k I d x . x∗b l o c k D i m . x + t h r e a d I d x . x ; 54 // i n t y = b l o c k I d x . y∗b l o c k D i m . y + t h r e a d I d x . y ; 55 i n t x = r e m a i n d e r ( (d o u b l e) i , (d o u b l e) n e w w i d t h ) ;

56 i n t y = f l o o r f ( (d o u b l e) ( i / n e w w i d t h ) ) ;

57 d o u b l e x 1 = −((d o u b l e) ( x )∗2∗CUDART PI F / (d o u b l e) n e w w i d t h ) ;

58 d o u b l e y 1 = ( (d o u b l e) ( y ) / (d o u b l e) n e w h e i g h t )−1;

59 d o u b l e o l d x 1 = y 1∗c o s f ( x 1 ) ;

60 d o u b l e o l d y 1 = y 1∗s i n f ( x 1 ) ;

61 d o u b l e o l d x = ( ( o l d x 1 + 1 )∗(d o u b l e) w i d t h / 2 ) ;

62 d o u b l e o l d y = ( ( o l d y 1 + 1 )∗(d o u b l e) h e i g h t / 2 ) ;

63 i n t o l d i = f l o o r f ( o l d y )∗w i d t h+ f l o o r f ( o l d x ) ;

64 // f l o a t r = imagem [ o l d i ] . x ;

65 // f l o a t g = imagem [ o l d i ] . y ;

66 // f l o a t b = imagem [ o l d i ] . z ;

67 // o u t i m a g e [ i ] = m a k e f l o a t 4 ( r , g , b , 0 ) ;

68 f i l t e r ( imagem , o u t i m a g e , w i d t h , h e i g h t , o l d x , o l d y , i ) ;

69 }

70 }

71

72 e x t e r n ”C” v o i d c u d a t r a n s f o r m (f l o a t∗ imagem , f l o a t∗ o u t i m a g e , i n t w i d t h , 73 i n t h e i g h t ,i n t n e w w i d t h , i n t n e w h e i g h t , dim3 b l o c k s , dim3 b l o c k s i z e )

74 {

75 t r a n s f o r m <<< b l o c k s , b l o c k s i z e >>> ( ( f l o a t 4∗) imagem , 76 ( f l o a t 4∗) o u t i m a g e , w i d t h , h e i g h t , n e w w i d t h , n e w h e i g h t ) ;

77 }

(52)
(53)

Program unroll center

Program poˇ zenemo kot: unroll_center vhodna_datoteka.jpg izhodna_datoteka.jpg.

Pri tem je vhodna_datoteka.jpg vhodna datoteka tipa jpg in izhodna_datoteka.jpg izhodna datoteka tipa jpg.

Program doloˇ ci center in premer kroga za program v Matlabu. Matlabov program, opisan v nadaljevanju ga kliˇ ce. Program mora biti v istem imeniku, kot Matlabovi programi.

unroll center.cpp

1 #i n c l u d e <c v . h>

2 #i n c l u d e <h i g h g u i . h>

3 #i n c l u d e <math . h>

4

5 i n t n o t E n t i r e l y (i n t x , i n t y , i n t r , i n t width , i n t h e i g h t ) {

6 i f ( ( x−r<0) | | ( x+r>w i d t h ) | | ( y−r<0) | | ( y+r>h e i g h t ) ) return 1 ;

7 e l s e return 0 ;

8 }

9

10 i n t main (i n t a r g c , char∗∗ a r g v )

11 {

12 I p l I m a g e∗ img = cvLoadImage ( a r g v [ 1 ] , 1 ) ; ;

13 I p l I m a g e∗ g r a y = c v C r e a t e I m a g e ( c v G e t S i z e ( img ) , 8 , 1 ) ; 14 CvMemStorage∗ s t o r a g e = c v C r e a t e M e m S t o r a g e ( 0 ) ; 15 c v C v t C o l o r ( img , g r a y , CV BGR2GRAY ) ;

16 cvSmooth ( g r a y , g r a y , CV GAUSSIAN , 9 , 9 ) ; 17 CvSeq∗ c i r c l e s = c v H o u g h C i r c l e s ( g r a y , s t o r a g e , 18 CV HOUGH GRADIENT, 2 , g r a y−>h e i g h t / 4 , 2 0 0 , 1 0 0 ) ;

19 i n t i ;

20

21 // u g o t o v i n a j v e ? j i k r o g

22 i n t maxx=0;

23 i n t maxy=0;

24 i n t maxr =0;

25 f o r ( i = 0 ; i < c i r c l e s−>t o t a l ; i ++)

26 {

27 f l o a t∗ p = (f l o a t∗) cvGetSeqElem ( c i r c l e s , i ) ; 28

29 i n t x=cvRound ( p [ 0 ] ) ; 30 i n t y=cvRound ( p [ 1 ] ) ;

43

(54)

31 i n t r=cvRound ( p [ 2 ] ) ; 32

33 i f ( r>maxr ) {

34 maxx=x ;

35 maxy=y ;

36 maxr=r ;

37 }

38

39 /∗c v C i r c l e ( img , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,

40 3 , CV RGB ( 0 , 2 5 5 , 0 ) , −1 , 8 , 0 ) ;

41 c v C i r c l e ( img , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,

42 cvRound ( p [ 2 ] ) , CV RGB ( 2 5 5 , 0 , 0 ) , 3 , 8 , 0 ) ;∗/

43

44 }

45 // Ce k r o g n i v c e l o t i na s l i k i , v z e m i k a r g e o m e t r i j s k o

46 // s r e d i s c e s l i k e . . .

47 i f ( n o t E n t i r e l y ( maxx , maxy , maxr , g r a y−>width , g r a y−>h e i g h t ) ) { 48 maxx=cvRound ( g r a y−>w i d t h / 2 ) ;

49 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

50 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

51 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ;

52 }

53

54 // Ce j e k r o g m a n j s i od 80% n a j m a n s e z u n a n j e d i m e n z i j e 55 // s l i k e , vzemimo g e o m e t r i s k o s r e d i s c e s l i k e

56

57 i f ( maxr<0 . 8∗( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

58 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ){

59 maxx=cvRound ( g r a y−>w i d t h / 2 ) ; 60 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

61 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ?

62 cvRound ( g r a y−>h e i g h t / 2 ) : cvRound ( g r a y−>w i d t h / 2 ) ) ;

63 }

64

65 // cvNamedWindow ( ” c i r c l e s ” , 1 ) ; 66 // c v S h o w I m a g e ( ” c i r c l e s ” , img ) ;

67 // c v S a v e I m a g e ( ” c i r c l e o u t p u t . j p g ” , img ) ; 68 // c v W a i t K e y ( 0 ) ;

69 p r i n t f ( ”%d %d %d\n ” , maxx , maxy , maxr ) ;

70 return 0 ;

71 }

(55)

Program unroll: programska zanka

Program poˇ zenemo kot: unroll vhodna_datoteka.jpg izhodna_datoteka.jpg. Pri tem je vhodna_datoteka.jpg vhodna datoteka tipa jpg in izhodna_datoteka.jpg iz- hodna datoteka tipa jpg.

Program prebere vhodno vsesmerno sliko v vhodni datoteki, s Hughovo transformacijo poiˇ sˇ ce center in izpiˇ se panoramsko sliko vhodne slike v izhodno datoteko.

unroll.cc

1 #i n c l u d e <o p e n c v / c v . h>

2 #i n c l u d e <o p e n c v / h i g h g u i . h>

3 #i n c l u d e <i o m a n i p>

4 #i n c l u d e <i o s t r e a m>

5 #i n c l u d e <math . h>

6 #i n c l u d e <s y s / t i m e b . h>

7 #i n c l u d e <t i m e . h>

8 9

10 #d e f i n e DEBUG TIME 11

12 void f i l t e r (f l o a t∗ img , f l o a t∗ o u t i m a g e , i n t width , i n t h e i g h t , double x ,

13 double y ,i n t i )

14 {

15 f l o a t dx=r e m a i n d e r ( x , 1 ) ; 16 f l o a t dy=r e m a i n d e r ( y , 1 ) ;

17 i n t o l d i = f l o o r ( y−0 . 5 )∗( w i d t h )+ f l o o r ( x−0 . 5 ) ; 18

19 i n t bpp = 4 ;

20 i n t px = (i n t) x ; // f l o o r o f x 21 i n t py = (i n t) y−0 . 5 ; // f l o o r o f y 22 const i n t s t r i d e = w i d t h ;

23

24 // C a l c u l a t e t h e w e i g h t s f o r e a c h p i x e l

25 double f x = dx ;

26 double f y = dy ;

27 double f x 1 = 1 . 0 f − f x ; 28 double f y 1 = 1 . 0 f − f y ; 29

30 double w1 = 0 . 0 1 + f x 1 ∗ f y 1 ∗ 0 . 9 f ;

45

(56)

31 double w2 = 0 . 0 1 + f x ∗ f y 1 ∗ 0 . 9 f ; 32 double w3 = 0 . 0 1 + f x 1 ∗ f y ∗ 0 . 9 f ; 33 double w4 = 0 . 0 1 + f x ∗ f y ∗ 0 . 9 f ; 34

35 o u t i m a g e [ i∗4 ] = ( img [ o l d i∗4+0] ∗ w1 +

36 img [ ( o l d i +1)∗4+0] ∗ w2 +

37 img [ ( o l d i+ s t r i d e )∗4 + 0 ] ∗ w3 +

38 img [ ( o l d i+ s t r i d e +1)∗4+0] ∗ w4 ) ;

39 o u t i m a g e [ i∗4+1] = ( img [ o l d i∗4+1] ∗ w1 +

40 img [ ( o l d i +1)∗4+1] ∗ w2 +

41 img [ ( o l d i+ s t r i d e )∗4 + 1 ] ∗ w3 +

42 img [ ( o l d i+ s t r i d e +1)∗4+1]∗ w4 ) ;

43 o u t i m a g e [ i∗4+2] = ( img [ o l d i∗4+2] ∗ w1 +

44 img [ ( o l d i +1)∗4+2] ∗ w2 +

45 img [ ( o l d i+ s t r i d e )∗4 + 2 ] ∗ w3 +

46 img [ ( o l d i+ s t r i d e +1)∗4+2]∗ w4 ) ;

47 }

48

49 void t r a n s f o r m (f l o a t∗ imagem , f l o a t∗ o u t i m a g e , i n t width , i n t h e i g h t ,

50 i n t newwidth , i n t n e w h e i g h t )

51 {

52 f o r (i n t y =0; y<n e w h e i g h t ; y++){

53 f o r (i n t x =0; x<newwidth ; x++){

54 // i n t x = r e m a i n d e r ( ( d o u b l e ) i , ( d o u b l e ) n e w w i d t h ) ; 55 // i n t y = f l o o r f ( ( d o u b l e ) ( i / n e w w i d t h ) ) ;

56 i n t i = f l o o r f ( y )∗newwidth+ f l o o r f ( x ) ;

57 double x1 = −((double) ( x )∗2∗M PI / (double) newwidth ) ; 58 double y1 = ( (double) ( y ) / (double) n e w h e i g h t )−1;

59 double o l d x 1 = y1∗c o s f ( x1 ) ; 60 double o l d y 1 = y1∗s i n f ( x1 ) ;

61 double o l d x = ( ( o l d x 1 + 1 )∗(double) w i d t h / 2 ) ; 62 double o l d y = ( ( o l d y 1 + 1 )∗(double) h e i g h t / 2 ) ; 63 i n t o l d i = f a b s ( f l o o r f ( o l d y )∗w i d t h+ f l o o r f ( o l d x ) ) ; 64 // f l o a t r = imagem [ o l d i ] . x ;

65 // f l o a t g = imagem [ o l d i ] . y ; 66 // f l o a t b = imagem [ o l d i ] . z ;

67 // o u t i m a g e [ i ] = m a k e f l o a t 4 ( r , g , b , 0 ) ;

68 f i l t e r ( imagem , o u t i m a g e , width , h e i g h t , o l d x , o l d y , i ) ;

69 }

70 }

71 }

72

73 i n t n o t E n t i r e l y (i n t x , i n t y , i n t r , i n t width , i n t h e i g h t ) { 74 i f ( ( x−r<0) | | ( x+r>w i d t h ) | | ( y−r<0) | | ( y+r>h e i g h t ) ) return 1 ; 75 e l s e return 0 ;

76 }

77

78 i n t main (i n t a r g c , char∗∗ a r g v )

79 {

80 i f ( a r g c < 3 )

81 {

82 s t d : : c o u t << ” U p o r a b i : ” << a r g v [ 0 ] << ” <i n p u t>” << ” <o u t p u t>” << s t d : : e n d l ; 83 e x i t ( 1 ) ;

84 }

85

86 I p l I m a g e∗ i n p u t i m a g e = NULL ;

87 i n p u t i m a g e = cvLoadImage ( a r g v [ 1 ] , CV LOAD IMAGE UNCHANGED ) ; 88 i f( ! i n p u t i m a g e )

89 {

90 s t d : : c o u t << ”ERROR: F a i l e d t o l o a d i n p u t i m a g e ” << s t d : : e n d l ;

91 return −1;

92 }

93

94 I p l I m a g e∗ g r a y = c v C r e a t e I m a g e ( c v G e t S i z e ( i n p u t i m a g e ) , 8 , 1 ) ;

(57)

47

95 CvMemStorage∗ s t o r a g e = c v C r e a t e M e m S t o r a g e ( 0 ) ; 96 c v C v t C o l o r ( i n p u t i m a g e , g r a y , CV BGR2GRAY ) ; 97 cvSmooth ( g r a y , g r a y , CV GAUSSIAN , 9 , 9 ) ; 98 CvSeq∗ c i r c l e s = c v H o u g h C i r c l e s ( g r a y , s t o r a g e ,

99 CV HOUGH GRADIENT, 2 , g r a y−>h e i g h t / 8 , 2 0 0 ,

100 1 0 0 , g r a y−>h e i g h t / 8 ,

101 ( g r a y−>width> g r a y−>h e i g h t ?

102 g r a y−>h e i g h t : g r a y−>w i d t h ) ) ;

103

104 i n t w i d t h = i n p u t i m a g e−>w i d t h ; 105 i n t h e i g h t = i n p u t i m a g e−>h e i g h t ; 106

107 // u g o t o v i n a j v e ? j i k r o g

108 i n t maxx=0; i n t maxy=0; i n t maxr =0; i n t i ;

109

110 f o r ( i = 0 ; i < c i r c l e s−>t o t a l ; i ++)

111 {

112 f l o a t∗ p = (f l o a t∗) cvGetSeqElem ( c i r c l e s , i ) ; 113

114 i n t x=cvRound ( p [ 0 ] ) ; i n t y=cvRound ( p [ 1 ] ) ; i n t r=cvRound ( p [ 2 ] ) ; 115

116 i f ( r>maxr ) {

117 maxx=x ; maxy=y ; maxr=r ;

118 }

119

120 c v C i r c l e ( i n p u t i m a g e , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) ,

121 3 , CV RGB ( 0 , 2 5 5 , 0 ) , −1 , 8 , 0 ) ;

122 c v C i r c l e ( i n p u t i m a g e , c v P o i n t ( cvRound ( p [ 0 ] ) , cvRound ( p [ 1 ] ) ) , 123 cvRound ( p [ 2 ] ) , CV RGB ( 2 5 5 , 0 , 0 ) , 3 , 8 , 0 ) ;

124

125 }

126

127 // Ce k r o g n i v c e l o t i na s l i k i , v z e m i k a r g e o m e t r i j s k o s r e d i s c e s l i k e . . . 128 i f ( n o t E n t i r e l y ( maxx , maxy , maxr , g r a y−>width , g r a y−>h e i g h t ) ) {

129 maxx=cvRound ( g r a y−>w i d t h / 2 ) ; 130 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

131 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ? cvRound ( g r a y−>h e i g h t / 2 ) : 132 cvRound ( g r a y−>w i d t h / 2 ) ) ;

133 }

134

135 // Ce j e k r o g m a n j s i od 80% n a j m a n j s e z u n a n j e d i m e n z i j e s l i k e , 136 // v z e m i g e o m e t r i s k o s r e d i s c e s l i k e

137

138 i f ( maxr<0 . 8∗( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ? cvRound ( g r a y−>h e i g h t / 2 ) :

139 cvRound ( g r a y−>w i d t h / 2 ) ) ){

140 maxx=cvRound ( g r a y−>w i d t h / 2 ) ; 141 maxy=cvRound ( g r a y−>h e i g h t / 2 ) ;

142 maxr=( ( g r a y−>w i d t h > g r a y−>h e i g h t ) ? cvRound ( g r a y−>h e i g h t / 2 ) : 143 cvRound ( g r a y−>w i d t h / 2 ) ) ;

144 }

145

146 i n t r =0;

147 i n t n e w h e i g h t=r ; 148

149 i f ( h e i g h t > 2 ∗ maxy ) n e w h e i g h t = maxy ; 150 e l s e n e w h e i g h t = h e i g h t−maxy ;

151

152 r=maxr−(maxr % 8 ) ; 153 n e w h e i g h t=r +(16−r % 1 6 ) ;

154 i n t newwidth= M PI∗r +(16−(i n t) ( M PI∗r ) % 1 6 ) ; ; 155

156 p r i n t f ( ”%d %d %d\n ” , n e w h e i g h t , newwidth , r ) ; 157

158 cvSetImageROI ( i n p u t i m a g e , c v R e c t ( maxx−r , maxy−r , 2∗r , 2∗r ) ) ;

(58)

159 I p l I m a g e∗ img = c v C r e a t e I m a g e ( c v S i z e ( 2∗r , 2∗r ) , i n p u t i m a g e−>depth ,

160 i n p u t i m a g e−>n C h a n n e l s ) ;

161 cvCopy ( i n p u t i m a g e , img , NULL ) ; 162 cvResetImageROI ( i n p u t i m a g e ) ; 163

164 cvNamedWindow ( ” c i r c l e s ” , 1 ) ; 165 cvShowImage ( ” c i r c l e s ” , img ) ;

166 c v S a v e I m a g e ( ” c i r c l e o u t p u t . j p g ” , img ) ; 167 cvWaitKey ( 0 ) ;

168 169

170 i n t bpp = i n p u t i m a g e−>n C h a n n e l s ; 171

172 #i f d e f DEBUG

173 s t d : : c o u t << ”>> Width : ” << w i d t h << s t d : : e n d l <<

174 ”>> H e i g h t : ” << h e i g h t << s t d : : e n d l <<

175 ”>>Bpp : ” << bpp<< s t d : : e n d l ; 176

177 s t d : : c o u t << s t d : : e n d l<< ”>>> D e b u g g i n g O r i g i n a l d a t a : ”<< s t d : : e n d l ; 178 f o r (i n t i =0; i < w i d t h∗h e i g h t∗bpp ; i+=bpp )

179 {

180 i f ( ! ( i % ( w i d t h∗bpp ) ) ) 181 s t d : : c o u t<< s t d : : e n d l ; 182

183 s t d : : c o u t << s t d : : d e c << ”R : ”<< (i n t) i n p u t i m a g e−>imageData [ i ] <<

184 ” G: ”<< (i n t) i n p u t i m a g e−>imageData [ i +1]<<

185 ” B : ”<< (i n t) i n p u t i m a g e−>imageData [ i +2]<< ” ” ;

186 }

187 s t d : : c o u t << s t d : : e n d l<< s t d : : e n d l ; 188 #e n d i f

189

190 f l o a t∗ c p u i m a g e =new f l o a t[ w i d t h ∗ h e i g h t ∗ 4 ] ; 191 i f ( ! c p u i m a g e )

192 {

193 s t d : : c o u t << ”ERROR: F a i l e d t o a l l o c a t e memory” << s t d : : e n d l ;

194 return −1;

195 }

196

197 f o r (i n t i = 0 ; i < 2∗r ∗ 2∗r ; i ++)

198 {

199 c p u i m a g e [ i ∗ 4 + 0 ] = (unsigned char) img−>imageData [ i ∗ bpp + 0 ] / 2 5 5 . f ; 200 c p u i m a g e [ i ∗ 4 + 1 ] = (unsigned char) img−>imageData [ i ∗ bpp + 1 ] / 2 5 5 . f ; 201 c p u i m a g e [ i ∗ 4 + 2 ] = (unsigned char) img−>imageData [ i ∗ bpp + 2 ] / 2 5 5 . f ; 202 c p u i m a g e [ i ∗ 4 + 3 ] = (unsigned char) img−>imageData [ i ∗ bpp + 2 ] / 2 5 5 . f ;

203 }

204

205 f l o a t∗ c p u o u t i m a g e =new f l o a t[ newwidth ∗ n e w h e i g h t ∗ 4 ] ; 206 i f ( ! c p u o u t i m a g e )

207 {

208 s t d : : c o u t << ”ERROR: F a i l e d t o a l l o c a t e memory” << s t d : : e n d l ;

209 return −1;

210 }

211

212 #i f d e f DEBUG TIME 213 // S t a r t c l o c k

214 s t r u c t t i m e b s t a r t t i m e s t ; 215 f t i m e (& s t a r t t i m e s t ) ; 216 #e n d i f

217 218

219 t r a n s f o r m ( c p u i m a g e , c p u o u t i m a g e , 2∗r , 2∗r , newwidth , n e w h e i g h t ) ; 220

221

222 #i f d e f DEBUG TIME

Reference

POVEZANI DOKUMENTI

Nov postopek in dina- mična orodja FreeTurn so že navdušila več proizvodnih podjetij. Postopek struženja z visoko dinamiko obračanja orodja (HDT) je že prejel številne nagrade

Višino kamere lahko nastavimo tudi v oknu scene tako, da izberemo kamero in povlečemo prikazane puščice v želeno smer (slika 4).. Slika 4: Prikaz možnosti

Za izvedbo vaje mobilni robot potrebujemo (slika 4.32): predelan servomotor (enosmerni elektromotor), 2 palici s šestimi utori premera 5 mm, 2 palici z osmimi utori premera

Slika 2: Razširjenost pazinske, tržaške in čičarijske morfološke rase Niphargus krameri...5 Slika 3: Prikaz lokalitet in pripadnosti morfološki rasi molekulsko analiziranih

in kromatogram standardne raztopine hipurne kisline (2 mM) 41 Slika 4: Nastanek HA ob dodatku različno razredčenega ekstrakta T1 v reakcijsko mešanico 42 Slika 5: Nastanek HA

Valvasorjevo risbo z drugačno postavitvijo kamere 43 Slika 53: Perspektiva 3D rekonstrukcije ortofoto načrta izseka Lože 44 Slika 54: Fotografija širšega območja izseka Lože

Slika 1: Shema optične pasti (Block, 2003) ………...……..5 Slika 2: Primerjava izmerjenih viskoznosti različnih bakterijskih vzorcev vzetih med različnimi fazami rasti

Slika 5: Osnovna mikrostruktura materiala presku{anega bata Figure 5: Basic microstructure of the material of the tested piston Slika 4: Razpoka v martenzitno-avstenitni