【问题标题】:Aruco Marker World CoordinatesAruco Marker 世界坐标
【发布时间】:2018-07-10 16:56:51
【问题描述】:

我一直在使用 Python 的 OpenCV 库,使用 ArUco 进行对象跟踪。

目标是获取 ArUco 标记中心的 x/y/z 坐标,以及相对于校准相机的角度。

我可以使用到目前为止的代码在 aruco 标记上显示轴,但找不到如何从旋转和平移向量中获取 x/y/z 坐标(如果这甚至是正确的方法) )。

这是定义旋转/平移向量的代码行:

rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerLength, camera_matrix, dist_coeffs) # For a single marker

关于如何在相机世界中获取角度/标记位置的任何想法?

谢谢!

【问题讨论】:

  • tvec 本身是标记在相机坐标系中的 x/y/z 坐标,而 rvec 是标记相对于相机的旋转(您可以将其转换为 3x3使用 Rodrigues()) 的旋转矩阵。这与您期望的结果不同吗?您说您绘制的轴与捕获的图像正确对齐,对吗?

标签: python opencv image-processing computer-vision aruco


【解决方案1】:

经过一番磨难,我发现aruco中的x和y坐标可以通过角点的平均值来确定:

x = (corners[i-1][0][0][0] + corners[i-1][0][1][0] + corners[i-1][0][2][0] + corners[i-1][0][3][0]) / 4
y = (corners[i-1][0][0][1] + corners[i-1][0][1][1] + corners[i-1][0][2][1] + corners[i-1][0][3][1]) / 4

并且相对于相机的角度可以通过旋转向量的罗德里格斯来确定,矩阵必须先填充

rotM = np.zeros(shape=(3,3))
cv2.Rodrigues(rvec[i-1], rotM, jacobian = 0)

最后通过旋转矩阵的RQ分解可以得到yaw pitch和roll

ypr = cv2.RQDecomp3x3(rotM)

【讨论】:

    【解决方案2】:

    正如 chungzuwalla 所说,tvec 表示标记中心在相机坐标系中的位置,它不会随着标记在某个位置的旋转而改变。如果您想知道相机坐标系中角点的位置,则需要同时使用 rvec 和 tvec。

    这里有一个完美的解释

    Aruco markers with openCv, get the 3d corner coordinates?

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2015-08-10
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多