I use a stereo system, so I'm trying to get the world coordinates of some points by triangulation.
My cameras have an angle, the Z axis direction (depth direction) is not normal for my surface. Therefore, when I observe a flat surface, I do not get a constant depth, but a “linear” variation, right? And I want depth from the baseline ... How can I redesign?

Part of my code with my projective arrays and triangulation function:
-------- EDIT LATER -----------
Thanks scribbleink, so I tried to apply your suggestion. But I think I have a mistake, because it does not work well, as you can see below. Point clouds seem to be distorted and curved towards the edges of the image.

U, S, Vt = linalg.svd(F) V = Vt.T #Right epipol U[:,2]/U[2,2] # The expected X-direction with C1 camera matri and C1[0,0] the focal length vecteurX = np.array([(U[:,2]/U[2,2])[0],(U[:,2]/U[2,2])[1],C1[0,0]]) vecteurX_unit = vecteurX/np.sqrt(vecteurX[0]**2 + vecteurX[1]**2 + vecteurX[2]**2) # The expected Y axis : height = 2048 vecteurY = np.array([0, height -1, 0]) vecteurY_unit = vecteurY/np.sqrt(vecteurY[0]**2 + vecteurY[1]**2 + vecteurY[2]**2) # The expected Z direction : vecteurZ = np.cross(vecteurX,vecteurY) vecteurZ_unit = vecteurZ/np.sqrt(vecteurZ[0]**2 + vecteurZ[1]**2 + vecteurZ[2]**2) #Normal of the Z optical (the current Z direction) Zopitcal = np.array([0,0,1]) cos_theta = np.arccos(np.dot(vecteurZ_unit, Zopitcal)/np.sqrt(vecteurZ_unit[0]**2 + vecteurZ_unit[1]**2 + vecteurZ_unit[2]**2)*np.sqrt(Zopitcal[0]**2 + Zopitcal[1]**2 + Zopitcal[2]**2)) sin_theta = (np.cross(vecteurZ_unit, Zopitcal))[1] #Definition of the Rodrigues vector and use of cv2.Rodrigues to get rotation matrix v1 = Zopitcal v2 = vecteurZ_unit v_rodrigues = v1*cos_theta + (np.cross(v2,v1))*sin_theta + v2*(np.cross(v2,v1))*(1. - cos_theta) R = cv2.Rodrigues(v_rodrigues)[0]