使用 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 估计相机的世界位置的主要内容,如果未能解决你的问题,请参考以下文章