27#ifndef OPENCV_CORE_DUALQUATERNION_INL_HPP 
   28#define OPENCV_CORE_DUALQUATERNION_INL_HPP 
   30#ifndef OPENCV_CORE_DUALQUATERNION_HPP 
   31#error This is not a standalone header. Include dualquaternion.hpp instead. 
   43                      w(vw), 
x(vx), 
y(vy), z(vz), w_(_w), x_(_x), y_(_y), z_(_z){}
 
   47                                          w_(q[4]), x_(q[5]), y_(q[6]), z_(q[7]){}
 
   67    Quat<T> t{0, trans[0], trans[1], trans[2]};
 
   68    return createFromQuat(
r, t * 
r * 
T(0.5));
 
 
   75    if (_R.size() != 
Size(4, 4))
 
   81    Quat<T> trans(0, 
R.at<
T>(0, 3), 
R.at<
T>(1, 3), 
R.at<
T>(2, 3));
 
   82    return createFromQuat(
r, trans * 
r * 
T(0.5));
 
 
   88    return createFromMat(
R.matrix);
 
 
   94    T half_angle = 
angle * 
T(0.5), half_d = d * 
T(0.5);
 
   97    qmoment -= qaxis * axis.
dot(moment);
 
   99        half_d * 
std::cos(half_angle) * qaxis;
 
 
  106    return (
abs(w - q.
w) < CV_DUAL_QUAT_EPS && 
abs(
x - q.
x) < CV_DUAL_QUAT_EPS &&
 
  107            abs(
y - q.
y) < CV_DUAL_QUAT_EPS && 
abs(z - q.
z) < CV_DUAL_QUAT_EPS &&
 
  108            abs(w_ - q.
w_) < CV_DUAL_QUAT_EPS && 
abs(x_ - q.
x_) < CV_DUAL_QUAT_EPS &&
 
  109            abs(y_ - q.
y_) < CV_DUAL_QUAT_EPS && 
abs(z_ - q.
z_) < CV_DUAL_QUAT_EPS);
 
 
  121    return Quat<T>(w_, x_, y_, z_);
 
 
  140    T realNorm = real.
