【发布时间】:2021-01-23 09:39:08
【问题描述】:
我正在尝试使用 cv2.triangulatePoints 获取 3D 点,但它总是返回几乎相同的 Z 值。我的输出如下所示: 正如它所看到的,所有点的 Z 值几乎相同。没有深度。
这是我的三角测量:
def triangulate(self, proj_mat1, pts0, pts1):
proj_mat0 = np.zeros((3,4))
proj_mat0[:, :3] = np.eye(3)
pts0, pts1 = self.normalize(pts0), self.normalize(pts1)
pts4d = cv2.triangulatePoints(proj_mat0, proj_mat1, pts0.T, pts1.T).T
pts4d /= pts4d[:, 3:]
out = np.delete(pts4d, 3, 1)
print(out)
return out
这是我的投影矩阵计算:
def getP(self, rmat, tvec):
P = np.concatenate([rmat, tvec.reshape(3, 1)], axis = 1)
return P
这是我得到 rmat、tvec 和调用 triangulation 的部分:
E, mask = cv2.findEssentialMat(np.array(aa), np.array(bb), self.K)
_, R, t, mask = cv2.recoverPose(E, np.array(aa), np.array(bb), self.K)
proj_mat1 = self.getP(R, t)
out = self.triangulate(proj_mat1, np.array(aa, dtype = np.float32), np.array(bb, dtype = np.float32))
我的相机矩阵:
array([[787.8113353 , 0. , 318.49905794],
[ 0. , 786.9638204 , 245.98673477],
[ 0. , 0. , 1. ]])
我的投影矩阵1:
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]])
解释:
- aa 和 bb 是来自 2 帧的匹配点。
- self.K 是我的相机矩阵
- 从基本矩阵中提取旋转和平移矩阵
- 根据匹配的关键点计算的基本矩阵。它每帧都会改变。
- 投影矩阵 2 每帧都会发生变化。
更改第一个投影矩阵后的输出(我从 matplotlib 切换到 pangolin 作为 3D 可视化工具):
我的错误在哪里?如果需要任何进一步的信息,请告诉我。我会更新我的问题。
【问题讨论】:
-
Ciao!我认为,为了帮助人们理解代码背后的数学,如果您可以在问题的末尾添加所有计算矩阵会很好:相机矩阵、旋转矩阵、平移向量、投影矩阵 1 和 2、投影点数组 aa 和 bb 以及在这个意义上的其他任何东西......祝你好运!
-
感谢您的评论@Antonino。我编辑了我的问题。
标签: python opencv computer-vision camera-calibration triangulation