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
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.
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:
Zahvala za to diplomsko delo gre moji druˇ zini ter mentorju, viˇ s. pred. dr.
Borutu Batagelju. Brez njih mi ne bi uspelo.
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
KAZALO
6 Priloga 33
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.
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.
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
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.
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
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).
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
20 0 0
0 a 1
20 0
0 0 − b 1
2− b e
20 0 − b e
2− e b
22+ 1
x y z 1
= 0 (2.1)
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].
.
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).
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)
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.
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)
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
2x
cos θ (2.20)
v = f
d+
√
g
2−x
2x
sin θ (2.21)
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
(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.
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
0x
1Slika 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.
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].
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 ) ;
// 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 ) ;
. . .
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
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.
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].
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].
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;
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.
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].
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
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
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
[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.
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
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
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
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
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 }
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 }
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 }
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 }
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
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 }
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
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 ) ;
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 ) ) ;
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