我一直在使用Python的OpenCV库,使用ArUco进行对象跟踪。
目标是将x / y / z坐标置于ArUco标记的中心,以及相对于校准摄像机的角度。
我能够用我迄今为止的代码在aruco标记上显示轴,但是无法找到如何从旋转和平移向量中获取x / y / z坐标(如果这是正确的方法)。
这是定义旋转/平移向量的代码行:
rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerLength, camera_matrix, dist_coeffs) # For a single marker
关于如何在相机世界中获得角度/标记位置的任何想法?
谢谢!
在经历了一些苦难之后,我发现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)
正如chungzuwalla所说,tvec表示标记中心在摄像机坐标系中的位置,并且它不随着标记在某个位置的旋转而改变。如果你想知道相机坐标系中角落的位置,那么你需要rvec和tvec。
这是一个完美的解释