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

Posted

技术标签:

【中文标题】使用 aruco 估计相机的世界位置【英文标题】:using aruco to estimate the world position of camera 【发布时间】:2019-03-20 20:39:10 【问题描述】:

在 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]]

【问题讨论】:

尝试在这里提问:answers.opencv.org/questions “如果我旋转相机”是什么意思?身体上?多少是巨大的?您应该使用示例和数字以及您使用的代码更好地解释,以便人们更好地理解问题。 您确定 rvec 和 tvec 是相机外在因素,而不是相对于相机的物体/板位吗? @api55 是的,我物理旋转相机。 @Micka 我认为这是相对于相机的板姿势。我发现我需要让相机外部来估计相机的worldPos。那你能给我一些建议吗?谢谢! 【参考方案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 不能得到正确的答案。希望有人可以告诉我。谢谢!

【讨论】:

无论是相机静止而物体移动还是物体静止而相机移动,图像都是一样的。但是应用于对象或相机的变换是不同的(反向) worldPos = -R.t() * tvec 不起作用,因为 * 运算符只是进行逐个元素的乘法,而不是真正的矩阵乘法。您需要改用@ 运算符。

以上是关于使用 aruco 估计相机的世界位置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Aruco Markers 获取相机位置和旋转

week63 PnP位姿估计 基于ArUco Marker来估算camera的位姿

相机位姿估计3:根据两幅图像的位姿估计结果求某点的世界坐标

如何链接两个 ArUco 标记的姿势?

使用 OpenCV Python 计算相机世界位置

立体视觉:深度估计