OpenCV倾斜摄像头和三角测量地标,实现立体视觉

2024-10-01 09:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是立体系统,所以我试着通过三角测量得到一些点的世界坐标。在

我的相机呈现一个角度,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,])

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

谢谢你的涂鸦,所以我试着应用你的建议。但我想我有一个错误,因为它不能很好地工作,正如你可以看到下面。点云看起来是扭曲的,向图像的边缘弯曲。在

enter image description here

^{pr2}$

Tags: andthenp方向leftdotarep2
2条回答

对于重建方法,预期的z方向是任意的。通常,您有一个旋转矩阵,它可以从您想要的方向旋转左摄影机。你可以很容易地建立这个矩阵,然后你需要做的就是用R的转置乘以你的重构点

为了增加fireant的响应,这里有一个候选解决方案,假设预期的X方向与连接两个相机投影中心的线重合。在

  1. 计算焦距fΒ1和f_2(通过针孔模型校准)。在
  2. 求解摄影机2的epipole在摄影机1的帧中的位置。为此,可以使用立体相机对的基本矩阵(F)或基本矩阵(E)。具体地说,左右极磁极位于F的空空间中,因此可以使用Singular Value Decomposition。关于坚实的理论参考,见Hartley和Zisserman,第二版,表9.1“基本矩阵属性摘要”,第246页(freely available PDF of the chapter)。在
  3. 摄影机1的投影中心,即(0,0,0)和右epipole的位置,即(e_x,e_y,f_1)一起定义了一条与连接摄影机中心的线对齐的光线。这可以用作预期的X方向。把这个向量称为v_x
  4. 假设预期的Y轴在图像平面中朝下,即从(0,0,f_1)到(0,height-1,f_1),其中f是焦距。把这个向量称为v
  5. 期望的Z方向现在是向量v_x和v_y的叉积
  6. 使用预期的Z方向和相机1的光轴(Z轴),你可以从两个3D向量计算旋转矩阵,比如this other stackoverflow post中列出的方法。在

实用说明: 根据我的实际经验,如果不付出相当大的努力,期望平面对象与立体基线精确对齐是不太可能的。需要一定量的平面拟合和额外的旋转。在

一次性努力: 这取决于您是否需要这样做一次,例如一次性校准,在这种情况下,只需将此估计过程实时化,然后旋转您的立体相机对,直到深度贴图方差最小化。然后锁定你的相机位置,祈祷以后不要有人撞到它。在

重复性: 如果您需要将估计的深度贴图与随捕捉到的每一个新帧而变化的真正任意Z轴对齐,那么您应该考虑在平面估计方法上投入时间,并使其更加健壮。在

相关问题 更多 >