利用aruco估计cam的世界位置

2024-09-24 10:18:28 发布

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

在OpenCV中,我使用了一个Charuco板,已经校准了摄像机,并使用估算得到了rvec和tvec。(类似于示例代码)。我用的是一个固定板,带着摄像头四处移动。我对这件事一无所知,所以如果这件事是我所缺少的,请原谅我。在

我知道我可以使用Rodrigues()从rvec获得线路板方向的3x3旋转矩阵,并且可以使用worldPos=-R.t()*tvec(在python中)将tvec值转换为世界坐标,以获得相机的位置

似乎我得到了我需要的一切,然而,如果我旋转相机的物理,世界pos也会发生巨大的变化!我敢肯定不是因为我试了很多次相机就被移动了。在

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

代码如下(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]]

Tags: 代码self示例opencv摄像机dst摄像头校准
1条回答
网友
1楼 · 发布于 2024-09-24 10:18:28

最后我在米卡的帮助下解决了这个问题。 下面的代码(用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不能得到正确的答案。希望有人能告诉我。谢谢!在

相关问题 更多 >