4

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

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

谢谢!

4

2 回答 2

4

经过一番磨难,我发现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 Decompose,可以得到 yaw pitch 和 roll

ypr = cv2.RQDecomp3x3(rotM)
于 2018-07-18T16:22:06.320 回答
2

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

这里有一个完美的解释

带有openCv的Aruco标记,获取3d角坐标?

于 2019-04-14T14:30:09.530 回答