Ez a bejegyzés több nap eseményeit meséli el, csak már nem emlékszem, mit mikor csináltam.
Ha még emlékeztek rá, a múltkori bejegyzésben azon agyaltam, hogy a tényleges és számított távolságok miért nincsenek még köszönőviszonyban sem.
Három ötletem volt a hibára:
1. kalibráció
2. a disparity map -> 3D megvalósításnál valami nem stimmel az OpenCV-ben
3. Vetítési hiba
Berakom megint a számolt és tényleges távolságokat:
Elkezdtem a próbálgatást, először a vetítési hiba jelenséget akart leellenőrizni magasabb felbontással. Eredetileg 320x240-es képeket használtam, most kipróbáltam 640x480-on. A sebesség se volt borzasztó lassú.
Ehhez az elmozdulásokat számoló BM függvényt is újra be kellett állítani.
Hirdetés
Eredmény:
Ha megfigyelitek, akkor látható, hogy szinte teljesen ugyanaz a 320x240-en mértekkel, így vetítési hiba kizárva.
Próbálgattam a kalibrációt, mert rendes fizikai pontok 3D-s adatait kell megadni kalibrálás előtt (gondoltam én, de az egy másik függvény és másra való). Itt is elszenvedtem 1-2 napot, de nem sikerült használható új kalibrációt csinálnom.
Konzulensem javaslatára elkezdtem kézzel leellenőrizni az OpenCV által számolt mátrixokat.
Most nem megyek bele mi micsoda .
Először is kellett egy kép, ahol kézzel megmért fizikai pont távolságával számolgatok. Ez a pont 1 méter távol (Z), vízszintesen 30 cm-rel jobbra (X), függőlegesen 16 cm-rel (Y) lefele volt a bal kamera középpontjától.
Azt számolom, hogy a kalibráció során kapott mátrixokból és a tényleges 3D-s koordinátákból megkapom, hogy a képen ez melyik pixel.
Rektifikáció előtti ellenőrzés:
Zöld: a kapott értéknek ott kell lennie
Piros: a számolt hely
X-ben 14 pixel, Y-ban pedig 3 pixel a hiba.
Őszintén megmondom nem tudom, hogy ez nagynak, vagy kicsinek számít, de szerintem lényegében stimmel.
Rektifikáció utáni ellenőrzés:
Zöld: a kapott értéknek ott kell lennie, kicsit félrenyomtam
Piros: a számolt hely
X-ben 7 pixel, Y-ban pedig 10 pixel a hiba.
Lényegében maradt az előzőhöz képest.
Jöjjön a kézzel számolt elmozdulás:
229-(509-320)=40
Ez után a Q mátrixot ellenőrzöm, aminek a segítségével elmozdulásokból 3D koordinátákat kapok. A kézzel kapott érték ugyanannyi, mint az OpenCV számolt, tehát nem a függvény a rossz, hanem a Q mátrixszal nem stimmel valami.
A pont 1 méterre van, 13-as elmozdulásnál adja vissza az 1 métert.
Ezek után a cvStereoRectify függvénnyel kezdtem el foglalkozni. Mivel kicsi a kép, a felesleges képrészeket figyelmen kívül kéne hagyni.
Beállítottam az eddig nem használt CV_CALIB_ZERO_DISPARITY-t, alpha=0-t, és a roi1,roi2-t. Az itt kapott roikat beadtam a BM-nek is persze.
Ha csak a CV_CALIB_ZERO_DISPARITY-t állítom be, akkor is kicsit javul a helyzet.
Ilyen volt a régi beállításokkal:
És ilyen az újjal:
Levág területeket, de azok úgy se voltak fontosak és ott úgy is deformált volt kép, tehát használhatatlan.
És láss csodát, megjavult a elmozdulás->3D...:
A 8. sorban lévőnél a maximális elmozdulást fel kellett vennem 128-ra
A legnagyobb hiba is csak 8 cm >1,4 méternél. Előzőekhez képest ez meseszép.
Valószínűleg az egész megkergül, ha ott van a fekete sáv a képek oldalán.
Persze nem csak boldog vagyok, hanem szomorú, hogy erre nem 1,5 hónappal ezelőtt jöttem rá , pedig a ROI-t próbálgattam, de akkor azt hiszem nem utasítottam, hogy vágja le a felesleges részeket.
Szerencsére legalább a KÉPAF2011 cikket van időm még kijavítani (kérdés is volt az egyik bírálótól, hogy a Z-k miért ilyenek, így erre is tudok válaszolni).
Természetesen a programot is megpiszkálom, ha záróvizsga előtt lesz idő, szerencsére túl sokat nem kell átírni.