2022. október 1., szombat

Gyorskeresés

[SVS_11] Szeptember 6-19.

Írta: | Kulcsszavak: SRV . surveyor . SVS

[ ÚJ BEJEGYZÉS ]

Magyarázat:
Kalibrálás: mikor az opencv meghatározza, hogyan kell javítania a képet
Remap: a kalibrációs adatok alapján rektilineárissá (lásd előző poszt) teszi.

Kitérő

Az OpenCV-s példák között találtam:


screenshot

Jó sokáig futott, több percig. Nagyon érdekes, a keresett dobozos képen felvesz valami szisztéma alapján pontokat, majd a székes képen is ugyanúgy. Párosítja a pontokat, így egész pontosan meg tudja mondani, hogy a székes képen hol helyezkedik el a doboz.

Szeptember 6., még 94 nap

Ami tegnap nagyon zavart, hogy az ablakkezelőbe kellett raknom a kamera kalibrálást, az megoldódott, át tudtam rakni a képfeldolgozóba. Bár ez a megoldás se tetszik 100%-san, de sokkal jobb, mint az előző.

Szeptember 7., még 93 nap

A mátrixokat el kell menteni, és nem mindegy, hogy milyen néven, különben felülíródik. Win32 alatt is elérhető az "Open File Dialog" és a "Save File Dialog" beépített ablak.

Open File Dialog

Forrás: http://www.java2s.com

Gondoltam ezzel mentetem le és olvasatom be a mátrixok elérési helyét, és nevét, mindezt azért, mert ha SVS robotra lefuttatom, akkor ne írják már felül egymást. Sajnos a kapott elérési utat nem csípte az OpenCV cvSave() függvénye, így kénytelen voltam dobni az ötletet, persze megint elpiszmogtam vele pár órát. Olyan hiba is előjött futás közben, hogy miután kijelöltem hova mentse, elfelejtette a jelenlegi dll-knek a helyét (így például nem tudott képet dekódolni, mert számára elveszett a jpeg.dll). Agyrém
Azt hiszem ki kéne tennem egy táblát a monitor fölé, hogy felesleges marhaságokkal ne húzzam az időt, mert nem nagyközönségnek szánt programról lesz szó, tehát nem kell minden egyes lehetőséget kivédeni.
Annyit módosítottam, hogy főprogramból adom meg a file nevét forrásból, így nincs felülíródás.

Elkezdtem a cvRemap() és a hozzá tartozó függvények áthelyezését a képfeldolgozóba. Itt megint elkezdtem kavarni, ugyanis vannak részek, aminek csak 1x kell lefutnia, és ha futás közben felbontásváltás van, akkor se hasaljon el a program.
Mivel elsőre nagyon túlbonyolítottam, inkább jegeltem egy kicsit.

Szeptember 9., még 91 nap

Újragondoltam a Remap részt a képfeldolgozóban, kerülve a túlbonyolításokat, szem előtt tartva, hogy az SVS-nek is ezt kell használnia úgy, hogy lehessen két threadben meghívni.
Megírtam, kisebb bugok után, amit megint keresgetni kellett, SRV-re rendesen működik, threadestül. Érdekes módon a real-time-t nem sikerült elérni, igaz annyit nem tesztelgettem.
SVS kalibrációjának a folyamatát is megírtam, előbb a balt, aztán a jobbat kalibrálja. Remap is bele lett rakva, rendesen működik.

Jöhet a következő lépés.

Szeptember 16., még 84 nap

Egy darabig eltűntem, de nem azt jelenti, hogy nem csináltam semmit:).
A sztereó kalibrálást példákat tanulmányoztam (hosszabb, és bonyolultabb, mint a kamera kalibráció), hogy mi mit csinál, miért csinálja, mid ad vissza, az miért jó nekem, stb. Kb. most jutottam el oda, hogy nagyjából értem a működését az egésznek, most már elkezdhetem lekódolni a saját programomba.

Szeptember 18., még 82 nap

Szépen átnyálaztam a kódot, feltérképeztem mit hova kell rakni, és az opencv-s példát lefuttatva debuggal lépésenként ellenőriztem, mi történik a változókkal. Rájöttem, hogy a sima kalibrációhoz nagyon hasonló, szinte ugyanaz, csak a két kamera miatt vektorokkal játszik a példa.

Ebben a példában használja először a CvFileStorage-t. Előnye, hogy sok mátrixot lehet egy fileba menteni, a kamera kalibrációnál is áttértem erre.

Szépen legépeltem a kódot, és láss csodát, elsőre működött. A helyességét még nem tudtam tesztelni, az a példakód másik felében van.


screenshot

Ugyanúgy sakktáblát kell mutogatni, és ez alapján kiszámolja kamerák belső vetítési mátrixát (M1, M2), kamerák belső torzulás vektorát (D1, D2), relatív eltolást (T) és forgatást a két kamera között (R), és még két mátrixot.
Aki többet akar olvasgatni róla: Camera Calibration and 3D Reconstruction

Szeptember 19., még 81 nap

Csináltam új sakktáblát, 9x6-os, nagyobb négyzetekkel. Rájöttem, hogy maximális minőségnél érdemes kalibrálni, mert kevésbé "ugrál el" a talált pont.

Tehát sztereó kalibráció megtörtént, meg is kéne valahogy jeleníteni az eredményt. Több függvény van rá, azt próbáltam ki, ami a példában szerepelt (cvFindStereoCorrespondenceBM(), előtte persze rektifikálni kell). Érdekes módon ez is elsőre működött miután legépeltem, ezen a hétvégén nagyon szerencsés vagyok ilyen szempontból.

Nem biztos, hogy ez az eljárás marad, mert látható az FPS számlálóból, hogy nagyon lassú. Most egy threadben vannak, lehet kicsit gyorsítható még, de túl nagyra nem számítok.
A lényege: van egy bal és jobb oldali kép. Bal képen van egy pont, ezt meg akarjuk keresni a jobb oldali képen, számítógép szemszögéből ez nem is olyan egyszerű.
A BM eljárás lényege, hogy ami a bal képen szerepel pont, az a jobb képen is ugyanabban a sorban legyen. Így egy pont megtalálása a másik képen egy dimenziós kereséssé egyszerűsödik: 320 pont közül kell megtalálni a párt, míg alapesetben 76800 (320*240) pont közül, ami egyértelmű, hogy lassabb.

A könyv jobb alsó részén látszik, hogy nem 100%-os az eredmény, de közel van hozzá. Lehet, hogy kalibrációnál történt a pontatlanság. Eredeti képen sokkal nagyobb a hiba.

screenshot

Disparityre még nem jöttem rá, hogy micsoda :P.

Copyright © 2000-2022 PROHARDVER Informatikai Kft.