python - OpenCV - 用于立体视觉的倾斜相机和三角测量地标

标签 python opencv triangulation stereo-3d

我正在使用立体系统,因此我试图通过三角测量获得某些点的世界坐标。

我的相机呈现一个角度,Z 轴方向(深度方向)与我的表面不垂直。这就是为什么当我观察平坦表面时,我得到的深度不是恒定的,而是“线性”变化,对吗?我想要基线方向的深度...我如何重新投影?

enter image description here

一段带有投影数组和三角函数的代码:

#C1 and C2 are the cameras matrix (left and rig)
#R_0 and T_0 are the transformation between cameras
#Coord1 and Coord2 are the correspondant coordinates of left and right respectively
P1 = np.dot(C1,np.hstack((np.identity(3),np.zeros((3,1))))) 

P2 =np.dot(C2,np.hstack(((R_0),T_0)))

for i in range(Coord1.shape[0])
    z = cv2.triangulatePoints(P1, P2, Coord1[i,],Coord2[i,])

-------- 稍后编辑------------

感谢 scribbleink,所以我尝试应用您的建议。但我认为我有一个错误,因为它不能正常工作,如下所示。并且点云似乎向图像的边缘翘曲和弯曲。

enter image description here

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]

最佳答案

您期望的 z 方向对于重建方法是任意的。一般来说,你有一个旋转矩阵,可以从你想要的方向旋转左相机。您可以轻松构建该矩阵 R。然后您需要做的就是将重建的点乘以 R 的转置。

关于python - OpenCV - 用于立体视觉的倾斜相机和三角测量地标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36034849/

相关文章:

python - 如何使用三个使用公共(public)模块的应用程序构建一个 python 项目

python - pandas如何在写入数据框之前向csv添加详细信息

python - 在python中使用OpenCV加载视频

ios - 我如何确定 iPhone CoreLocation 是否使用卫星或蜂窝塔三角测量来查找当前位置?

c++ - 当给定位的点是三角形的顶点之一时,OpenCV 的 Subdiv2D/Delaunay 是否损坏?

c++ - 轻量级 Delaunay 三角函数库(用于 c++)

python - yield 中的 yield 有什么作用?

javascript - 如何在 Django 中使用 npm 包和 ES6 功能?

python - 如何消除文本图像的倾斜并检索该图像的新边界框 Python OpenCV?

image - 如何将 cv2.addWeighted 和 cv2.GaussianBlur 转换成 MATLAB?