Aruco标记的世界坐标

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

有没有关于如何在摄像机世界中获取角度/标记位置的想法?
谢谢!

5
Tvec本身是相机坐标系下标志的x/y/z坐标,rvec是标志相对于相机的旋转(可以使用罗德里格斯(Rodrigues())将其转换为3x3旋转矩阵)。这与您期望的结果有区别吗?您说您绘制的轴与捕获图像正确对齐,对吗? - Chungzuwalla
2个回答

5

经过一些尝试,我发现在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分解,可以得到偏航角、俯仰角和滚动角。
ypr = cv2.RQDecomp3x3(rotM)

2
如chungzuwalla所说,tvec表示标记中心在相机坐标系中的位置,该位置不随标记旋转而改变。如果您想了解角落在相机坐标系中的位置,则需要rvec和tvec两者。

以下是一个完美的解释:

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

"Original Answer"翻译成"最初的回答"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接