使用aruco估算相机的世界位置

时间:2018-10-16 10:25:10

标签: python opencv camera aruco

在OpenCV中,我使用的是Charuco板,已经校准了相机,并使用估算值来获取rvec和tvec。 (类似于示例代码)。我使用的是固定板,相机在四处移动。我是这个菜鸟,所以如果我想念这简单的东西,请忍受。

我知道我可以使用Rodrigues()从rvec获取3x3的旋转矩阵,以确保板的方向,并且可以使用worldPos = -Rt()* tvec(在python中)将tvec值转换为世界坐标获取摄像机的位置

似乎我已经拥有了所需的一切,但是,如果我物理地旋转相机,WorldPos也将发生巨大变化!我敢肯定这不是因为我尝试了很多次后相机已经移动了。

我不知道问题出在哪里,谢谢您的建议。

并且代码在下面(在python中)。

self.retval, self.rvec, self.tvec =   aruco.estimatePoseBoard(self.corners, self.ids, board, self.cameraMatrix, self.distanceCoefficients)
self.dst, jacobian = cv2.Rodrigues(self.rvec)
self.rvec_trs = self.dst.transpose()
self.worldPos = - self.rvec_trs * self.tvec
self.worldPos = [self.worldPos[0][0],self.worldPos[1][1], self.worldPos[2][2]]

1 个答案:

答案 0 :(得分:1)

最后,我在@Micka的帮助下解决了它。 下面的代码(在python中),希望它可以帮助遇到相同问题的其他人。

self.retval, self.rvec, self.tvec = aruco.estimatePoseBoard(self.corners, self.ids, board, self.cameraMatrix, self.distanceCoefficients
self.dst, jacobian = cv2.Rodrigues(self.rvec)
self.extristics = np.matrix([[self.dst[0][0],self.dst[0][1],self.dst[0][2],self.tvec[0][0]],
                             [self.dst[1][0],self.dst[1][1],self.dst[1][2],self.tvec[1][0]],
                             [self.dst[2][0],self.dst[2][1],self.dst[2][2],self.tvec[2][0]],
                             [0.0, 0.0, 0.0, 1.0]
                ])
self.extristics_I = self.extristics.I  # inverse matrix
self.worldPos = [self.extristics_I[0,3],self.extristics_I[1,3],self.extristics_I[2,3]]

但是我仍然不知道为什么worldPos = -R.t()* tvec无法得到正确的答案。希望有人能告诉我。谢谢!