ARCore Pose и Aruco оценивают PoseSingleMarkers - PullRequest
0 голосов
/ 07 января 2019

У меня есть серверная функция, которая обнаруживает и оценивает позу маркера aruco по изображению.

Используя функцию estimatePoseSingleMarkers Я нашел вектор вращения и перемещения. Мне нужно использовать это значение в приложении Android с ARCore для создания позы.

В документации сказано, что 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);

Положение трехмерного объекта, размещенного в этой позе, совершенно случайно.

Что я делаю не так?

Это снимок с изображения сервера после оценки и отрисовки оси. Изображение, которое я получаю, повернуто на 90 °, не уверен, относится ли оно к чему-либо. image server with axis

1 Ответ

0 голосов
/ 24 января 2019

cv::aruco::estimatePoseSingleMarkers ( ссылка ) возвращает вектор вращения в формате Родригес . После документа

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

* Таким образом, 1009 *

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 правильно или с определенной точностью.

...