Я нашел хороший ответ здесь:
http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html
Я адаптировал код под свои нужды, и он работает довольно хорошо!
Для двух кватернионов qa, qb это даст вам интерполяцию и экстраполяцию по одной и той же формуле. t - это количество интерполяции / экстраполяции, t 0,1 = 0,1 пути от qa-> qb, t = -1 -> экстраполировать весь шаг назад от qa-> qb и т. д.
Я использовал самописные функции, чтобы разрешить использование quaternions / axisAngle с opencv cv :: Mat, но я бы, вероятно, выбрал для этого Eigen
Quat qc = QuaternionMultiply(qb, QuaternionInverse(qa)); // rot is the rotation from qa to qb
AxisAngle axisAngleC = QuaternionToAxisAngle(qc); // find axis-angle representation
double ang = axisAngleC.angle; //axis will remain the same, changes apply to the angle
if (ang > M_PI) ang -= 2.0*M_PI; // assume rotation to take the shortest path
ang = fmod(ang * t,2.0*M_PI); // multiply angle by the interpolation/extrapolation factor and remove multiples of 2PI
axisAngleC.angle = ang;
return QuaternionMultiply(AxisAngleToQuaternion(axisAngleC),qa); // combine with first rotation