2024. április 19., péntek

Gyorskeresés

[SVS_10] Szeptember 3-5.

Írta: | Kulcsszavak: SRV . surveyor . SVS

[ ÚJ BEJEGYZÉS ]

Szeptember 3., még 97 nap

Az OpenCV jelenleg két "részből" áll. Az OpenCV 2.0, ami C, és az OpenCV 2.1, ami C++.
A programom C hívásokat tartalmaz, mert a legtöbb neten található forrás, tutorial és példa erre épül. Azonban ezen a napon kicsit utána jártam, hogy Sobel miként néz ki 2.1 hívásokkal.
Nagy nehezen sikerült is, de a szál visszatérésnél az IplImage képadatra mutató pointere egyszerűen "elromlik" (<Bad Ptr>), hiába próbáltam meg egy csomó IplImage felépítő megoldást. Ha a 2.1 legfőbb struktúráját használom (cv::Mat), akkor minden oké.
Most választhattam, hogy teljesen áttérek 2.1-re, vagy maradok, de inkább maradok, mert mint írtam fentebb, minden segédeszközöm 2.0-t használ, és nem biztos, hogy minden 2.0-s függvényt portoltak 2.1-re. Amit meg portoltak, lehet, hogy másképp. Például Sobel, 2.0-ban meg kell adni a forrást, a célt, és hogy x vagy y irányba deriválsz. 2.1-ben már azt is, hogy a cél mátrix milyen típus (pár napja itt rontottam el).

Miután kifogytam az időhúzási (;]) ötletekből, összeszedtem mindent, ami a kamera kalibrációval foglalkozik, és elkezdtem "megfejteni".

Szeptember 5., még 95 nap

Munkakedvvel keltem, de...
A csodálatos internet szolgáltatóm (fibernet, már csak 4 hónapig) egész délelőtt nem szolgáltatott semmit, de szerencsére pénteken mindent leszedtem, ami szükséges a kalibrációhoz.

A cél az, hogy nagyjából rektilineáris képet kapjunk, ahol a valóságban lévő egyenes a képen is egyenes.

A valóság sajnos az, hogy minden kép szenved valamilyen radiális torzítástól (hordó / párna torzítás), és/vagy tangenciális torzítástól (röviden: a kép középpontja nem esik egybe a kamera középpontjával), amit ki kell küszöbölni, hogy rektilineáris képet kapjunk.

Szerencsére OpenCV-sek gondoltak erre is. Sajnos a példájukat sikerült (mint ahogy kb. az összeset) túlbonyolítaniuk, de a net megint megmentett.

Sajnos az eddigi programstruktúrát egyelőre el kellett "rontanom", mert ha a képfeldolgozó dll-ben akartam képet lehívni, abból hatalmas baj lett. Majd később kitalálok rá valamit.

Először is, kellett egy sakktábla:

Ezt kell a kamerának mutogatni úgy, hogy minden négyzet látszódjon, de a táblát érdemes forgatni, dönteni, hogy minél pontosabb számítás készülhessen. Az eljáráshoz meg kell adni pontosan, hogy hány sarkot keressen, különben hibásnak veszi, akár többet, akár kevesebbet talál.

10x6 sarkot kell találnia, nem találta meg mindent, ezért nem fogadta el

screenshot

Itt már megtalálta mind a 10x6 sarkot, elfogadta

screenshot

15 helyes kép után (én mondom meg, mennyi kép után), lementett két mátrixot (kamera kalibrációs mátrixai), amivel rektilineárissá tudja változtatni képeket.

Külön öröm volt a számomra, hogy 320x240 legrosszabb minőségen is szépen megtalálta a sarkokat. A fekete könyvet, amire ráragasztottam a sakktáblát, majd ki kell cserélnem fehérre, mert volt eset, hogy a könyvet is meglátta saroknak :). A másik dolog, amit még ellenőrizni akarok, hogy legjobb minőségen készített mátrixot érdemesebb-e használni.

Jobbra az eredeti, balra az "újrarendezett" kép. A vonalzón és a naptáron szépen látszik, hogy az egyenes végre egyenes. Észrevehető, hogy a látható képből kicsit levágott. Kicsit lassít, de majd ezt is lehet gyorsítani.

screenshot

Mindegyik kamerára szépen egyenként el kell végeznem a kalibrációt, és a mátrixokat lementeni.
Következő megoldandó feladat a sztereó kalibráció, ahol a két kamera egymáshoz viszonyított helyzete lesz kiszámolva szintén a sakktábla módszerrel.

Copyright © 2000-2024 PROHARDVER Informatikai Kft.