Как отследить объекты на сфере? - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь отследить вращение сферы, отслеживая поверхностные элементы на сфере.

TL; DR : Я неправильно усредняю ​​кватернионы?

Введение

Давайте пропустим обнаружение и сопоставление функций, это просто ORB + FLANN из OpenCV. Это дает мне два набора (совпавших) ключевых точек для двух последовательных кадров.

Я проецирую ключевые точки в 3d, помещая их на сферу в соответствии с их расстоянием до центра сфер 1 . Это дает мне ключевые точки в системе координат сфер.

Flow vectors (не говоря уже о больших векторах)

Из сопоставленных ключевых точек как векторов я вычисляю набор кватернионов, представляющих вращение с момента последнего кадра ( используемый алгоритм ).

a = np.cross(v1,v2)
w = np.sqrt(np.linalg.norm(v1)**2 * np.linalg.norm(v2)**2) + np.dot(v1,v2)
return quaternion(w, a[0], a[1], a[2]).normalized()

Проблема

Итак, на данный момент моя идея состоит в том, что все эти кватернионы представляют одно и то же вращение (плюс / минус шум). Таким образом, теоретически я должен быть в состоянии вычислить средний кватернион моего набора кватернионов и иметь хорошее представление о том, как моя сфера двигалась с момента последнего кадра ( алгоритм использовал ).

np.linalg.eig(np.mean(np.array([np.outer(q,q) for q in quats]), axis=0))[0]

Дело в том, что это приводит к единичным кватернионам для всех кадров (или рядом, как e ^ -06 close):

quaternion(0.999999999865224, -4.24742027709118e-06, 1.4799762763963e-05, 5.69900765792268e-06)

(«наивное» усреднение по всем кватернионам на самом деле дает результаты, которые выглядят так, как будто бы они соответствуют исходному вращению, но я бы предпочел использовать проверенный метод)

Итак, у меня есть две теории:

  1. Наличие нескольких тысяч кватернионов приводит к катастрофическому сокращению в вычислениях суммирования и собственных векторов. Или (более вероятно):
  2. У меня ошибка в мышлении.

Мысли

1 Я знаю, что мне приходится иметь дело с проекцией камер, но для подтверждения концепции я решил игнорировать это.

1 Ответ

0 голосов
/ 07 сентября 2018

Какой у вас вопрос? Неясно, что вы пытаетесь найти.

Однако, как бы то ни было, ваш алгоритм явно неверен. Движение 1 точки на сфере не определяет однозначно вращение сферы.

моя идея состоит в том, что все эти кватернионы представляют одно и то же вращение

Это не так. Вы используете формулу, чтобы найти кватернион от движения одной точки. Вращение, найденное по этой формуле, предполагает, что точка была перемещена вдоль большого круга.

Когда вы вращаете сферу, только точки на экваторе (определяемые осью вращения) движутся вдоль большой окружности, остальные точки движутся вдоль других, более интересных кривых.

Обновление: Насколько я понял, у вас есть шум, следящие артефакты и другие махинации. Одним из подходов может быть использование численных методов для нахождения углов Эйлера (не кватернионов, кватернионы должны быть нормализованы, т. Е. Они имеют ненужную степень свободы для решателя) непосредственно из точек. Возможно, DownhillSolver или ConjGradSolver из резюме подойдут вам. Может быть полезно запустить его дважды, найти вращение, затем сбросить 10–20% точек с худшими прогнозами, а затем снова решить хорошие 80–90% точек.

Обновление 2 см. Рис. enter image description here Зеленые линии - это фактические движения двух точек как части вращения сферы. Очевидно, они вращаются вокруг одной оси, но не вдоль больших кругов. Красные линии - это вращения вдоль больших кругов между этими парами точек, найденные по вашей неправильно примененной формуле. Синие пунктирные линии - оси красных вращений. Надеюсь, теперь вы понимаете, почему вы не можете применить формулу.

...