norm();
 
  142    if (realNorm < CV_DUAL_QUAT_EPS){
 
  145    return DualQuat<T>(realNorm, 0, 0, 0, real.
dot(dual) / realNorm, 0, 0, 0);
 
 
  153        return getRealPart();
 
  155    return getRealPart().normalize();
 
 
  161    Quat<T> trans = 
T(2.0) * (getDualPart() * getRealPart().inv(assumeUnit));
 
  162    return Vec<T, 3>{trans[1], trans[2], trans[3]};
 
 
  171    if (p_norm < CV_DUAL_QUAT_EPS)
 
  177    return createFromQuat(p_nr, q_nr - p_nr * p_nr.
dot(q_nr));
 
 
  183    return q.
w * w + q.
x * 
x + q.
y * 
y + q.
z * z + q.
w_ * w_ + q.
x_ * x_ + q.
y_ * y_ + q.
z_ * z_;
 
 
  189    return dq.
inv(assumeUnit);
 
 
  197    return createFromQuat(real.
inv(assumeUnit), -real.
inv(assumeUnit) * dual * real.
inv(assumeUnit));
 
 
  288    return DualQuat<T>(w / a, 
x / a, 
y / a, z / a, w_ / a, x_ / a, y_ / a, z_ / a);
 
  294    return *
this * q.inv();
 
  319template <
typename _Tp>
 
  326        std::cos(nv), -sinc_nv * q.
x,  -sinc_nv * q.
y,  -sinc_nv * q.
z,
 
  327        sinc_nv * q.
x, csiii_nv * q.
x * q.
x + sinc_nv, csiii_nv * q.
x * q.
y, csiii_nv * q.
x * q.
z,
 
  328        sinc_nv * q.
y, csiii_nv * q.
y * q.
x, csiii_nv * q.
y * q.
y + sinc_nv, csiii_nv * q.
y * q.
z,
 
  329        sinc_nv * q.
z, csiii_nv * q.
z * q.
x, csiii_nv * q.
z * q.
y, csiii_nv * q.
z * q.
z + sinc_nv
 
 
 
  346    return dq.
log(assumeUnit);
 
 
  354    return createFromQuat(plog, 
Quat<T>(jacob.
inv() * getDualPart().toVec()));
 
 
  360    return dq.
power(t, assumeUnit);
 
 
  366    return (t * log(assumeUnit)).
exp();
 
 
  372    return p.
power(q, assumeUnit);
 
 
  378    return (q * log(assumeUnit)).
exp();
 
 
  390    return Affine3<T>(toMat(assumeUnit));
 
 
  397    Vec<T, 3> translation = getTranslation(assumeUnit);
 
  398    rot44(0, 3) = translation[0];
 
  399    rot44(1, 3) = translation[1];
 
  400    rot44(2, 3) = translation[2];
 
 
  413    Quat<T> v0Real = v0.getRealPart();
 
  415    if (directChange && v1Real.
dot(v0Real) < 0)
 
 
  432    if (v1.getRotation(assumeUnit).dot(v2.
getRotation(assumeUnit)) < 0)
 
  434        return ((1 - t) * v1 - t * v2).normalize();
 
  436    return ((1 - t) * v1 + t * v2).normalize();
 
 
  444    Size dq_s = _dualquat.size();
 
  445    if (dq_s != _weight.size() || (dq_s.
height != 1 && dq_s.
width != 1))
 
  447        CV_Error(
Error::StsBadArg, 
"The size of weight must be the same as dualquat, both of them should be (1, n) or (n, 1)");
 
  449    Mat dualquat = _dualquat.getMat(), weight = _weight.getMat();
 
  453        for (
int i = 0; i < cn; ++i)
 
  460    for (
int i = 1; i < cn; ++i)
 
  463        dq_blend = dq_blend + dualquat.
at<
Vec<T, 8>>(i) * 
k * weight.at<
T>(i);
 
 
  478    for (
int i = 0; i < cn ; ++i)
 
  480        dualquat_mat.
at<
Vec<T, 8>>(i) = dualquat[i].toVec();
 
  482    return gdqblend(dualquat_mat, _weight, assumeUnit);
 
 
Definition dualquaternion.hpp:146
_Tp y_
Definition dualquaternion.hpp:165
Vec< _Tp, 3 > getTranslation(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
return the translation vector. The rotation  in this dual quaternion  is applied before translation ....
Definition dualquaternion.inl.hpp:159
friend DualQuat< T > cv::operator+(const T s, const DualQuat< T > &)
Addition operator of a scalar and a dual quaternions. Adds right hand operand from left hand operand.
static DualQuat< _Tp > createFromAffine3(const Affine3< _Tp > &R)
create dual quaternion from an affine matrix. The definition of affine matrix can refer to createFrom...
Definition dualquaternion.inl.hpp:86
_Tp y
Definition dualquaternion.hpp:165
DualQuat< _Tp > operator/(const _Tp s) const
Division operator of a dual quaternions and a scalar. It divides left operand with the right operand ...
Quat< _Tp > getRealPart() const
return a quaternion which represent the real part of dual quaternion. The definition of real part is ...
Definition dualquaternion.inl.hpp:113
static DualQuat< _Tp > createFromAngleAxisTrans(const _Tp angle, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &translation)
create a dual quaternion from a rotation angle , a rotation axis  and a translation ....
Definition dualquaternion.inl.hpp:64
_Tp w_
Definition dualquaternion.hpp:165
DualQuat< _Tp > operator-() const
Return opposite dual quaternion  which satisfies .
Definition dualquaternion.inl.hpp:207
friend DualQuat< T > power(const DualQuat< T > &dq, const T t, QuatAssumeType assumeUnit)
return the value of  where p is a dual quaternion. This could be calculated as:
Definition dualquaternion.inl.hpp:358
_Tp z_
Definition dualquaternion.hpp:165
static DualQuat< _Tp > gdqblend(const Vec< DualQuat< _Tp >, cn > &dualquat, InputArray weights, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT)
The generalized Dual Quaternion linear Blending works for more than two rigid transformations....
Affine3< _Tp > toAffine3(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
Transform this dual quaternion to a instance of Affine3.
Definition dualquaternion.inl.hpp:388
friend DualQuat< T > exp(const DualQuat< T > &dq)
return the value of exponential function value
Definition dualquaternion.inl.hpp:312
Vec< _Tp, 8 > toVec() const
Transform this dual quaternion to a vector.
Definition dualquaternion.inl.hpp:382
DualQuat< _Tp > & operator+=(const DualQuat< _Tp > &)
Addition assignment operator of two dual quaternions p and q. It adds right operand to the left opera...
Definition dualquaternion.inl.hpp:219
friend DualQuat< T > log(const DualQuat< T > &dq, QuatAssumeType assumeUnit)
return the value of logarithm function value
Definition dualquaternion.inl.hpp:344
_Tp x_
Definition dualquaternion.hpp:165
friend DualQuat< T > cv::operator*(const T s, const DualQuat< T > &)
Multiplication operator of a scalar and a dual quaternions. It multiplies right operand with the left...
Quat< _Tp > getDualPart() const
return a quaternion which represent the dual part of dual quaternion. The definition of dual part is ...
Definition dualquaternion.inl.hpp:119
_Tp dot(DualQuat< _Tp > p) const
return the dot product of two dual quaternion.
Definition dualquaternion.inl.hpp:181
static DualQuat< _Tp > createFromMat(InputArray _R)
Transform this dual quaternion to an affine transformation matrix . Dual quaternion consists of a rot...
Definition dualquaternion.inl.hpp:72
static DualQuat< _Tp > dqblend(const DualQuat< _Tp > &q1, const DualQuat< _Tp > &q2, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT)
The method of Dual Quaternion linear Blending(DQB) is to compute a transformation between dual quater...
Definition dualquaternion.inl.hpp:424
friend DualQuat< T > inv(const DualQuat< T > &dq, QuatAssumeType assumeUnit)
if  is a dual quaternion, p is not zero, the inverse dual quaternion is
Definition dualquaternion.inl.hpp:187
bool operator==(const DualQuat< _Tp > &) const
return true if two dual quaternions p and q are nearly equal, i.e. when the absolute value of each  a...
Definition dualquaternion.inl.hpp:104
_Tp x
Definition dualquaternion.hpp:165
DualQuat< _Tp > & operator-=(const DualQuat< _Tp > &)
Subtraction assignment operator of two dual quaternions p and q. It subtracts right operand from the ...
Definition dualquaternion.inl.hpp:261
DualQuat< _Tp > & operator*=(const DualQuat< _Tp > &)
Multiplication assignment operator of two quaternions. It multiplies right operand with the left oper...
friend DualQuat< T > conjugate(const DualQuat< T > &dq)
return the conjugate of a dual quaternion.
Definition dualquaternion.inl.hpp:125
static DualQuat< _Tp > createFromPitch(const _Tp angle, const _Tp d, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &moment)
A dual quaternion is a vector in form of.
Definition dualquaternion.inl.hpp:92
static DualQuat< _Tp > sclerp(const DualQuat< _Tp > &q1, const DualQuat< _Tp > &q2, const _Tp t, bool directChange=true, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT)
The screw linear interpolation(ScLERP) is an extension of spherical linear interpolation of dual quat...
Definition dualquaternion.inl.hpp:405
Matx< _Tp, 4, 4 > toMat(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
Transform this dual quaternion to a affine transformation matrix the form of matrix,...
Definition dualquaternion.inl.hpp:394
DualQuat< _Tp > norm() const
return the norm  of dual quaternion .
Definition dualquaternion.inl.hpp:137
_Tp z
Definition dualquaternion.hpp:165
Quat< _Tp > getRotation(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
return the rotation in quaternion form.
Definition dualquaternion.inl.hpp:149
DualQuat< _Tp > normalize() const
return a normalized dual quaternion. A dual quaternion can be expressed as
Definition dualquaternion.inl.hpp:166
_Tp w
Definition dualquaternion.hpp:165
DualQuat()
Definition dualquaternion.inl.hpp:39
static DualQuat< _Tp > createFromQuat(const Quat< _Tp > &realPart, const Quat< _Tp > &dualPart)
create Dual Quaternion from two same type quaternions p and q. A Dual Quaternion  has the form:
Definition dualquaternion.inl.hpp:50
DualQuat< _Tp > & operator/=(const DualQuat< _Tp > &)
Division assignment operator of two dual quaternions p and q; It divides left operand with the right ...
n-dimensional dense array class
Definition mat.hpp:812
_Tp & at(int i0=0)
Returns a reference to the specified array element.
Template class for small matrices whose type and size are known at compilation time.
Definition matx.hpp:100
Matx< _Tp, n, m > inv(int method=DECOMP_LU, bool *p_is_ok=NULL) const
invert the matrix
_Tp dot(const Matx< _Tp, m, n > &v) const
dot product computed with the default precision
Definition matx.inl.hpp:328
Definition quaternion.hpp:211
_Tp dot(Quat< _Tp > q) const
return the dot between quaternion  and this quaternion.
friend Quat< T > log(const Quat< T > &q, QuatAssumeType assumeUnit)
return the value of logarithm function.
static Quat< _Tp > createFromRotMat(InputArray R)
from a 3x3 rotation matrix.
_Tp z
Definition quaternion.hpp:1618
Quat< _Tp > normalize() const
return a normalized .
_Tp y
Definition quaternion.hpp:1618
friend Quat< T > inv(const Quat< T > &q, QuatAssumeType assumeUnit)
return  which is an inverse of  which satisfies .
friend Quat< T > exp(const Quat< T > &q)
return the value of exponential value.
_Tp x
Definition quaternion.hpp:1618
_Tp norm() const
return the norm of quaternion.
_Tp w
Definition quaternion.hpp:1618
static Quat< _Tp > createFromAngleAxis(const _Tp angle, const Vec< _Tp, 3 > &axis)
from an angle, axis. Axis will be normalized in this function. And it generates
Template class for specifying the size of an image or rectangle.
Definition types.hpp:335
_Tp height
the height
Definition types.hpp:363
_Tp width
the width
Definition types.hpp:362
Template class for short numerical vectors, a partial case of Matx.
Definition matx.hpp:369
InputArrayOfArrays InputArrayOfArrays InputOutputArray InputOutputArray InputOutputArray InputOutputArray Size InputOutputArray InputOutputArray T
Definition calib3d.hpp:1867
InputArrayOfArrays InputArrayOfArrays InputOutputArray InputOutputArray InputOutputArray InputOutputArray Size InputOutputArray R
Definition calib3d.hpp:1867
static String & operator<<(String &out, Ptr< Formatted > fmtd)
Definition core.hpp:3164
CV__DEBUG_NS_END typedef const _InputArray & InputArray
Definition mat.hpp:442
const CvArr * angle
Definition core_c.h:1194
CvArr double power
Definition core_c.h:1199
const CvArr const CvArr const CvArr * B
Definition core_c.h:1341
const CvArr CvArr * x
Definition core_c.h:1195
const CvArr * y
Definition core_c.h:1187
#define CV_MAT_DEPTH(flags)
Definition interface.h:83
#define CV_64FC(n)
Definition interface.h:128
#define CV_MAKETYPE(depth, cn)
Definition interface.h:85
softfloat abs(softfloat a)
Absolute value.
Definition softfloat.hpp:444
#define CV_Error(code, msg)
Call the error handler.
Definition base.hpp:320
QuatAssumeType
Unit quaternion flag.
Definition quaternion.hpp:39
@ QUAT_ASSUME_NOT_UNIT
Definition quaternion.hpp:46
@ QUAT_ASSUME_UNIT
Definition quaternion.hpp:52
CvRect r
Definition imgproc_c.h:984
CV_EXPORTS OutputArray int double double InputArray OutputArray int int bool double k
Definition imgproc.hpp:2133
@ StsBadArg
function arg/param is bad
Definition base.hpp:74
Matx< _Tp, 4, 4 > jacob_exp(const Quat< _Tp > &q)
Definition dualquaternion.inl.hpp:320
"black box" representation of the file storage associated with a file on disk.
Definition calib3d.hpp:441
DualQuat< T > inv(const DualQuat< T > &dq, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT)
Definition dualquaternion.inl.hpp:187
DualQuat< T > operator-(const DualQuat< T > &q, const T a)
Definition dualquaternion.inl.hpp:255
DualQuat< T > conjugate(const DualQuat< T > &dq)
Definition dualquaternion.inl.hpp:125
DualQuat< T > operator+(const T a, const DualQuat< T > &q)
Definition dualquaternion.inl.hpp:243
DualQuat< T > operator*(const T a, const DualQuat< T > &q)
Definition dualquaternion.inl.hpp:274
Definition traits.hpp:386