2014-12-31 9 views
11

Mam dwa obrazy stereo, które chciałbym wykorzystać do obliczenia mapy głębokości. Chociaż niestety nie znam C/C++, znam Pythona - więc gdy znalazłem this tutorial, byłem optymistą.Python/OpenCV: Obliczanie mapy głębi z obrazów stereo

Niestety, samouczek wydaje się być nieco przestarzały. Nie tylko musi zostać zmodyfikowany, aby w ogóle działał (zmieniając nazwę "createStereoBM" na "StereoBM"), ale po uruchomieniu nie daje dobrego wyniku, nawet na przykładowych obrazach stereo, które zostały użyte w samouczku .

Oto przykład:

image-left image-right

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

imgL = cv2.imread('Yeuna9x.png',0) 
imgR = cv2.imread('SuXT483.png',0) 

stereo = cv2.StereoBM(1, 16, 15) 
disparity = stereo.compute(imgL, imgR) 

plt.imshow(disparity,'gray') 
plt.show() 

Rezultat:

the result

To wygląda bardzo różni się od tego, co autor poradnika osiąga:

good result http://docs.opencv.org/trunk/_images/disparity_map.jpg

Poprawianie parametrów nie poprawia spraw. Cała dokumentacja, którą udało mi się znaleźć, dotyczy oryginalnej wersji C kodu openCV, a nie ekwiwalentu python-library. Niestety nie mogłem tego użyć, aby poprawić sytuację.

Każda pomoc zostanie doceniona!

+0

tylko dla przypomnienia, poradnik jest z przyszłości (opencv3.0), ale tak, to jest nieaktualne. dla obecnego 3.0, będziesz musiał użyć cv2.StereoBM_create() lub cv2.StereoSGBM_create(). – berak

+0

cv2.StereoBM wydaje się istnieć, ale użycie cv2.StereoBM_create() lub cv2.StereoSGBM_create() daje błąd (błąd atrybutu). – jwdink

+0

znowu, oczywiście używasz opencv2.4, a nie 3.0 – berak

Odpowiedz

-1

Aparat jest tłumaczony w pionie zamiast w poziomie. Obróć obrazy o 90 stopni, a następnie spróbuj. (Udowodnij to sobie obracając ekran.) Po prostu podniosłem laptopa i przekręciłem go na jego krawędź.)

Wspomniałeś o innym oprogramowaniu; może coś w rodzaju wiersza-kolumny/kolumny-głównej między oryginałem a pyOpenCV.

+0

Jeśli dobrze rozumiem twoją sugestię, powinienem spróbować obrócić obrazy źródłowe o 90 stopni, a następnie uruchomić ten sam kod? Po prostu próbowałem tego - nie przynosi to lepszych rezultatów. Czy to działa? Jeśli tak, czy możesz opublikować wynik? – jwdink

+0

Myślę, że to tylko formatowanie pytania ... Obrazy są z dwóch perspektyw oddzielonych poziomo. – will

+0

Dodatkowo, gdyby tak było, to nie miało to znaczenia, wystarczyłoby umieścić obraz * dolny * jako lewy (obrócić ramkę odniesienia). Obracanie każdego z obrazów osobno zatrzymałoby to działanie. – will

15

masz zdjęć złą drogę.

Spójrz na obrazy, cyna tyłu lampy pozwala wypracować lokalizacje kamery dwoma obrazami,

Wystarczy zmienić:

# v 
imgR = cv2.imread('Yeuna9x.png',0) 
imgL = cv2.imread('SuXT483.png',0) 
#^

Jeśli spojrzeć na obraz w samouczku które mówią, że jest to ramka left, taka sama jak twoja right.

Oto mój wynik po zmianie.

enter image description here