OpenCV 4.11.0
开源计算机视觉
|
#include <opencv2/core/dualquaternion.hpp>
公有成员函数 | |
DualQuat () | |
DualQuat (const _Tp w, const _Tp x, const _Tp y, const _Tp z, const _Tp w_, const _Tp x_, const _Tp y_, const _Tp z_) | |
由八个相同类型的数字创建。 | |
DualQuat (const Vec< _Tp, 8 > &q) | |
由双精度或浮点向量创建。 | |
DualQuat< _Tp > | conjugate () const |
返回对偶四元数的共轭。 | |
_Tp | dot (DualQuat< _Tp > p) const |
返回两个对偶四元数的点积。 | |
DualQuat< _Tp > | exp () const |
返回指数函数的值。 | |
Quat< _Tp > | getDualPart () const |
返回一个表示对偶四元数对偶部分的四元数。createFromQuat() 中定义了对偶部分。 | |
Quat< _Tp > | getRealPart () const |
返回一个表示对偶四元数实数部分的四元数。createFromQuat() 中定义了实数部分。 | |
Quat< _Tp > | getRotation (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回四元数形式的旋转。 | |
Vec< _Tp, 3 > | getTranslation (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回平移向量。在这个对偶四元数 σ 中的旋转 r 在平移 t 之前应用。对偶四元数 σ 定义为 | |
DualQuat< _Tp > | inv (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
如果 σ = p + εq 是一个对偶四元数,p 不为零,则逆对偶四元数为 | |
DualQuat< _Tp > | log (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回对数函数的值。 | |
DualQuat< _Tp > | norm () const |
返回对偶四元数 σ = p + εq 的范数 ||σ||。 | |
DualQuat< _Tp > | normalize () const |
返回一个标准化的对偶四元数。对偶四元数可以表示为 | |
DualQuat< _Tp > | operator* (const DualQuat< _Tp > &) const |
两个对偶四元数 q 和 p 的乘法运算符。将运算符两侧的值相乘。 | |
DualQuat< _Tp > | operator*= (const _Tp s) |
四元数和标量的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
DualQuat< _Tp > & | operator*= (const DualQuat< _Tp > &) |
两个四元数的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
DualQuat< _Tp > | operator+ (const DualQuat< _Tp > &) const |
两个对偶四元数 p 和 q 的加法运算符。它返回一个新的对偶四元数,其每个值都是 pi 和 qi 的和。 | |
DualQuat< _Tp > & | operator+= (const DualQuat< _Tp > &) |
两个对偶四元数 p 和 q 的加法赋值运算符。它将右操作数添加到左操作数,并将结果赋值给左操作数。 | |
DualQuat< _Tp > | operator- () const |
返回相反的对偶四元数 -p,满足 p + (-p) = 0。 | |
DualQuat< _Tp > | operator- (const DualQuat< _Tp > &) const |
两个对偶四元数 p 和 q 的减法运算符。它返回一个新的对偶四元数,其每个值都是 pi 和 -qi 的和。 | |
DualQuat< _Tp > & | operator-= (const DualQuat< _Tp > &) |
两个对偶四元数 p 和 q 的减法赋值运算符。它从左操作数中减去右操作数,并将结果赋值给左操作数。 | |
DualQuat< _Tp > | operator/ (const _Tp s) const |
对偶四元数和标量的除法运算符。它将左操作数除以右操作数,并将结果赋值给左操作数。 | |
DualQuat< _Tp > | operator/ (const DualQuat< _Tp > &) const |
两个对偶四元数 p 和 q 的除法运算符。将左操作数除以右操作数。 | |
Quat< _Tp > & | operator/= (const _Tp s) |
对偶四元数和标量的除法赋值运算符。它将左操作数除以右操作数,并将结果赋值给左操作数。 | |
DualQuat< _Tp > & | operator/= (const DualQuat< _Tp > &) |
两个对偶四元数 p 和 q 的除法赋值运算符;它将左操作数除以右操作数并将结果赋值给左操作数。 | |
bool | operator== (const DualQuat< _Tp > &) const |
如果两个对偶四元数 p 和 q 近似相等,则返回 true,即当每个 \(p_i\) 和 \(q_i\) 的绝对值小于 CV_DUAL_QUAT_EPS 时。 | |
DualQuat< _Tp > | power (const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回 \(p^t\) 的值,其中 p 是一个对偶四元数。这可以计算为 | |
DualQuat< _Tp > | power (const DualQuat< _Tp > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回 \(p^q\) 的值,其中 p 和 q 是对偶四元数。这可以计算为 | |
Affine3< _Tp > | toAffine3 (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
将此对偶四元数转换为 Affine3 的实例。 | |
Matx< _Tp, 4, 4 > | toMat (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
将此对偶四元数转换为矩阵形式的仿射变换矩阵,参见 createFromMat()。 | |
Vec< _Tp, 8 > | toVec () const |
将此对偶四元数转换为向量。 | |
静态公共成员函数 | |
static DualQuat< _Tp > | createFromAffine3 (const Affine3< _Tp > &R) |
从仿射矩阵创建对偶四元数。仿射矩阵的定义可以参考 createFromMat() | |
static DualQuat< _Tp > | createFromAngleAxisTrans (const _Tp angle, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &translation) |
从旋转角 \(\theta\)、旋转轴 \(\boldsymbol{u}\) 和平移 \(\boldsymbol{t}\) 创建一个对偶四元数。它生成形式为 | |
static DualQuat< _Tp > | createFromMat (InputArray _R) |
将此对偶四元数转换为仿射变换矩阵 \(M\)。对偶四元数由旋转 \(r=[a,b,c,d]\) 和平移 \(t=[\Delta x,\Delta y,\Delta z]\) 组成。仿射变换矩阵 \(M\) 的形式为。 | |
static DualQuat< _Tp > | createFromPitch (const _Tp angle, const _Tp d, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &moment) |
对偶四元数是形式为的向量。 | |
static DualQuat< _Tp > | createFromQuat (const Quat< _Tp > &realPart, const Quat< _Tp > &dualPart) |
从两个相同类型的四元数 p 和 q 创建对偶四元数。对偶四元数 \(\sigma\) 的形式为 | |
static DualQuat< _Tp > | dqblend (const DualQuat< _Tp > &q1, const DualQuat< _Tp > &q2, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
对偶四元数线性混合 (DQB) 方法用于计算对偶四元数 \(q_1\) 和 \(q_2\) 之间的变换,可以定义为 | |
template<int cn> | |
static DualQuat< _Tp > | gdqblend (const Vec< DualQuat< _Tp >, cn > &dualquat, InputArray weights, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
广义对偶四元数线性混合适用于两个以上的刚体变换。如果这些变换表示为具有凸权重 \(w = (w_1,...,w_n)\) 的单位对偶四元数 \(q_1,...,q_n\),则广义 DQB 简化为。 | |
static DualQuat< _Tp > | gdqblend (InputArray dualquat, InputArray weights, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
广义对偶四元数线性混合适用于两个以上的刚体变换。如果这些变换表示为具有凸权重 \(w = (w_1,...,w_n)\) 的单位对偶四元数 \(q_1,...,q_n\),则广义 DQB 简化为。 | |
static DualQuat< _Tp > | sclerp (const DualQuat< _Tp > &q1, const DualQuat< _Tp > &q2, const _Tp t, bool directChange=true, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
螺旋线性插值 (ScLERP) 是对偶四元数球面线性插值的扩展。如果 \(\sigma_1\) 和 \(\sigma_2\) 是表示初始和最终姿态的两个对偶四元数。ScLERP 函数的插值可以定义为 | |
公共属性 | |
_Tp | w |
_Tp | w_ |
_Tp | x |
_Tp | x_ |
_Tp | y |
_Tp | y_ |
_Tp | z |
_Tp | z_ |
静态公共属性 | |
静态 constexpr _Tp | CV_DUAL_QUAT_EPS = (_Tp)1.e-6 |
友元 | |
template<typename T > | |
DualQuat< T > | conjugate (const DualQuat< T > &dq) |
返回对偶四元数的共轭。 | |
template<typename T > | |
DualQuat< T > | cv::operator* (const DualQuat< T > &, const T s) |
双四元数与标量的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
template<typename T > | |
DualQuat< T > | cv::operator* (const T s, const DualQuat< T > &) |
标量与双四元数的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
template<typename T > | |
DualQuat< T > | cv::operator+ (const DualQuat< T > &, const T s) |
双四元数与标量的加法运算符。将右操作数加到左操作数。 | |
template<typename T > | |
DualQuat< T > | cv::operator+ (const T s, const DualQuat< T > &) |
标量与双四元数的加法运算符。将右操作数加到左操作数。 | |
template<typename T > | |
DualQuat< T > | cv::operator- (const DualQuat< T > &, const T s) |
双四元数与标量的减法运算符。从左操作数减去右操作数。 | |
template<typename T > | |
DualQuat< T > | cv::operator- (const T s, const DualQuat< T > &) |
标量与双四元数的减法运算符。从右操作数减去左操作数。 | |
template<typename S > | |
std::ostream & | cv::operator<< (std::ostream &, const DualQuat< S > &) |
template<typename T > | |
DualQuat< T > | exp (const DualQuat< T > &dq) |
返回指数函数的值。 | |
template<typename T > | |
DualQuat< T > | inv (const DualQuat< T > &dq, QuatAssumeType assumeUnit) |
如果 σ = p + εq 是一个对偶四元数,p 不为零,则逆对偶四元数为 | |
template<typename T > | |
DualQuat< T > | log (const DualQuat< T > &dq, QuatAssumeType assumeUnit) |
返回对数函数的值。 | |
template<typename T > | |
DualQuat< T > | power (const DualQuat< T > &dq, const T t, QuatAssumeType assumeUnit) |
返回 \(p^t\) 的值,其中 p 是一个对偶四元数。这可以计算为 | |
template<typename T > | |
DualQuat< T > | power (const DualQuat< T > &p, const DualQuat< T > &q, QuatAssumeType assumeUnit) |
返回 \(p^q\) 的值,其中 p 和 q 是对偶四元数。这可以计算为 | |
双四元数用于同时描述旋转和平移,而普通四元数只能描述旋转。它可以用于最短路径姿态插值、局部姿态优化或体积变形。更多细节可以参考:
单位双四元数通常表示为:
\[ \begin{equation} \begin{split} \sigma &= \left(r+\frac{\epsilon}{2}tr\right)\\ &= [w, x, y, z, w\_, x\_, y\_, z\_] \end{split} \end{equation} \]
其中\(r, t\)分别表示旋转(普通单位四元数)和平移(纯普通四元数)。
由两个四元数组成的通用双四元数通常表示为:
\[ \sigma = p + \epsilon q \]
其中引入的双单位\(\epsilon\)满足\(\epsilon^2 = \epsilon^3 =...=0\),而\(p, q\)是四元数。
或者,双四元数也可以解释为四个分量,它们都是双数
\[ \sigma = \hat{q}_w + \hat{q}_xi + \hat{q}_yj + \hat{q}_zk \]
如果我们将\(\hat{q}_x, \hat{q}_y\)和\(\hat{q}_z\)设置为0,则双四元数将转换为双数。参见normalize()。
如果要创建双四元数,可以使用:
点\(v=(x, y, z)\) 的对偶四元数形式为\([1+\epsilon v]=[1,0,0,0,0,x,y,z]\)。在对偶四元数\(\sigma\) 下,点\(v_1\) 到点\(v_2\) 的变换为
\[ 1 + \epsilon v_2 = \sigma * (1 + \epsilon v_1) * \sigma^{\star} \]
其中\(\sigma^{\star}=p^*-\epsilon q^*.\)
普吕克坐标\(\hat{l}, m\) 定义的直线由对偶四元数\(l=\hat{l}+\epsilon m\)表示。要变换一条直线,
\[l_2 = \sigma * l_1 * \sigma^*,\]
其中\(\sigma=r+\frac{\epsilon}{2}rt\) 和 \(\sigma^*=p^*+\epsilon q^*\).
要提取Vec<double, 8>或Vec<float, 8>,请参见toVec();
要提取仿射变换矩阵,请参见toMat();
要提取Affine3实例,请参见toAffine3();
如果需要插值两个四元数\(q_0, q_1\),可以使用sclerp()
对于需要混合多个(超过两个)对偶四元数的情况,可以使用带有相应权重的广义线性对偶四元数混合,即 gdqblend()。
cv::DualQuat< _Tp >::DualQuat | ( | ) |
cv::DualQuat< _Tp >::DualQuat | ( | const _Tp | w, |
const _Tp | x, | ||
const _Tp | y, | ||
const _Tp | z, | ||
const _Tp | w_, | ||
const _Tp | x_, | ||
const _Tp | y_, | ||
const _Tp | z_ ) |
由八个相同类型的数字创建。
cv::DualQuat< _Tp >::DualQuat | ( | const Vec< _Tp, 8 > & | q | ) |
由双精度或浮点向量创建。
DualQuat< _Tp > cv::DualQuat< _Tp >::conjugate | ( | ) | const |
返回对偶四元数的共轭。
\[ \begin{equation} \begin{split} \sigma^* &= (p + \epsilon q)^* &= (p^* + \epsilon q^*) \end{split} \end{equation} \]
|
静态 |
从仿射矩阵创建对偶四元数。仿射矩阵的定义可以参考 createFromMat()
|
静态 |
从旋转角 \(\theta\)、旋转轴 \(\boldsymbol{u}\) 和平移 \(\boldsymbol{t}\) 创建一个对偶四元数。它生成形式为
\[\begin{equation} \begin{split} \sigma &= r + \frac{\epsilon}{2}\boldsymbol{t}r \\ &= [\cos(\frac{\theta}{2}), \boldsymbol{u}\sin(\frac{\theta}{2})] + \frac{\epsilon}{2}[0, \boldsymbol{t}][[\cos(\frac{\theta}{2}), \boldsymbol{u}\sin(\frac{\theta}{2})]]\\ &= \cos(\frac{\theta}{2}) + \boldsymbol{u}\sin(\frac{\theta}{2}) + \frac{\epsilon}{2}(-(\boldsymbol{t} \cdot \boldsymbol{u})\sin(\frac{\theta}{2}) + \boldsymbol{t}\cos(\frac{\theta}{2}) + \boldsymbol{u} \times \boldsymbol{t} \sin(\frac{\theta}{2})). \end{split} \end{equation}\]
角度 | 旋转角度。 |
轴 | 旋转轴。 |
平移 | 一个长度为3的向量。 |
将此对偶四元数转换为仿射变换矩阵 \(M\)。对偶四元数由旋转 \(r=[a,b,c,d]\) 和平移 \(t=[\Delta x,\Delta y,\Delta z]\) 组成。仿射变换矩阵 \(M\) 的形式为。
\[ \begin{bmatrix} 1-2(e_2^2 +e_3^2) &2(e_1e_2-e_0e_3) &2(e_0e_2+e_1e_3) &\Delta x\\ 2(e_0e_3+e_1e_2) &1-2(e_1^2+e_3^2) &2(e_2e_3-e_0e_1) &\Delta y\\ 2(e_1e_3-e_0e_2) &2(e_0e_1+e_2e_3) &1-2(e_1^2-e_2^2) &\Delta z\\ 0&0&0&1 \end{bmatrix} \]
如果 A 是一个由 n 个待转换点组成的矩阵,则可以通过以下方式实现:
\[ new\_A = M * A \]
其中 A 的形式为
\[ \begin{bmatrix} x_0& x_1& x_2&...&x_n\\ y_0& y_1& y_2&...&y_n\\ z_0& z_1& z_2&...&z_n\\ 1&1&1&...&1 \end{bmatrix} \]
其中相同的下标表示相同的点。A 的大小应为 \([4,n]\) 。矩阵 new_A 的大小相同。
_R | 表示旋转和平移的 4x4 矩阵。 |
|
静态 |
对偶四元数是形式为的向量。
\[ \begin{equation} \begin{split} \sigma &=\boldsymbol{p} + \epsilon \boldsymbol{q}\\ &= \cos\hat{\frac{\theta}{2}}+\overline{\hat{l}}\sin\frac{\hat{\theta}}{2} \end{split} \end{equation} \]
其中 \(\hat{\theta}\) 是对偶角,\(\overline{\hat{l}}\) 是对偶轴
\[ \hat{\theta}=\theta + \epsilon d,\\ \overline{\hat{l}}= \hat{l} +\epsilon m. \]
在此表示中,\(\theta\) 是旋转角,\((\hat{l},m)\) 是螺旋轴,d 是沿轴的平移距离。
角度 | 旋转角度。 |
d | 沿旋转轴的平移。 |
轴 | 由四元数表示的旋转轴,其中 w = 0。 |
矩 | 线的矩,它应该与轴正交。 |
|
静态 |
从两个相同类型的四元数 p 和 q 创建对偶四元数。对偶四元数 \(\sigma\) 的形式为
\[\sigma = p + \epsilon q\]
其中 p 和 q 定义如下
\[\begin{equation} \begin{split} p &= w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\\ q &= w\_ + x\_\boldsymbol{i} + y\_\boldsymbol{j} + z\_\boldsymbol{k}. \end{split} \end{equation} \]
p 和 q 分别是实部和对偶部。
实部 | 一个四元数,双四元数的实部。 |
对偶部 | 一个四元数,双四元数的对偶部。 |
返回两个对偶四元数的点积。
p | 另一个双四元数。 |
|
静态 |
对偶四元数线性混合 (DQB) 方法用于计算对偶四元数 \(q_1\) 和 \(q_2\) 之间的变换,可以定义为
\[ DQB(t;{\boldsymbol{q}}_1,{\boldsymbol{q}}_2)= \frac{(1-t){\boldsymbol{q}}_1+t{\boldsymbol{q}}_2}{||(1-t){\boldsymbol{q}}_1+t{\boldsymbol{q}}_2||}. \]
其中 \(q_1\) 和 \(q_2\) 是表示输入变换的单位双四元数。如果您想使用适用于两个以上刚性变换的 DQB,请参见 gdqblend
q1 | 表示输入变换的单位双四元数。 |
q2 | 表示输入变换的单位双四元数。 |
t | 参数 \(t\in[0,1]\)。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
DualQuat< _Tp > cv::DualQuat< _Tp >::exp | ( | ) | const |
返回指数函数的值。
|
静态 |
广义对偶四元数线性混合适用于两个以上的刚体变换。如果这些变换表示为具有凸权重 \(w = (w_1,...,w_n)\) 的单位对偶四元数 \(q_1,...,q_n\),则广义 DQB 简化为。
\[ gDQB(\boldsymbol{w};{\boldsymbol{q}}_1,...,{\boldsymbol{q}}_n)=\frac{w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n} {||w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n||}. \]
对偶四元数向量 | 对偶四元数向量 |
权重向量 | 权重向量,权重向量的尺寸应与对偶四元数向量相同,且权重应满足\(\sum_0^n w_{i} = 1\) 和 \(w_i>0\)。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则这些对偶四元数假定为单位四元数,此函数将节省一些计算。 |
|
静态 |
广义对偶四元数线性混合适用于两个以上的刚体变换。如果这些变换表示为具有凸权重 \(w = (w_1,...,w_n)\) 的单位对偶四元数 \(q_1,...,q_n\),则广义 DQB 简化为。
\[ gDQB(\boldsymbol{w};{\boldsymbol{q}}_1,...,{\boldsymbol{q}}_n)=\frac{w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n} {||w_1{\boldsymbol{q}}_1+...+w_n{\boldsymbol{q}}_n||}. \]
对偶四元数向量 | 具有8个通道和1行或1列的对偶四元数。 |
权重向量 | 权重向量,权重向量的尺寸应与对偶四元数向量相同,且权重应满足\(\sum_0^n w_{i} = 1\) 和 \(w_i>0\)。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则这些对偶四元数假定为单位四元数,此函数将节省一些计算。 |
Quat< _Tp > cv::DualQuat< _Tp >::getDualPart | ( | ) | const |
返回一个表示对偶四元数对偶部分的四元数。createFromQuat() 中定义了对偶部分。
Quat< _Tp > cv::DualQuat< _Tp >::getRealPart | ( | ) | const |
返回一个表示对偶四元数实数部分的四元数。createFromQuat() 中定义了实数部分。
Quat< _Tp > cv::DualQuat< _Tp >::getRotation | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回四元数形式的旋转。
Vec< _Tp, 3 > cv::DualQuat< _Tp >::getTranslation | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回平移向量。在这个对偶四元数 σ 中的旋转 r 在平移 t 之前应用。对偶四元数 σ 定义为
\[\begin{equation} \begin{split} \sigma &= p + \epsilon q \\ &= r + \frac{\epsilon}{2}{t}r. \end{split} \end{equation}\]
因此,平移可以按如下方式获得
\[t = 2qp^*.\]
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
DualQuat< _Tp > cv::DualQuat< _Tp >::inv | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
如果 σ = p + εq 是一个对偶四元数,p 不为零,则逆对偶四元数为
\[\sigma^{-1} = \frac{\sigma^*}{||\sigma||^2}, \]
或者等效地,
\[\sigma^{-1} = p^{-1} - \epsilon p^{-1}qp^{-1}.\]
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
DualQuat< _Tp > cv::DualQuat< _Tp >::log | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回对数函数的值。
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
DualQuat< _Tp > cv::DualQuat< _Tp >::norm | ( | ) | const |
返回对偶四元数 σ = p + εq 的范数 ||σ||。
\[ \begin{equation} \begin{split} ||\sigma|| &= \sqrt{\sigma * \sigma^*} \\ &= ||p|| + \epsilon \frac{p \cdot q}{||p||}. \end{split} \end{equation} \]
一般来说,非单位对偶四元数的范数是一个对偶数。为方便起见,我们以对偶四元数的形式返回它,即
\[ ||\sigma|| = [||p||, 0, 0, 0, \frac{p \cdot q}{||p||}, 0, 0, 0].\]
DualQuat< _Tp > cv::DualQuat< _Tp >::normalize | ( | ) | const |
返回一个标准化的对偶四元数。对偶四元数可以表示为
\[ \begin{equation} \begin{split} \sigma &= p + \epsilon q\\ &=||\sigma||\left(r+\frac{1}{2}tr\right) \end{split} \end{equation} \]
其中\(r, t\)分别表示旋转(普通四元数)和平移(纯普通四元数),\(||\sigma||\)是对偶四元数的范数(一个对偶数)。当且仅当以下条件成立时,对偶四元数为单位四元数
\[ ||p||=1, p \cdot q=0 \]
其中\(\cdot\)表示点积。归一化过程为
\[ \sigma_{u}=\frac{\sigma}{||\sigma||} \]
接下来,我们简单证明\(\sigma_u\)是一个单位对偶四元数
\[ \renewcommand{\Im}{\operatorname{Im}} \begin{equation} \begin{split} \sigma_{u}=\frac{\sigma}{||\sigma||}&=\frac{p + \epsilon q}{||p||+\epsilon\frac{p\cdot q}{||p||}}\\ &=\frac{p}{||p||}+\epsilon\left(\frac{q}{||p||}-p\frac{p\cdot q}{||p||^3}\right)\\ &=\frac{p}{||p||}+\epsilon\frac{1}{||p||^2}\left(qp^{*}-p\cdot q\right)\frac{p}{||p||}\\ &=\frac{p}{||p||}+\epsilon\frac{1}{||p||^2}\Im(qp^*)\frac{p}{||p||}.\\ \end{split} \end{equation} \]
正如预期的那样,实部是旋转,对偶部是纯四元数。
DualQuat< _Tp > cv::DualQuat< _Tp >::operator* | ( | 常量 DualQuat< _Tp > & | ) | const |
两个对偶四元数 q 和 p 的乘法运算符。将运算符两侧的值相乘。
对偶四元数乘法规则:对偶四元数可以写成四元数的有序对[A,B]。因此
\[ \begin{equation} \begin{split} p * q &= [A, B][C, D]\\ &=[AC, AD + BC] \end{split} \end{equation} \]
例如
四元数和标量的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
对偶四元数与标量相乘的规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. \end{split} \end{equation} \]
例如
两个四元数的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
对偶四元数乘法规则:对偶四元数可以写成四元数的有序对[A,B]。因此
\[ \begin{equation} \begin{split} p * q &= [A, B][C, D]\\ &=[AC, AD + BC] \end{split} \end{equation} \]
例如
DualQuat< _Tp > cv::DualQuat< _Tp >::operator- | ( | ) | const |
返回相反的对偶四元数 -p,满足 p + (-p) = 0。
例如
对偶四元数和标量的除法运算符。它将左操作数除以右操作数,并将结果赋值给左操作数。
对偶四元数除以标量的规则
\[ \begin{equation} \begin{split} p / s &= [w, x, y, z, w\_, x\_, y\_, z\_] / s\\ &=[w/s, x/s, y/s, z/s, w\_/s, x\_/s, y\_/s, z\_/s]. \end{split} \end{equation} \]
例如
对偶四元数和标量的除法赋值运算符。它将左操作数除以右操作数,并将结果赋值给左操作数。
对偶四元数除以标量的规则
\[ \begin{equation} \begin{split} p / s &= [w, x, y, z, w\_, x\_, y\_ ,z\_] / s\\ &=[w / s, x / s, y / s, z / s, w\_ / \space s, x\_ / \space s, y\_ / \space s, z\_ / \space s]. \end{split} \end{equation} \]
例如
bool cv::DualQuat< _Tp >::operator== | ( | 常量 DualQuat< _Tp > & | ) | const |
如果两个对偶四元数 p 和 q 近似相等,则返回 true,即当每个 \(p_i\) 和 \(q_i\) 的绝对值小于 CV_DUAL_QUAT_EPS 时。
DualQuat< _Tp > cv::DualQuat< _Tp >::power | ( | const _Tp | t, |
QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT ) const |
返回 \(p^t\) 的值,其中 p 是一个对偶四元数。这可以计算为
\[ p^t = \exp(t\ln p) \]
t | 幂函数的指数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
DualQuat< _Tp > cv::DualQuat< _Tp >::power | ( | 常量 DualQuat< _Tp > & | q, |
QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT ) const |
返回 \(p^q\) 的值,其中 p 和 q 是对偶四元数。这可以计算为
\[ p^q = \exp(q\ln p) \]
q | 一个对偶四元数 |
assumeUnit | 如果QUAT_ASSUME_UNIT,则此对偶四元数假定为单位对偶四元数,此函数将节省一些计算。 |
|
静态 |
螺旋线性插值 (ScLERP) 是对偶四元数球面线性插值的扩展。如果 \(\sigma_1\) 和 \(\sigma_2\) 是表示初始和最终姿态的两个对偶四元数。ScLERP 函数的插值可以定义为
\[ ScLERP(t;\sigma_1,\sigma_2) = \sigma_1 * (\sigma_1^{-1} * \sigma_2)^t, t\in[0,1] \]
q1 | 表示初始姿态的对偶四元数。 |
q2 | 表示最终姿态的对偶四元数。 |
t | 插值参数 |
directChange | 如果为真,则始终返回最短路径。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则此双四元数假定为单位双四元数,此函数将节省一些计算。 |
例如
Affine3< _Tp > cv::DualQuat< _Tp >::toAffine3 | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
将此对偶四元数转换为 Affine3 的实例。
Matx< _Tp, 4, 4 > cv::DualQuat< _Tp >::toMat | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
将此对偶四元数转换为矩阵形式的仿射变换矩阵,参见 createFromMat()。
Vec< _Tp, 8 > cv::DualQuat< _Tp >::toVec | ( | ) | const |
将此对偶四元数转换为向量。
|
friend |
返回对偶四元数的共轭。
\[ \begin{equation} \begin{split} \sigma^* &= (p + \epsilon q)^* &= (p^* + \epsilon q^*) \end{split} \end{equation} \]
dq | 一个对偶四元数。 |
|
friend |
双四元数与标量的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
对偶四元数与标量相乘的规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. \end{split} \end{equation} \]
例如
|
friend |
标量与双四元数的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
对偶四元数与标量相乘的规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z, w\_, x\_, y\_, z\_] * s\\ &=[w s, x s, y s, z s, w\_ \space s, x\_ \space s, y\_ \space s, z\_ \space s]. \end{split} \end{equation} \]
例如
|
friend |
双四元数与标量的加法运算符。将右操作数加到左操作数。
例如
|
friend |
标量与双四元数的加法运算符。将右操作数加到左操作数。
例如
|
friend |
双四元数与标量的减法运算符。从左操作数减去右操作数。
例如
|
friend |
标量与双四元数的减法运算符。从右操作数减去左操作数。
例如
|
friend |
返回指数函数的值。
dq | 一个对偶四元数。 |
|
friend |
如果 σ = p + εq 是一个对偶四元数,p 不为零,则逆对偶四元数为
\[\sigma^{-1} = \frac{\sigma^*}{||\sigma||^2}, \]
或者等效地,
\[\sigma^{-1} = p^{-1} - \epsilon p^{-1}qp^{-1}.\]
dq | 一个对偶四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则双四元数dq假定为单位双四元数,此函数将节省一些计算。 |
|
friend |
返回对数函数的值。
dq | 一个对偶四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则双四元数dq假定为单位双四元数,此函数将节省一些计算。 |
|
friend |
返回 \(p^t\) 的值,其中 p 是一个对偶四元数。这可以计算为
\[ p^t = \exp(t\ln p) \]
dq | 一个对偶四元数。 |
t | 幂函数的指数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则双四元数dq假定为单位双四元数,此函数将节省一些计算。 |
|
friend |
返回 \(p^q\) 的值,其中 p 和 q 是对偶四元数。这可以计算为
\[ p^q = \exp(q\ln p) \]
p | 一个对偶四元数。 |
q | 一个对偶四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则双四元数p假定为单位双四元数,此函数将节省一些计算。 |
|
staticconstexpr |
_Tp cv::DualQuat< _Tp >::w |
_Tp cv::DualQuat< _Tp >::w_ |
_Tp cv::DualQuat< _Tp >::x |
_Tp cv::DualQuat< _Tp >::x_ |
_Tp cv::DualQuat< _Tp >::y |
_Tp cv::DualQuat< _Tp >::y_ |
_Tp cv::DualQuat< _Tp >::z |
_Tp cv::DualQuat< _Tp >::z_ |