Szeptember 20., még 80 nap
Ebben a postban kicsit benéztem, OpenCV a C-s és a C++-s rész is 2.1-s: [link].
Következő lépés: A két képből 3D-s adatokat nyerni.
Október 8., még 62 nap
Visszatértem, elég sokat szenvedtem a 3D-s adatokkal eddig.
Elvileg az OpenCV-ben van egy függvény, cvReprojectImageTo3D, amivel elvileg rögtön 3D-s ponthalmaz nyerhető a cvFindStereoCorrespondenceBM eredményéből. Itt egy bizonyíték.
Sajnos nálam valami nem klappol. Most a különböző próbálgatásoknak a beállításai és eredményei lesznek felsorolva.
Először is kellett két, ami mindig ugyanaz, és van sztereókalibráció, ezért az OpenCV példák közti képet használtam. A különböző verziók között csak a változásokat írom le.
Magyarázat:
BMState : cvFindStereoCorrespondenceBM beállításai
disp : cvFindStereoCorrespondenceBM eredménye: disparity map
vdisp : disp normalizált változata
Q : cvStereoRectify eredménye: disparity-to-depth mapping matrix
_3dimage : cvReprojectImageTo3D eredménye, a 3D-ben ábrázolt képeken ez szerepel.
Mátrixos és cv függvény próbák
#1
BMState beállítások:
BMState->preFilterSize=41;
BMState->preFilterCap=31;
BMState->SADWindowSize=41;
BMState->minDisparity=-64;
BMState->numberOfDisparities=128;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
Q mátrix CV_64F, disp mátrix CV_16S, vdisp van használva a függvényben, ami CV_8U, _3dimage CV_32FC3
Q mátrix létrehozása:
CvMat *_Q = cvCreateMat(4, 4, CV_64FC1);
vdisp előállítása disp-ből
cvNormalize(disp, vdisp, 0, 256, CV_MINMAX);
cvReprojectImageTo3D eredménye
Nem egészen erre számítottam...
#2
Q mátrix létrehozása:
double Q[4][4];
CvMat _Q = cvMat(4, 4, CV_64FC1, Q);
Eredmény teljesen ugyanaz.
#3
Sajnos elfelejtettem leírni, itt mit csináltam .
Csak az intervallum változott, pontok maradtak.
#4
vdisp számolása:
cvConvertScale(disp, vdisp, 1.0/16, 0);
A felül levő pontokból kicsit több lett.
#5
A függvénybe vdisp helyett disp került, tehát:
cvReprojectImageTo3D(disp, _3dimage, &_Q);
Hát ez még rosszabb, mint az előbbiek .
#6
Ismét vdisp használata, CV_16S lett, számítása:
cvNormalize(disp, vdisp, 0, 32767, CV_MINMAX);
Eredmény: a felül lévő pontok száma tovább csökkent, gyakorlatilag csak a kék maradt.
#7
Vissza disp, disp CV_32F mátrix
Ezt már robottal, az eredeti kép nincs meg, de a robot felé nyúltam.
Már kicsit jobb, tehát jó, ha disp és _3dimage egy formátumban van.
A mátrixos játéknak itt vége.
BMState beállítási próbák
#8
BMState->SADWindowSize=15;
Kicsit részletesebb, 3D-s pontokra meg egy hatalmas WTF?!.
#9
BMState->SADWindowSize=5;
Még részletesebb, de a 3D pontoknak annyi.
#10
BMState->SADWindowSize=5;
BMState->numberOfDisparities=64;
#11
BMState->SADWindowSize=5;
BMState->minDisparity=0;
#12
BMState->SADWindowSize=5;
BMState->speckleWindowSize=100;
#9-hez képest nincs változás, speckleRange-t is meg kell adni ahhoz, hogy működjön.
#13
BMState->SADWindowSize=5;
BMState->speckleWindowSize=100;
BMState->speckleRange=8;
#14
BMState->SADWindowSize=5;
BMState->textureThreshold=0;
#15
BMState->disp12MaxDiff változtatása nem csinál látható változást a disparity képen.
#16
BMState->SADWindowSize=5;
BMState->preFilterCap=63;
#17
BMState->SADWindowSize=5;
BMState->uniquenessRatio=50;
#18
BMState->SADWindowSize=15;
BMState->minDisparity=0;
BMState->numberOfDisparities=64;
BMState->uniquenessRatio=25;
BMState->disp12MaxDiff=-1;
BMState->speckleWindowSize=100;
BMState->speckleRange=32;
#19
BMState->preFilterSize=13;
BMState->preFilterCap=13;
BMState->SADWindowSize=13;
BMState->minDisparity=-16;
BMState->numberOfDisparities=64;
BMState->textureThreshold=10;
BMState->uniquenessRatio=15;
Mint ha csak egy becsapódást modelleztem volna...
#20
BMState->preFilterType=CV_STEREO_BM_NORMALIZED_RESPONSE;
BMState->preFilterSize=21;
BMState->preFilterCap=19;
BMState->SADWindowSize=7;
BMState->minDisparity=-64;
BMState->numberOfDisparities=128;
BMState->textureThreshold=12;
BMState->uniquenessRatio=3;
BMState->speckleRange=0;
BMState->speckleWindowSize=0;
Hááát....
#21
BMState->preFilterSize=5;
BMState->preFilterCap=1;
BMState->SADWindowSize=61;
BMState->minDisparity=0;
BMState->numberOfDisparities=128;
BMState->textureThreshold=255;
BMState->uniquenessRatio=0;
Talán ez áll a legközelebb ahhoz, amit szeretnék. Cserébe leszívja a procit.
Itt állok most, és kicsit tanácstalan vagyok, remélem csak félreértelmezem az adatokat.
Alternatívaként maradt:
- BM marad, csak kézzel keresem meg az elmozdulásokat, majd ráereszteni egy másik függvényt.
- Képeken sarkokat keresni, majd azokat illeszteni.