2017-01-02 18 views
9

Pracuję nad depth map with OpenCV. Mogę go uzyskać, ale jest on zrekonstruowany z lewej kamery i jest trochę nachylenia tego ostatniego i jak widać na rysunku, głębokość jest "przesunięta" (głębokość powinna być blisko i bez poziomego gradientu):Python - Przekształcenie perspektywy dla OpenCV pod kątem obrotu

enter image description here

Chciałbym wyrazić jak przy zerowym kącie, próbuję z funkcją perspektywy warp jak widać poniżej, ale i uzyskanie zerowego pola ...

P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1))) 

dst = cv2.warpPerspective(depth, P, (2048, 2048)) 

z:

#Projection 2D -> 3D matrix 
A1 = np.zeros((4,3)) 
A1[0,0] = 1 
A1[0,2] = -1024 
A1[1,1] = 1 
A1[1,2] = -1024 
A1[3,2] = 1 

#Rotation matrice around the Y axis 
theta = np.deg2rad(5) 
Rot = np.zeros((4,4)) 
Rot[0,0] = np.cos(theta) 
Rot[0,2] = -np.sin(theta) 
Rot[1,1] = 1 
Rot[2,0] = np.sin(theta) 
Rot[2,2] = np.cos(theta) 
Rot[3,3] = 1 

#Translation matrix on the X axis 
dist = 0 
Transl = np.zeros((4,4)) 
Transl[0,0] = 1 
Transl[0,2] = dist 
Transl[1,1] = 1 
Transl[2,2] = 1 
Transl[3,3] = 1 

#Camera Intrisecs matrix 3D -> 2D 
cam = np.concatenate((C1,np.zeros((3,1))),axis=1) 
cam[2,2] = 1 
P = np.dot(cam,np.dot(Transl,np.dot(Rot,A1))) 

dst = cv2.warpPerspective(Z0_0, P, (2048*3, 2048*3)) 

później edytować:

Możesz pobrać zestaw danych pola 32MB tutaj: https://filex.ec-lille.fr/get?k=cCBoyoV4tbmkzSV5bi6. Następnie załaduj i obejrzyj obraz za pomocą:

from matplotlib import pyplot as plt 
import numpy as np 

img = np.load('testZ0.npy') 
plt.imshow(img) 
plt.show() 
+0

dlaczego usunąłeś swoją odpowiedź valentin? – user3601754

+0

[Ta odpowiedź] (http://stackoverflow.com/q/33497736/1510289) może być dla Ciebie pomocna. –

+0

Dzięki, że to sprawdzam;) – user3601754

Odpowiedz

4

Mam gotowe rozwiązanie. Możesz go później zmodyfikować.

Użyłem operacji obsługi myszy dostępnych w OpenCV, aby przyciąć region zainteresowania w danej mapie cieplnej.

(Czy po prostu powiedziałem, że użyłem myszy do przycięcia regionu?) Tak, zrobiłem. Aby dowiedzieć się więcej o funkcjach myszy w OpenCV SEE THIS. Poza tym, istnieje wiele innych SO pytań, które mogą pomóc w tym względzie :)

Korzystanie z tych funkcji udało mi się uzyskać następujące:.

enter image description here

teraz do kwestii usuwania nachylenia . Użyłem zasady homografii, biorąc punkty narożne obrazu powyżej i używając go na "białym" obrazie o określonej wielkości. Użyłem do tego funkcji cv2.findHomography().

Teraz za pomocą funkcji w OpenCV cv2.warpPerspective(), udało mi się uzyskać następujące:

enter image description here

Teraz można wymagana skala do tego obrazu, jak chcesz.

KOD:

Mam również dołączone kilka fragmentów kodu dla Lektura:

#First I created an image of white color of a definite size 
back = np.ones((435, 379, 3)) # size 
back[:] = (255, 255, 255)  # white color 

Następny ja uzyskał punkty narożne pts_src na nachylonej obrazka poniżej:

pts_src = np.array([[25.0, 2.0],[403.0,22.0],[375.0,436.0],[6.0,433.0]]) 

Chciałbym, aby powyższe punkty zostały odwzorowane na punkty "pts_dst" podane poniżej:

pts_dst = np.array([[2.0, 2.0], [379.0, 2.0], [379.0, 435.0],[2.0, 435.0]]) 

Teraz użyłem do dyrektora homography:

h, status = cv2.findHomography(pts_src, pts_dst) 

końcu odwzorowany obraz oryginalny do białego obrazu za pomocą perspektywy przekształcać.

fin = cv2.warpPerspective(img, h, (back.shape[1],back.shape[0])) 
# img -> original tilted image. 
# back -> image of white color. 

Mam nadzieję, że to pomoże! Muszę się także wiele nauczyć od tego pytania.

Uwaga: Punkty karmione do 'cv2.findHomography() musi być w float. Aby uzyskać więcej informacji na temat Homografii, odwiedź THIS PAGE

Powiązane problemy