Kamerakalibráció OpenCV-ben TDK dolgozat
Fenyvesi Attila
Konzulensek: Dr. Antal Ákos Dr. Tamás Péter
Budapest, 2015
Kivonat Jelen dolgozatban először áttekintem a kamerakalibráció alapfogalmait (kameramodell, torzítások), majd a leképezés matematikai modelljét veszem vizsgálat alá. A leképezés egyenleteit olyan ábrával illusztrálom, mely szemléletesebb az OpenCV dokumentációjában megtalálható ábráknál. Az ábra és a matematikai modell helyességét a különböző paraméterek változtatásával lefuttatott kalibrációk eredményével támasztom alá. Ezt követően az OpenCV Ubuntu rendszerre való telepítésének és a CodeBlocks IDE beállításának egy egyszerű, ámde nem közismert módja kerül bemutatásra. Az OpenCV által felismert kalibrációs mintákon túl kitérek az újabb kutatások által javasolt mintákra is. Bemutatom a kalibrációs táblák és a fényképek készítésének buktatóit, melyek kiküszöbölésével minimalizálható a sikertelen vagy rosszabb esetben sikeres, de helytelen mintafelismerés. Bevezetem a gyakorlatban eddig nem alkalmazott többszörös korrekció fogalmát. A torzítási paraméterek változását a korrekciók száma függvényében ábrázolom, majd a kapott diagramokat elemzem. A kamerák torzításának ábrázolására két módszert mutatok be. Az egyik a korrigált és az eredeti képeken található sarokpontokból, a másik a kameramodell egyenleteiből indul ki. A kamerakalibrációval kapcsolatban további kérdéseket vetek fel, melyekre a kutatás folytatása adhat választ.
Abstract Every optical system has distortion, so images need to be corrected so that they can be used for measurement purposes. Undistorted images have less but not zero distortion. If the distortion of a camera is small enough, the images can be used without undistortion. The distortion of each pixel of an image can be calculated using the distortion model of the camera. The result of this calculation can be used to determine the error of 3D measurements. (...) This article introduces two new methods for evaluating the distortion of cameras. (...)
TARTALOMJEGYZÉK
TARTALOMJEGYZÉK
Tartalomjegyzék 1. Bevezető
1
2. A kamerakalibráció alapjai
1
2.1. A tűlyuk kameramodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2.2. A valóságos lencsék . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
2.3. Extrinsic paraméterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2.4. Intrinsic paraméterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.5. A kameramodell egyenletei . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.5.1. A tárgypont transzformálása a kamera koordináta-rendszerbe . . . .
5
2.5.2. Vetítés a z = 1 síkba . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.5.3. Torzítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.5.4. A pixel koordináta meghatározása . . . . . . . . . . . . . . . . . . .
6
3. OpenCV
6
3.1. Telepítés Linux alá . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
3.2. Kalibrációs minták . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
3.2.1. A minta körüli keret . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2.2. A minta felülete . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2.3. A minta síklapúsága . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3.2.4. A megvilágítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
3.3. Kalibrációs példaprogram . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.4. A kalibráció eredményét igazoló kísérletek . . . . . . . . . . . . . . . . . . 11 3.4.1. Képkivágó program készítése . . . . . . . . . . . . . . . . . . . . . . 11 3.4.2. Kalibrálás eltolt kivágatok alapján . . . . . . . . . . . . . . . . . . 12 3.4.3. Kalibrálás átméretezett képeken . . . . . . . . . . . . . . . . . . . . 13 3.5. Többszörös korrekció alkalmazása . . . . . . . . . . . . . . . . . . . . . . . 14 3.5.1. A többszörös korrekció jelentése . . . . . . . . . . . . . . . . . . . . 14 3.5.2. A többszörös korrekció megvalósítása . . . . . . . . . . . . . . . . . 14 3.5.3. A többszörös korrekció hatásának elemzése . . . . . . . . . . . . . . 14 i
TARTALOMJEGYZÉK
TARTALOMJEGYZÉK
3.5.4. Értékelés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4. A kalibráció értékelése
16
4.1. Az egyes pixelek torzításának ábrázolása . . . . . . . . . . . . . . . . . . . 16 4.1.1. Torzítás számítása a torzítási modellből . . . . . . . . . . . . . . . . 16 4.1.2. Torzítás számítása a sarkok elmozdulásából . . . . . . . . . . . . . 17 5. Továbblépési lehetőség
17
5.1. Egy 3D letapogató kalibrációja . . . . . . . . . . . . . . . . . . . . . . . . 18 5.1.1. A letapogató felépítése . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.1.2. A mérés pontatlansága . . . . . . . . . . . . . . . . . . . . . . . . . 19 6. Mellékletek
19
6.1. captureImages.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 6.2. crop_image.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6.3. A kaliblib függvénykönyvtár . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.3.1. kaliblib.hpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 6.4. iter_undist_from_list.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
ii
2 A KAMERAKALIBRÁCIÓ ALAPJAI
1. Bevezető A valóságos lencserendszerek leképezési hibákkal terheltek, ezért a felvételek méréstechnikai alkalmazás előtt korrekcióra szorulnak. A torzítási modellt kalibrációval határozzák meg. A kapott paraméterek felhasználásával a torzítás csökkenthető. A geometriai kamerakalibráció (a továbbiakban: kamerakalibráció) egy számítógépi folyamat, melynek célja a tárgypontok és a pixelek közötti leképezés paramétereinek meghatározása. A kalibrációval meghatározott kameramodell segítségével a felvételek korrigálhatók, így méréstechnikai feladatokra is alkalmassá tehetők. Ilyen feladat például a 3D szkennelés, mely akár egy kamera, egy vonallézer és egy kalibrációs tábla segítségével is elvégezhető Zhiyi Zhang és Lin Yuan cikke szerint (Zhang and Yuan 2012).
2. A kamerakalibráció alapjai A következőekben áttekintem a kamerakalibráció megértéséhez szükséges alapvető fogalmakat. A paraméterek tekintetében az OpenCV jelöléseit fogom használni (Camera Calibration and 3D Reconstruction n.d.).
2.1. A tűlyuk kameramodell A kalibrációhoz a tűlyuk (pinhole) kameramodellt vesszük alapul. Ez megegyezik egy perspektivikus vetítéssel. A perspektivikus vetítés a vetítés középpontja és a tárgypont közötti szakasz és a képsík metszéspontjainak a meghatározását jelenti. Ezt szemlélteti az 1. ábra.
2.2. A valóságos lencsék A valóságban a lyukkameráknak nagyon kicsi az áteresztett teljesítménye. A teljesítmény növelésére optikai rendszereket használunk, cserébe azonban a kép torzulást szenved. A torzulás legfőbb oka a lencserendszer radiális torzítása, mely abban nyilvánul meg, hogy az optikai tengelytől távolodva változik a nagyítás. Erre mutat példákat a 2. ábra (forrás: 1
2.3 Extrinsic paraméterek
2 A KAMERAKALIBRÁCIÓ ALAPJAI Tárgysík Képsík
1. ábra. Tűlyuk kameramodell
2. ábra. Hordó, párna és bajusz típusú torzítás Wikipedia). Ezen kívül az optikai középpont és a detektor közepe gyakran néhány pixel eltérést mutat, valamint az optikai tengely nem egészen merőleges a detektorra (4. ábra). A valóságos lencséket tartalmazó kamerákat a kameraparaméterek segítségével írhatjuk le, melyeket a következő két csoportra szoktunk bontani: • intrinsic (belső) kameraparaméterek • extrinsic (külső) kameraparaméterek
2.3. Extrinsic paraméterek A kamera és a világ koordináta-rendszer viszonyát írják le az extrinsic paraméterek. Ez gyakorlatilag egy eltolás és egy forgatás egymásutánját jelenti. A világ koordinátarendszert t vektorral eltolva, valamint R mátrixszal elforgatva kapjuk meg a kamera koordináta-rendszert. Mivel az eltolás nem lineáris transzformáció, homogén koordinátákat kell használni. [x y z]Tc = [R |t ] [X Y Z 1]Tw 2
2 A KAMERAKALIBRÁCIÓ ALAPJAI
2.4 Intrinsic paraméterek
P
yw xw Ow t
yc xc Oc 3. ábra. Az eltolás vektora • A pozíció (t ) megadja a világ koordináta-rendszer középpontját (Ow ) a kamera −−−→ koordináta-rendszerhez képest (Oc ) , vagyis t = Oc Ow (3. ábra). • A forgatási mátrix (R ) a világ koordináta-rendszert a kamera koordináta-rendszerbe forgatja.
2.4. Intrinsic paraméterek A kamera belső paramétereit írják le az intrinsic paraméterek. Ezek a következők: • Az optikai középpont (cx , cy ) az optikai tengely és a képsík metszéspontjának pixel koordinátái a bal felső pixeltől számolva. • A radiális torzítás paraméterei (k1 , k2 , k3 , k4 , k5 , k6 ) a párna és hordó torzítás néven ismert torzítást írják le (2. ábra). • A tangenciális torzítás (p1 , p2 ) abból ered, hogy a képsík nem tökéletesen merőleges az optikai tengelyre (4. ábra). • A fókusztávolság (fx , fy ) a vetítés középpontjának és a képsíknak a távolságát adja meg pixelekben számolva. Olcsóbb detektorok pixelei nem teljesen négyzet alakúak, ezért van szükség két paraméterre. 3
2.5 A kameramodell egyenletei
2 A KAMERAKALIBRÁCIÓ ALAPJAI Optikai tengely
Detektor 4. ábra. A tangenciális hiba eredete
2.5. A kameramodell egyenletei
Az alábbiakban ismertetem a képalkotás matematikai modelljét a tárgyponttól a pixelig. A lépéseket az 5. ábra illetve az 1. egyenlet mutatja.
Y X
Z
P
Ow
P 00
u v
P0
C
z Oc
z=f x, x0 , x00 y, y 0 , y 00 5. ábra. A koordinátarendszerek szemléltetése 4
z=1
2 A KAMERAKALIBRÁCIÓ ALAPJAI
2.5 A kameramodell egyenletei
w,h w c c,n c,n px X 0 00 X x x x u Y =⇒ y =⇒ y 0 =⇒ y 00 =⇒ v Y =⇒ Z Z z 1 1 1 1
(1)
Az 1. egyenletben felső indexekben a koordináta-rendszereket jelöltem: • w: világ koordináta-rendszer • h: homogén koordináták: az utolsó koordináta értéke mindig 1, hogy az eltolás is megvalósítható legyen lineáris transzformációval (egy mátrixszal való szorzással) • c: kamera koordináta-rendszer: origója Oc , mely a leképezés középpontja, z tengelye áthalad a kép optikai középpontján (C), x és z tengelyei párhuzamosak az u és v tengelyekkel. • n: normalizált (z-vel leosztott) koordináták • px: pixel koordináta-rendszer 2.5.1. A tárgypont transzformálása a kamera koordináta-rendszerbe w,h c X x Y y = [R |t ] Z z 1
(2)
X, Y, Z a világbeli koordináták, x, y, z a kamerakoordináták. 2.5.2. Vetítés a z = 1 síkba c,n c 0 x x 1 0 y = y z 1 z
(3)
x0 , y 0 normalizált kamerakoordináták. 5
3 OPENCV
2.5.3. Torzítás A torzítási függvények normalizált koordinátákra vonatkoztatva vannak megadva. A normalizált koordináták mértékegysége [1], így a torzítási függvények sem a világ koordinátarendszer mértékegységétől, sem a pixelek nagyságától nem függnek. A következő egyenletek megadják a torzított képpont normalizált kamerakoordinátáit (x00 , y 00 ): r2 = x02 + y 02
(4)
x00 = x0
1 + k1 r2 + k2 r4 + k3 r6 + 2p1 x0 y 0 + p2 (r2 + 2x02 ) 1 + k4 r8 + k5 r10 + k6 r12
(5)
y 00 = y 0
1 + k1 r2 + k2 r4 + k3 r6 + p1 (r2 + 2y 02 ) + 2p2 x0 y 0 1 + k4 r8 + k5 r10 + k6 r12
(6)
2.5.4. A pixel koordináta meghatározása c,n px f 0 cx x00 u x v = 0 fy cy y 00 1 0 0 1 1 | {z }
(7)
A
u, v a képpont vízszintes és függőleges koordinátái pixelekben, a bal felső saroktól számolva, A a kameramátrix.
3. OpenCV Az OpenCV egy BSD licenc alatt szabadon felhasználható függvénykönyvtár. Nevét a Computer Vision (gépi látás) angol szavak rövidítéséből kapta. Rengeteg beépített függvénye van a geometriai kamerakalibráció és a képfeldolgozás területén. 6
3 OPENCV
3.1 Telepítés Linux alá
3.1. Telepítés Linux alá A függvénykönyvtár többféle programnyelven használható (C++, Python, Java), ezek közül azonban a legtöbb útmutató a C++-hoz van. A C++ függvénykönyvtárat valamint a Code::Blocks fejlesztőkörnyezetet Ubuntu 14.10 rendszeren a sudo apt−g e t i n s t a l l l i b o p e n c v −dev c o d e b l o c k s
paranccsal telepíthetjük parancssorból. A Code::Blocks 13.12-es verziójában megtalálható OpenCV mintaprojekt kis módosításra szorul, hogy a fordító megkapja a szükséges könyvtárneveket: a / u s r / s h a r e / c o d e b l o c k s / t e m p l a t e s / w i z a r d / opencv / w i z a r d . s c r i p t
fájlban két részletet kell kicserélni: ‘ opencv−c o n f i g −−c x x f l a g s ‘ h e l y e t t ‘ pkg−c o n f i g −−c f l a g s opencv ‘ ‘ opencv−c o n f i g −− l d s t a t i c f l a g s ‘ h e l y e t t ‘ pkg−c o n f i g −− l i b s opencv ‘
A fenti lépéseket élvégző Bash szkript a melléklet része (opencv_telepites.sh). A függvényeket célszerű a dokumentáció mellett példaprogramok írásával megismerni. A továbbiakban bemutatok néhány ilyen kísérleti alkalmazást.
3.2. Kalibrációs minták A kalibráció első lépéseként képeket kell készíteni egy ismert geometriájú mintáról. Az OpenCV a következő 2D-s illetve 3D-s mintákat támogatja (6. ábra): • sakktábla • circles grid • asymmetric circles grid Ezen a téren jelentős kutatások folynak: több cikk is megjelent az utóbbi években új minták alkalmazásáról: • egyenesek (1-dimenziós minták) (Sun, Q. Liu, et al. 2011) 7
3.2 Kalibrációs minták
3 OPENCV
6. ábra. Az OpenCV-ben használatos kalibrációs minták • gömbök (Sun, Chen, et al. 2015) • gömbök vonallézerrel megvilágítva (Z. Liu et al. 2015) • nem négyzetes, ismeretlen méretű rácsok (Bingwei et al. 2013) Ígéretesek a mesterséges környezetben gyakran fellelhető egyenes élek alapján való kalibrációs módszerek is (Galego et al. 2015). Ezek azért előnyösek, mert bizonyos méreten felül (például ha több emeletes ház fér el a képen) a fókusz beállítása után nem tudnánk elég nagy mintát létrehozni. A minta és a róla készült felvétel minősége jelentősen befolyásolja a kalibráció pontosságát. Ezt tárgyalják a következő szakaszok. 3.2.1. A minta körüli keret Sakktábla minta esetén a minta körül legalább egy négyzetnyi, de minél nagyobb fehér keretet kell hagynunk, hogy a findChessboardCorners() függvény jó eséllyel sikeresen lefusson. Erre a függvény dokumentációja hívja fel a figyelmet. A 7. ábrán látható képek egy jó és egy rossz példát mutatnak. 3.2.2. A minta felülete Kívánatos, hogy a minta felülete ne legyen fényes. Még ha a papír matt is, az egybefüggő, fekete nyomtatott felületek fényesek, így megcsillanhat rajtuk a lámpák fénye (8. ábra). 8
3 OPENCV
3.2 Kalibrációs minták
7. ábra. Vastag (helyes) és vékony (helytelen) fehér keret
8. ábra. A fényes felületen téves eredményt adhat a mintakereső Tintasugaras nyomtatóval ilyen szempontból sokkal jobb eredményt érhetünk el, mint lézernyomtatóval.
3.2.3. A minta síklapúsága A kalibráció során feltételezzük, hogy a minta síkbeli alakzat. A síktól való eltérés pontatlan kalibrációt eredményez. Ha a mintát hordozó papírnak csak a széleit ragasztjuk vagy erősítjük sík lapra, a papír a lecsapódó pára hatására idővel vetemedhet, így hullámossá válhat. Megfelelő választás például egy üveglapra vagy plexilapra kasírozott minta. A kasírozással a nyomat buborékmentes felragasztását érhetjük el. Nyomtathatjuk a mintát öntapadó fóliára is: ekkor a légbuborékokat például egy bankkártya segítségével távolíthatjuk el.
3.2.4. A megvilágítás A megvilágítást és az expozíciót úgy kell beállítani, hogy a tábla fehér részei ne égjenek ki. Ha a pixelek kiégnek (telítésbe mennek), akkor detektortól függően a környező pixelekre is hatnak, így nagyobb terület látszik fehérnek, mint amekkorának kellene (9. ábra). A 9
3.3 Kalibrációs példaprogram
3 OPENCV
=⇒ 9. ábra. A telítésbe ment pixelek hatása fekete négyzetek sarkai nem érnek össze, így a findChessboardCorners() függvény csak pontatlan becslést tud adni, hogy hol van a sarok. A pixelek kiégésének elkerülésére használhatunk olyan programot, ami például feketére színezi a túl fényes pixeleket. Ilyen programot az OpenCV threshold() függvénye segítségével írhatunk. A kész programkód megtalálható a melléklet 6.1. alfejezetében.
3.3. Kalibrációs példaprogram Több példaprogram is elérhető, melyeknek csak néhány paramétert kell megadnunk, hogy kalibrálhassunk velük. Az egyik ilyen programnak konfigurációs fájlban kell megadni a paramétereket (Camera calibration With OpenCV n.d.). Egy másik program parancssori argumentumokban várja a beállításokat (calibration.cpp n.d.). Ez utóbbi programot használtam a vizsgálataim során. Beállítható például a minta típusa, a bemenet (képek listája, videofájl vagy a használandó kamera sorszáma) és a kalibrációs adatokat tároló kimeneti fájl neve. A képek listáját egy imagelist_creator nevű programmal generálhatjuk, így pl. bmp képek esetén Linuxon a következő parancsok valósítják meg a lista generálását és a kalibrációt: . / i m a g e l i s t _ c r e a t o r l i s t . xml . / ∗ . bmp ; . / c a l i b r a t i o n _ s a m p l e −w 6 −h 9 −s 0 . 0 3 −o output . yaml −su −op −oe l i s t . xml
A folyamat meggyorsítása, valamint a konzekvens fájlelnevezések érdekében írtam egy bash szkriptet Calib.sh néven: #! / b i n / b a s h # Usage : . / C a l i b . sh w h e x t e n s i o n folder_name width=$1 ;
10
3 OPENCV
3.4 A kalibráció eredményét igazoló kísérletek
h e i g h t=$2 ; e x t=$3 ; f o l d e r=$4 ; l i s t =./ $ f o l d e r / $ f o l d e r \ _ l i s t . xml ; out =./ $ f o l d e r . yaml ; . / imagelist_creator $ l i s t . / $ f o l d e r /∗. $ext ; . / c a l i b r a t i o n _ s a m p l e −w $width −h $ h e i g h t −s 0 . 0 3 −o $out −su −wu −op −oe $ l i s t ; return 0 ;
Külön kiemelendő a calibration_sample argumentumai közül két paraméter: • -s 0.03: a sakktábla 3x3 cm-es négyzetekből áll. • -wu: "write undistorted", azaz kiírja a korrigált képeket a bemeneti képek mappájába. Ezzel az opcióval magam bővítettem a letölthető mintaprogramot. A -wu opciónak csak akkor van hatása, ha az -su (show undistorted) opciót is használjuk.
3.4. A kalibráció eredményét igazoló kísérletek A kalibráció során meghatározhatók a belső és a külső kameraparaméterek. Ahhoz, hogy ezeknek a paramétereknek a jelentését értelmezhessük, olyan kísérleteket kell elvégezni, melyek során egy-egy paraméter valamilyen megváltozását várjuk. A fényképek különféle módosításainak a kalibrációs adatokra kifejtett hatását megfigyelve igazolhatjuk és pontosíthatjuk a kameramodellről alkotott képünket, például tisztázhatjuk a koordinátarendszerek állását. A kísérletek eredményeként olyan szemléltető ábrák rajzolhatók, melyek az OpenCV dokumentációjában nem fellelhető információt hordoznak. 3.4.1. Képkivágó program készítése Az cx , cy paraméterek kitapasztalásához első lépés volt megírni egy olyan programot, amely tetszőleges számú képből kivágja ugyanazt a téglalap alakú területet. A programkód megtalálható a mellékletek között (6.2. alfejezet). Amint azt a programkód is feltünteti, a parancssori argumentumokat az alábbi minta szerint kell megadni:
11
3.4 A kalibráció eredményét igazoló kísérletek
3 OPENCV
top left
h w
10. ábra. Képek levágása
crop_image l e f t top w h f i l e 1 f i l e 2
[...]
3.4.2. Kalibrálás eltolt kivágatok alapján
11. ábra. Egymáshoz képest eltolt kivágatok
A cx és cy paraméterek jelentésének megismerésére a következő kísérletet végeztem. Az egyik Basler kamerával készült, 1280x960 pixeles fényképekből 20-20 pixellel kisebb kivágatokat készítettem. Először a bal felső sarokból (0,0), majd (20,20)-ból indulva. crop_image 0 0 1260 940 cam0_1280x960 / ∗ .bmp crop_image 20 20 1260 940 cam0_1280x960 / ∗ .bmp
Az így készült kivágatokat két külön könyvtárba helyeztem, és lefuttattam rajtuk a kamerakalibrációt. fx és fy változatlanok maradtak. cx és cy változása az 1. táblázatban figyelhető meg. Az eltérés tized pixel pontosan 20 pixel lett a két értékpár között. A táblázat alapján az is megállapítható, hogy az u, v és x00 , y 00 koordináta-rendszerek azonos 12
3 OPENCV
3.4 A kalibráció eredményét igazoló kísérletek
1. táblázat. Eltolt kivágatok hatása (left,top)
(0,0)
(20,20)
cx
658.2
638.2
cy
459.0
439.0
irányúak. cx és cy tehát megadják az optikai középpontot az u, v koordináta-rendszerben:
(cx , cy ) = (cu , cv )
(8)
Ezeket az összefüggéseket a 12. ábra mutatja. u [px] v [px] cx
cy
optikai tengely
C képsík
12. ábra. Az optikai középpont (C) értelmezése
3.4.3. Kalibrálás átméretezett képeken A képek w × h → w1 × h1 átméretezése után a fókusztávolság értéke várhatóan fx1 = fx
w1 , w
fy1 = fy
h1 h
(9)
összefüggés szerint változik meg. A képek átméretezésének hatása a 2. táblázatban látható. A magyarázatot az adja, hogy a fele akkora képen egy pixel kétszer akkorának felel meg. Kétszer akkora pixelből pedig feleannyi elég adott távolság lefedésére. 13
3.5 Többszörös korrekció alkalmazása
3 OPENCV
2. táblázat. Az átméretezés hatása w×h
fx
fy
cx
cy
1280 × 960 2227 2224 658.3 459.1 640 × 480
1116 1114 330.3 226.5
3.5. Többszörös korrekció alkalmazása 3.5.1. A többszörös korrekció jelentése A torzítási paraméterek ismeretében a képek korrigálhatók. A korrekció eredményei olyan képek, amelyek torzítása elvileg közel ideális (azaz zérus). A valóságban a korrigált képek is torzítottak, csak kisebb mértékben. A torzítás becslésének pontosságát az átlagos visszavetítési hiba (Average reprojection error) adja meg, melynek mértékegysége pixel. Ha a kalibrációval kapott kameramátrix és a torzítási együtthatók segítségével korrigált képeken újra elvégezzük a kalibrációt, majd ezeket a lépéseket ismételgetjük, egyre kisebb változást figyelhetünk meg a korrigált képek között. Bizonyos kamerák esetében a többszörös korrekcióra nézve a képek minden egyes pixele konvergens. Ez több kérdést is felvet. Használhatók-e a képek egyetlen korrekció után oly módon, mintha egy ideális lyukkamerával készültek volna? Érdemes-e többszörös korrekciót alkalmazni? 3.5.2. A többszörös korrekció megvalósítása A kérdések megválaszolásához először meg kell figyelni a torzítási paraméterek változását. Ehhez egy olyan program készült, mely a kalibráció-korrekció lépéspárt n-szer hajtja végre a bemeneti képek másolatán. A bemeneti képek tehát nem kerülnek felülírásra. Ez a program a kalibrációs eredményeket növekvő sorszámozással fájlokba írja. A program megtalálható a mellékletek között (iter_undist_from_list.cpp, 6.4. alfejezet) 3.5.3. A többszörös korrekció hatásának elemzése A kalibrációs fájlokból kinyerhetők a kameramodell paraméterei valamint a megtalált pontok. A kalibrációs fájlokat sokféle vizsgálatra fel lehet használni, ezért indokolt volt 14
3 OPENCV
3.5 Többszörös korrekció alkalmazása
13. ábra. A torzítási paraméterek az elvégzett korrekciók függvényében (Basler sca75060gc kamera 6 mm-es objektívvel) - A paraméterek a 10. korrekció körül optimálisak.
létrehozni a CalibFile osztályt, melynek konstruktora beolvassa a kalibrációs fájl tartalmát az objektum publikus változóiba, így azok könnyedén elérhetőek lesznek. Az osztály a kód-újrahasznosíthatóság jegyében a kaliblib függvénykönyvtár részét képezi egyéb hasznos függvényekkel együtt. A függvénykönyvtár fejléc fájlja (kaliblib.hpp) megtalálható a mellékletben (6.3. alfejezet). A következő lépést a diagramrajzolás jelentette. Erre a legalkalmasabbnak a Matlab bizonyult. A kalibrációs fájlokból kiolvasott paramétereket tehát egy Matlab szkriptbe kellett írni, amit a CalibFile osztály felhasználásával megírt iterResults2Matlab.cpp hajt végre.
3.5.4. Értékelés Az eredmény azt mutatja, hogy vannak olyan kamerák, melyek torzítási paraméterei javulnak a többszörös korrekció során (13. ábra), de vannak olyan kamerák is, melyek esetén rosszabb paramétereket kapunk (14. ábra). A jelenség magyarázata további még további kutatást igényel. 15
4 A KALIBRÁCIÓ ÉRTÉKELÉSE
14. ábra. A torzítási paraméterek az elvégzett korrekciók függvényében (HP Probook 6470b laptop kamerája) - A paraméterek a többszörös korrekció során romlanak.
4. A kalibráció értékelése 4.1. Az egyes pixelek torzításának ábrázolása 4.1.1. Torzítás számítása a torzítási modellből A kalibrációs konstansokból a 2.5. alfejezetben leírt modell alapján kiszámítható a torzítás mértéke pixelekben. A számítás módja a következő. A 7. mátrixegyenlet alapján u = fx x00 + cx
=⇒
x00 =
u − cx fx
(10)
v = fy y 00 + cy
=⇒
x00 =
v − cy fy
(11)
A torzítási egyenlet k4 = k5 = k6 = 0 esetén a következőképp egyszerűsödik: x00 = x0 (1 + k1 r2 + k2 r4 + k3 r6 + 2p1 x0 y 0 + p2 (r2 + 2x02 )
(12)
y 00 = y 0 (1 + k1 r2 + k2 r4 + k3 r6 ) + p1 (r2 + 2y 02 ) + 2p2 x0 y 0
(13)
16
5 TOVÁBBLÉPÉSI LEHETŐSÉG
Az x és y irányú torzítás: dx = x00 − x0 ,
du = f x · dx ,
dy = y 00 − y 0
(14)
du = fy · dy
(15)
A torzítás nagysága: dr =
p d2u + d2v
(16)
Az (u, v, dr ) felület ábrázolható például az Octave program meshgrid() és mesh() függvényei segítségével. Ennek eredményét a 15-17. ábrák mutatják. 4.1.2. Torzítás számítása a sarkok elmozdulásából Szemléletes ábrát kaphatunk, ha a kalibrációs képekből, valamint az ezek korrekciójával kapott képekből kinyerhető pontokat páronként összekötjük. A kapott szakaszokat egy a bemeneti képekkel megegyező méretű vászonra rajzolva méretarányos ábrát kapunk a torzításról. A 15-17. ábrák több kamera torzítását is szemléltetik mindkét módszerrel. A halszemoptikák radiális torzítása jelentős, ahogy ez a 15a. ábrán látható. A 15b. ábrán látható a számítás eredményeképpen felrajzolt torzítási függvény. Az x és y tengelyeken a pixel koordináták (u, v) láthatók, a z tengelyen pedig a torzítás nagysága pixelben.
5. Továbblépési lehetőség A kutatás folytatásaként fény derülhet arra, hogy miért lehet a többszörös korrekció egyes kamerák esetében hasznos, más kamerák esetében pedig káros. Az kutatás eredményei felhasználhatók a BME MOGI Tanszéken található testszkenner kalibrációjára. Újabb program készítésével meghatározható a kalibrációs tábla síkjában a torzítás mértéke milliméterben. A testszkennerről bővebben az 5.1. alfejezet szól. 17
5.1 Egy 3D letapogató kalibrációja
5 TOVÁBBLÉPÉSI LEHETŐSÉG
(a) A képpontok torzítását jelképező nyilak
(b) A torzítási függvény pixelekben
15. ábra. Egy Basler sca750-60gc típusú kamera torzítása halszemobjektívvel
(a) A képpontok torzítását jelképező nyilak
(b) A torzítási függvény pixelekben
16. ábra. Egy HP Probook 6470p laptop webkamerájának torzítása
5.1. Egy 3D letapogató kalibrációja 5.1.1. A letapogató felépítése A BME MOGI Tanszéken található testszkenner (közkeletű nevén lányszkenner) mérőkeretén négy kamera és öt vonallézer található. A keret függőleges mozgása közben a tárgy különböző síkjairól készül kép. A tárgyat csak a síklézerek világítják meg. A lézerek a vízszintes síkban vannak, azonos magasságban. A kamerák a lézerek síkjánál magasabban, a keret négy sarkában helyezkednek el. Egy képpontnak végtelen sok tárgypont felelhet meg, a tárgysíkba azonban ezek közül csak egy eshet, így meghatározható a leképezett térbeli pont. 18
6 MELLÉKLETEK
(a) A képpontok torzítását jelképező nyilak
(b) A torzítási függvény pixelekben
17. ábra. Egy Labtec webkamera torzítása 5.1.2. A mérés pontatlansága A 18. ábrán a négy kamera képe négy színnel van jelölve. A kamerák képe úgy lett áttranszformálva, hogy felülnézeti metszetet mutassanak. Jelentős, akár centiméteres különbségek is vannak egy-egy kamera képe között. Ez egyrészt a lézerek pontatlanságából ered, másrészt a kamerák torzításából. A vonallézerek pontatlansága a középtengelytől távol 2 − 3 mm, azaz a két lézercsík távolsága ekkora is lehet. A tárgysík tehát nem pontosan sík, illetve nem egyértelmű, hogy melyik lézert kell alapul venni. A kamerák torzításának mértékét pixelekben vagy milliméterben meghatározva meg lehetne mondani, hogy a felvételek egyes részein a kép széteséséért a kamerák vagy a lézerdiódák pontatlansága felel inkább. Ha a kamerák torzítása nagy, a képeket a feldolgozás előtt korrigáló algoritmust szükséges írni a mérőszoftverbe.
6. Mellékletek 6.1. captureImages.cpp #include " opencv2 / opencv . hpp"
19
6.1 captureImages.cpp
6 MELLÉKLETEK
18. ábra. Síkmetszet az ujjak magasságában
#include " opencv2 / c a l i b 3 d / c a l i b 3 d . hpp" #include " opencv2 / imgproc / imgproc . hpp" #include " opencv2 / h i g h g u i / h i g h g u i . hpp" #include " s t r i n g "
using namespace cv ; using namespace s t d ;
char∗ window_name = " T h r e s h o l d ␣Demo" ;
int main ( int , char ∗ ∗ ) { int s e l e c t C a m e r a = 0 ;
// 0 i s d e f a u l t , 1 i s t h e n e x t a v a i l a b l e . . .
VideoCapture cap ( s e l e c t C a m e r a ) ; // open t h e camera i f ( ! cap . isOpened ( ) )
// c h e c k i f we s u c c e e d e d
return −1;
cap . s e t (CV_CAP_PROP_FRAME_WIDTH, 1 2 8 0 ) ; // s e t t i n g t h e d i m e n s i o n s cap . s e t (CV_CAP_PROP_FRAME_HEIGHT, 7 2 0 ) ; //
Mat frame , gray , gray2 , t h r e s h o l d e d ; // m a t r i c e s f o r image p r o c e s s i n g namedWindow ( "Camera␣ view " , 1 ) ; s t r i n g i m g P r e f i x = " /home/ a t a / Dropbox /BME/ patterns_wide_border /new/img" ; int n = 0 ;
20
6 MELLÉKLETEK
6.1 captureImages.cpp
bool drawPattern = f a l s e ; bool f l i p I m a g e = true ; c o u t << " P r e s s ␣ ’ s ’ ␣ t o ␣ save , ␣ ’ p ’ ␣ t o ␣ s w i t c h ␣ drawPattern , ␣ ’ q ’ ␣ t o ␣ q u i t ! \ n" ; v e c t o r
p o i n t b u f ; for ( ; ; ) { cap >> frame ; // g e t a new frame from camera c v t C o l o r ( frame , gray , CV_BGR2GRAY) ;
// c o n v e r t t o g r a y s c a l e
i f ( flipImage ) f l i p ( gray , gray2 , 1 ) ; i f ( drawPattern ) { Size boardSize ( 8 , 6 ) ; bool found = f i n d C h e s s b o a r d C o r n e r s ( gray2 , b o a r d S i z e , p o i n t b u f , CV_CALIB_CB_ADAPTIVE_THRESH + CV_CALIB_CB_FAST_CHECK + CV_CALIB_CB_NORMALIZE_IMAGE) ; drawChessboardCorners ( gray2 , b o a r d S i z e , Mat ( p o i n t b u f ) , found ) ; } t h r e s h o l d ( gray2 , t h r e s h o l d e d , 2 5 0 , 0 ,THRESH_TOZERO_INV ) ; imshow ( " f l i p p e d " , t h r e s h o l d e d ) ; int c = waitKey ( 3 0 ) ; i f ( c == ’ s ’ ) { s t r i n g imgName = i m g P r e f i x + s t d : : t o _ s t r i n g ( n ) + " . t i f " ; s t r i n g patternName = i m g P r e f i x + s t d : : t o _ s t r i n g ( n ) + "p . t i f " ; i m w r i t e ( imgName , gray ) ; i m w r i t e ( patternName , gray2 ) ; n++; c o u t << imgName << e n d l ; } e l s e i f ( c == ’ p ’ ) drawPattern = ! drawPattern ; e l s e i f ( c == ’ f ’ ) f l i p I m a g e = ! f l i p I m a g e ; e l s e i f ( c == ’ q ’ ) break ; }
21
6.2 crop_image.cpp
6 MELLÉKLETEK
return 0 ; }
6.2. crop_image.cpp #include #include
using namespace cv ;
int main ( int argc , char ∗∗ argv ) { p r i n t f ( "%s ␣ \n" , argv [ 0 ] ) ; i f ( argc < 6 ) { p r i n t f ( " ␣ Usage : ␣%s ␣ l e f t ␣ top ␣w␣h␣ f i l e 1 ␣ f i l e 2 ␣ [ . . . ] ␣ \n" , argv [ 0 ] ) ; return −1; } int l e f t
= a t o i ( argv [ 1 ] ) ;
int top
= a t o i ( argv [ 2 ] ) ;
int w
= a t o i ( argv [ 3 ] ) ;
int h
= a t o i ( argv [ 4 ] ) ;
f o r ( int i =5; i s t r i n g s t d : : s i z e _ t l a s t D o t = imName . r f i n d ( ’ . ’ ) ;
// p o s i t i o n o f l a s t d o t
s t d : : c o u t << l a s t D o t << " . . . . " ; s t d : : s t r i n g sName = imName . s u b s t r ( 0 , l a s t D o t ) + "_l" + argv [ 1 ] + " t " + argv [ 2 ] + "w" + argv [ 3 ] + "h" + argv [ 4 ] + imName . s u b s t r ( l a s t D o t , s t r i n g : : npos ) ; p r i n t f ( " s a v e ␣name : ␣%s ␣ \n" , sName . c _ s t r ( ) ) ; char∗ saveName = const_cast(sName . c _ s t r ( ) ) ;
22
6 MELLÉKLETEK
6.3 A kaliblib függvénykönyvtár
Mat image ; image = imread ( argv [ i ] , 1 ) ;
i f ( ! image . data ) { p r i n t f ( " ␣No␣ image ␣ data ␣ \n" ) ; return −1; }
Mat cropped_image ( image , Rect ( l e f t , top , w, h ) ) ; i m w r i t e ( saveName , cropped_image ) ; }
return 0 ; }
Itt megemlítendő az OpenCV Mat adattípusa. Ez egy objektum, melyben a képeket mint mátrixokat tároljuk. A képek betöltésére az imread(), a képek mentésére az imwrite() függvényt kell használni.
6.3. A kaliblib függvénykönyvtár A függvénykönyvtár az #include <path / t o / f i l e / k a l i b l i b . hpp>
sorral használható. 6.3.1. kaliblib.hpp #i f n d e f KALIBLIB_HPP_INCLUDED #define KALIBLIB_HPP_INCLUDED
#include <s t r i n g > #include #include #include " opencv2 / imgproc / imgproc . hpp"
23
6.3 A kaliblib függvénykönyvtár
6 MELLÉKLETEK
#include " opencv2 / c a l i b 3 d / c a l i b 3 d . hpp" #include " opencv2 / h i g h g u i / h i g h g u i . hpp" #include #include <s t d i o . h> #include < s t d l i b . h> // system ( ) #include <s t r i n g . h> #include <s t r i n g >
// t o _ s t r i n g ( )
#include #include
// t o _ s t r i n g ( ) // o f s t r e a m
#include
// r e p l a c e ( )
using namespace s t d ; using namespace cv ;
s t a t i c bool r e a d S t r i n g L i s t ( const s t r i n g& f i l e n a m e , v e c t o r <s t r i n g >& l ) ; // r e a d S t r i n g L i s t r e t u r n s t r u e i f s u c c e s s f u l void r e a d A r g L i s t ( v e c t o r <s t r i n g >& a r g L i s t , int argc , char ∗ argv [ ] , int f i r s t I n d e x ) ; // r e a d A r g L i s t c o p i e s e l e m e n t s o f ∗ a r g v [ ] t o a r g L i s t
class CalibFile { public : int imageWidth , imageHeight , nframes ; int boardWidth , boardHeight ; Size boardSize ; Mat_<double> cameraMatrix , d i s t C o e f f s ; double avgReprErr ; Mat_ perViewReprErr ; Mat_<double> e x t r i n s i c P a r a m s ; Mat_ i m a g e P o i n t s ; double fx , fy , cx , cy , k1 , k2 , k3 , p1 , p2 ; C a l i b F i l e ( s t r i n g fileName ) ; };
Mat_ getCoordX (Mat_ & M) ;
24
6 MELLÉKLETEK
6.3 A kaliblib függvénykönyvtár
Mat_ getCoordY (Mat_ & M) ;
// i t e r _ u n d i s t _ f r o m _ l i s t f u g g v e n y e i
enum { DETECTION = 0 , CAPTURING = 1 , CALIBRATED = 2 } ; enum P a t t e r n { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID } ;
s t a t i c double c o m p u t e R e p r o j e c t i o n E r r o r s ( const v e c t o r >& o b j e c t P o i n t s , const v e c t o r >& imagePoints , const v e c t o r <Mat>& r v e c s , const v e c t o r <Mat>& t v e c s , const Mat& cameraMatrix , const Mat& d i s t C o e f f s , v e c t o r & p e r V i e w E r r o r s ) ; s t a t i c void c a l c C h e s s b o a r d C o r n e r s ( S i z e b o a r d S i z e , f l o a t s q u a r e S i z e , v e c t o r & c o r n e r s , P a t t e r n patternType = CHESSBOARD) ; s t a t i c bool r u n C a l i b r a t i o n ( v e c t o r > imagePoints , S i z e imageSize , S i z e boardSize , P a t t e r n patternType , float squareSize , float aspectRatio , int f l a g s , Mat& cameraMatrix , Mat& d i s t C o e f f s , v e c t o r <Mat>& r v e c s , v e c t o r <Mat>& t v e c s , v e c t o r & r e p r o j E r r s , double& t o t a l A v g E r r ) ; s t a t i c void saveCameraParams ( const s t r i n g& f i l e n a m e , S i z e imageSize , S i z e boardSize , f l o a t s q u a r e S i z e , f l o a t a s p e c t R a t i o , int f l a g s , const Mat& cameraMatrix , const Mat& d i s t C o e f f s , const v e c t o r <Mat>& r v e c s , const v e c t o r <Mat>& t v e c s , const v e c t o r & r e p r o j E r r s , const v e c t o r >& imagePoints , double t o t a l A v g E r r ) ; s t a t i c bool r e a d S t r i n g L i s t ( const s t r i n g& f i l e n a m e , v e c t o r <s t r i n g >& l ) ; s t a t i c bool runAndSave ( const s t r i n g& outputFilename ,
25
6.3 A kaliblib függvénykönyvtár
6 MELLÉKLETEK
const v e c t o r >& imagePoints , S i z e imageSize , S i z e boardSize , P a t t e r n patternType , f l o a t s q u a r e S i z e , f l o a t a s p e c t R a t i o , int f l a g s , Mat& cameraMatrix , Mat& d i s t C o e f f s , bool w r i t e E x t r i n s i c s , bool w r i t e P o i n t s ) ; // E x t r a x t i n f o r m a t i o n from c a l i b r a t i o n f i l e s numbered from z e r o t o n r F i l e s void c a l i b F i l e s 2 T a b l e (
const s t r i n g& cFDir ,
const s t r i n g& c F P r e f i x , const int& n r F i l e s , const s t r i n g& c F S u f f i x , const s t r i n g& t a b l e F i l e N a m e ) ; class Calib { public : bool t a b l e O n l y = f a l s e ; s t r i n g s r c D i r , imDir , imExt ; int n r O f U n d i s t o r t i o n s ; S i z e b o a r d S i z e = S i z e ( 8 , 6 ) ; // rows , c o l s P a t t e r n p a t t e r n = CHESSBOARD; //CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID, CHESSBOARD float
squareSize = 0.03 , aspectRatio = 1. f ;
// f i x a s p e c t r a t i o ( f x / f y )
int f l a g s = 0 ; bool
w r i t e E x t r i n s i c s = true , w r i t e P o i n t s = true , u n d i s t o r t I m a g e = true , showUndistorted = false , w r i t e U n d i s t o r t e d = true ;
int nframes = 1 0 ; v e c t o r <s t r i n g > i m a g e L i s t ; enum PatternFound {PF_SUCCESS, PF_FAILED, PF_UNKNOWN_PATTERN_TYPE} ; enum I t e r C a l i b S t a t u s {ICS_SUCCESS , ICS_FAILED } ; bool goodArguments = true ;
void p r i n t H e l p ( int argc , char ∗∗ argv ) ;
26
6 MELLÉKLETEK
6.4 iter_undist_from_list.cpp
C a l i b ( int argc , char ∗∗ argv ) ; void c r e a t e D i r e c t o r y ( s t r i n g& dirName ) ;
// c r e a t e a d i r e c t o r y u s i n g mkdir
int copyImages ( ) ; bool c r e a t e I m a g e L i s t ( ) ; // t r u e i f s u c c e s s f u l PatternFound f i n d P a t t e r n P o i n t s ( Mat& view ,
// r e t u r n s s u c c e s s code
v e c t o r & p o i n t b u f , P a t t e r n& p a t t e r n ) ; bool c a l i b F o r m I m a g e L i s t ( Mat& cameraMatrix ,
// r e t u r n s t r u e i f s u c c e s s f u l
Mat& d i s t C o e f f s , S i z e& i m a g e S i z e , v e c t o r >& imagePoints , s t r i n g& outputFilename , v e c t o r <Mat>& images ) ; void u n d i s t o r t I m a g e s ( Mat& cameraMatrix , Mat& d i s t C o e f f s , S i z e i m a g e S i z e , v e c t o r <Mat>& images ) ; IterCalibStatus calibAndCorrectIteration ( ) ;
// r e t u r n t r u e i f s u c c e s s
}; #endif // KALIBLIB_HPP_INCLUDED
6.4. iter_undist_from_list.cpp A program egy mappában található, adott kiterjesztésű képek alapján kalibrál. A képeket bemásolja egy mappába (imDir), és ott felülírja őket minden kalibráció végén a korrigált képekkel. Parancssori paraméterek (példa): iter_number / s o u r c e / d i r e c t o r y / image_extension / t a r g e t / d i r e c t o r y /
A /target/directory/ paraméter opcionális. #include
int main ( int argc , char ∗∗ argv ) { C a l i b c a l i b ( argc , argv ) ; bool c r e a t e d = c a l i b . c r e a t e I m a g e L i s t ( ) ; i f ( ! created ) return −1; Calib : : IterCalibStatus i t e r S u c c e s s = c a l i b . calibAndCorrectIteration ( ) ;
27
6.4 iter_undist_from_list.cpp
6 MELLÉKLETEK
i f ( i t e r S u c c e s s == C a l i b : : I t e r C a l i b S t a t u s : : ICS_FAILED) c o u t << " I t e r a t i v e ␣ c a l i b r a t i o n ␣ f a i l e d . " ; else c o u t << " I t e r a t i v e ␣ c a l i b r a t i o n ␣ s u c c e s s f u l . " ; c o u t << e n d l << " E x i t i n g " << e n d l ; return 0 ; }
28
FELHASZNÁLT FORRÁSOK
FELHASZNÁLT FORRÁSOK
Felhasznált források Bingwei, Hui et al. (2013). “Accurate geometric camera calibration technique using multiviews of a non-metric planar grid”. In: Optics and Lasers in Engineering 51.4, pp. 432– 439. issn: 0143-8166. doi: 10.1016/j.optlaseng.2012.11.008. url: http://www. sciencedirect.com/science/article/pii/S0143816612003144. calibration.cpp. https : / / github . com / kipr / opencv / blob / master / samples / cpp / calibration.cpp. Camera Calibration and 3D Reconstruction. http : / / docs . opencv . org / modules / calib3d/doc/camera_calibration_and_3d_reconstruction.html[letöltve: 2015.05.17.] Camera calibration With OpenCV. http://docs.opencv.org/doc/tutorials/calib3d/ camera_calibration/camera_calibration.html [letöltve: 2015.10.25.] Galego, Ricardo et al. (2015). “Uncertainty analysis of the DLT-Lines calibration algorithm for cameras with radial distortion”. In: Computer Vision and Image Understanding 140, pp. 115–126. issn: 1077-3142. doi: http://dx.doi.org/10.1016/j. cviu.2015.05.015. url: http://www.sciencedirect.com/science/article/pii/ S1077314215001290. Liu, Zhen et al. (2015). “Calibration method for line-structured light vision sensor based on a single ball target”. In: Optics and Lasers in Engineering 69, pp. 20–28. issn: 01438166. doi: 10.1016/j.optlaseng.2015.01.008. url: http://www.sciencedirect. com/science/article/pii/S0143816615000093. Sun, Junhua, Xu Chen, et al. (2015). “Accurate camera calibration with distortion models using sphere images”. In: Optics & Laser Technology 65, pp. 83–87. issn: 0030-3992. doi: 10.1016/j.optlastec.2014.07.009. url: http://www.sciencedirect.com/ science/article/pii/S0030399214001790. Sun, Junhua, Qianzhe Liu, et al. (2011). “A calibration method for stereo vision sensor with large {FOV} based on 1D targets”. In: Optics and Lasers in Engineering 49.11, pp. 1245–1250. issn: 0143-8166. doi: 10.1016/j.optlaseng.2011.06.011. url: http://www.sciencedirect.com/science/article/pii/S0143816611001898.
29
FELHASZNÁLT FORRÁSOK
FELHASZNÁLT FORRÁSOK
Zhang, Zhiyi and Lin Yuan (2012). “Building a 3D scanner system based on monocular vision”. In: Applied Optics 51, pp. 1638–1644.
30