2013-10-06 11 views
5

Próbuję oszacować głębokość na podstawie pary stereo z OpenCV. Mam dysproporcja mapa i oszacowanie głębokości można otrzymać jako:Szacowanie głębokości OpenCv z mapy różnic

   (Baseline*focal) 
depth =  ------------------ 
      (disparity*SensorSize) 

Użyłem techniki Blok Matching znaleźć te same punkty w dwóch rectificated obrazów. OpenCV pozwala ustawić niektóre parametry dopasowania bloku, na przykład BMState->numberOfDisparities.

po procesie dopasowania bloków:

cvFindStereoCorrespondenceBM(frame1r, frame2r, disp, BMState); 
cvConvertScale(disp, disp, 16, 0); 
cvNormalize(disp, vdisp, 0, 255, CV_MINMAX); 

I znaleziono wartość głębokości jak:

if(cvGet2D(vdisp,y,x).val[0]>0) 
    { 
    depth =((baseline*focal)/(((cvGet2D(vdisp,y,x).val[0])*SENSOR_ELEMENT_SIZE))); 
    } 

Jednak wartość głębokości obtaied różni się od wartości obtaied z poprzednim wzorem powodu wartości BMState->numberOfDisparities który zmienia wartość wyniku.

Jak ustawić ten parametr? co zmienić ten parametr?

Dzięki

Odpowiedz

4

Prosta formuła jest ważny tylko wtedy, gdy ruch od strony lewej do prawej jednej kamery jest czystą translację (w szczególności równolegle do poziomej osi na rysunku).

W praktyce tak rzadko się zdarza. Powszechne jest na przykład przeprowadzanie dopasowywania po obrazach, to jest po ich wypaczeniu przy użyciu znanej Podstawowej Matrycy, tak że odpowiednie piksele są ograniczone do tego samego rzędu. Po dopasowaniu poprawionych obrazów, możesz przypiąć je do oryginalnych obrazów za pomocą odwrotności prostującej się osnowy, a następnie dokonać triangulacji w przestrzeń 3D, aby zrekonstruować scenę. OpenCV ma do tego rutynową procedurę: reprojectImageTo3d

+0

Thaks za odpowiedź, daję w procesie dopasowywania bloku dwa poprawione obrazy, więc ta formuła powinna działać poprawnie? Teraz spróbuję użyć funkcji reprojectImageTo3D. WERSJA WŁOSKA: Dal nome credo che tu sia italiano, quindi per una maggiore chiarezza (per me); se utilizzo già le immagini rettificate la formula precedente dovrebbe andare bene giusto? Se invece utilizzo ReprojectImageTo3D dovrei estrapolare soltanto il valore Z? Grazie per la risposta. – Speed87

+0

Określ "powinien działać"? Formuła równoległej kamery zapewnia głębokość w danym pikselu w odniesieniu do idealnej kamery, która obserwuje poprawiony obraz. Jego odtworzenie będzie rzutowe, ale nie metryczne, dokładne. [Tak, mówię po włosku, ale to jest forum tylko po angielsku] –

0

Wymieniona powyżej formuła nie działa, ponieważ płaszczyzna kamery i płaszczyzna obrazu nie są takie same, tzn. Kamera będzie znajdować się na pewnej wysokości, a płaszczyzna, którą przechwytuje, będzie znajdować się na ziemi . Musisz więc wprowadzić niewielką modyfikację w tej formule. Można dopasować te wartości odchyleń i znaną odległość na wielomian przez dopasowanie krzywej. Z niego otrzymasz współczynniki, które można wykorzystać dla innych nieznanych odległości. Drugi sposób polega na utworzeniu chmury punktów 3D za pomocą macierzy zawijania i reprojectimageTo3d (API Opencv).

Powiązane problemy