2024. április 25., csütörtök

Gyorskeresés

[SVS_12] Szeptember 20.-Október 8.

Írta: | Kulcsszavak: SRV . surveyor . SVS

[ ÚJ BEJEGYZÉS ]

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);

disparity és a két kép

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.

Copyright © 2000-2024 PROHARDVER Informatikai Kft.