Aruco标记世界坐标

时间:2018-07-10 16:56:51

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

我一直在使用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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

经过一番磨难后,我发现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

相对于摄像机的角度可以通过旋转矢量的Rodrigues确定,矩阵必须事先填充

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

最后,可以通过对旋转矩阵进行RQ分解来获得偏航角和侧倾角

ypr = cv2.RQDecomp3x3(rotM)

答案 1 :(得分:0)

正如chungzuwalla所说,tvec表示标记中心在相机坐标系中的位置,并且不会随标记在某个位置的旋转而变化。如果您想了解摄像机坐标系中拐角的位置,则需要rvec和tvec。

这是一个完美的解释

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