ARCore姿势和Aruco估计值

时间:2019-01-07 17:19:04

标签: android opencv computer-vision augmented-reality arcore

我有一个服务器功能,可以从图像中检测并估算aruco标记的姿势。

使用函数estimatePoseSingleMarkers,我发现了旋转和平移矢量。 我需要在带有ARCore的Android应用中使用此值来创建Pose。

文档说Pose需要两个浮点数组(旋转和平移):https://developers.google.com/ar/reference/java/arcore/reference/com/google/ar/core/Pose

float[] newT = new float[] { t[0], t[1], t[2] };
Quaternion q = Quaternion.axisAngle(new Vector3(r[0], r[1], r[2]), 90);
float[] newR = new float[]{ q.x, q.y, q.z, q.w };
Pose pose = new Pose(newT, newR);

放置在此姿势中的3D对象的位置是完全随机的。

我在做什么错了?

这是估计和绘制轴后来自服务器映像的快照。 我收到的图像旋转了90°,不确定是否与任何东西有关。 image server with axis

1 个答案:

答案 0 :(得分:0)

cv::aruco::estimatePoseSingleMarkerslink)返回Rodrigues格式的旋转矢量。遵循文档

w = norm( r ) // angle of rotation in radians
r = r/w // unit axis of rotation

因此

float w = sqrt( r[0]*r[0] + r[1]*r[1] + r[2]*r[2] );
// handle w==0.0 separately
// Get a new Quaternion using an axis/angle (degrees) to define the rotation
Quaternion q = Quaternion.axisAngle(new Vector3(r[0]/w, r[1]/w, r[2]/w), w * 180.0/3.14159 );

应该起作用,除了提到的直角旋转。也就是说,如果镜头参数正确地或以一定的精度被馈送到estimatePoseSingleMarkers