OpenCV 4.11.0
开源计算机视觉库
|
#include <opencv2/core/quaternion.hpp>
公共成员函数 | |
Quat () | |
Quat (_Tp w, _Tp x, _Tp y, _Tp z) | |
由四个数字构造。 | |
Quat (const Vec< _Tp, 4 > &coeff) | |
由Vec4d或Vec4f构造。 | |
Quat< _Tp > | acos () const |
返回此四元数的反余弦值,反余弦值可计算为 | |
Quat< _Tp > | acosh () const |
返回此四元数的反双曲余弦值,反双曲余弦值可计算为 | |
Quat< _Tp > | asin () const |
返回此四元数的反正弦值,反正弦值可计算为 | |
Quat< _Tp > | asinh () const |
返回此四元数的反双曲正弦值,反双曲正弦值可计算为 | |
void | assertNormal (_Tp eps=CV_QUAT_EPS) const |
如果此四元数不是单位四元数,则抛出错误。 | |
_Tp | at (size_t index) const |
获取元素的方法。 | |
Quat< _Tp > | atan () const |
返回此四元数的反正切值,反正切值可计算为 | |
Quat< _Tp > | atanh () const |
返回此四元数的反双曲正切值,反双曲正切值可计算为 | |
Quat< _Tp > | conjugate () const |
返回此四元数的共轭。 | |
Quat< _Tp > | cos () const |
返回此四元数的余弦值,余弦值可计算为 | |
Quat< _Tp > | cosh () const |
返回此四元数的双曲余弦值,双曲余弦值可计算为 | |
Quat< _Tp > | crossProduct (const Quat< _Tp > &q) const |
返回\(p = (a, b, c, d) = (a, \boldsymbol{u})\)和\(q = (w, x, y, z) = (w, \boldsymbol{v})\)之间的叉积。 | |
_Tp | dot (Quat< _Tp > q) const |
返回四元数\(q\)和此四元数的点积。 | |
Quat< _Tp > | exp () const |
返回指数值。 | |
_Tp | getAngle (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
获取四元数的角度,它返回旋转角度。 | |
Vec< _Tp, 3 > | getAxis (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
获取四元数的轴,它返回一个长度为3的向量。 | |
Quat< _Tp > | inv (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回\(q^{-1}\),它是满足\(q * q^{-1} = 1\)的\(q\)的逆。 | |
bool | isNormal (_Tp eps=CV_QUAT_EPS) const |
如果此四元数是单位四元数,则返回true。 | |
Quat< _Tp > | log (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回对数函数的值。 | |
_Tp | norm () const |
返回四元数的范数。 | |
Quat< _Tp > | normalize () const |
返回归一化的\(p\)。 | |
Quat< _Tp > | operator* (const Quat< _Tp > &) const |
两个四元数q和p的乘法运算符。将运算符两侧的值相乘。 | |
Quat< _Tp > & | operator*= (const _Tp s) |
四元数和标量的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
Quat< _Tp > & | operator*= (const Quat< _Tp > &) |
两个四元数q和p的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
Quat< _Tp > | operator+ (const Quat< _Tp > &) const |
两个四元数p和q的加法运算符。它返回一个新的四元数,每个值都是\(p_i\)和\(q_i\)的和。 | |
Quat< _Tp > & | operator+= (const Quat< _Tp > &) |
两个四元数p和q的加法赋值运算符。它将右操作数加到左操作数,并将结果赋值给左操作数。 | |
Quat< _Tp > | operator- () const |
返回相反的四元数\(-p\),满足\(p + (-p) = 0\)。 | |
Quat< _Tp > | operator- (const Quat< _Tp > &) const |
两个四元数p和q的减法运算符。它返回一个新的四元数,每个值都是\(p_i\)和\(-q_i\)的和。 | |
Quat< _Tp > & | operator-= (const Quat< _Tp > &) |
两个四元数p和q的减法赋值运算符。它从左操作数中减去右操作数,并将结果赋值给左操作数。 | |
Quat< _Tp > | operator/ (const _Tp s) const |
四元数与标量的除法运算符。它将左操作数除以右操作数,并将结果赋给左操作数。 | |
Quat< _Tp > | operator/ (const Quat< _Tp > &) const |
两个四元数 p 和 q 的除法运算符。将左操作数除以右操作数。 | |
Quat< _Tp > & | operator/= (const _Tp s) |
四元数与标量的除法赋值运算符。它将左操作数除以右操作数,并将结果赋给左操作数。 | |
Quat< _Tp > & | operator/= (const Quat< _Tp > &) |
两个四元数 p 和 q 的除法赋值运算符;它将左操作数除以右操作数,并将结果赋给左操作数。 | |
bool | operator== (const Quat< _Tp > &) const |
如果两个四元数 p 和 q 近似相等,则返回 true,即当每个 \(p_i\) 和 \(q_i\) 的绝对值小于 CV_QUAT_EPS 时。 | |
_Tp & | operator[] (std::size_t n) |
const _Tp & | operator[] (std::size_t n) const |
Quat< _Tp > | power (const _Tp x, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回指数为 \(x\) 的幂函数的值。 | |
Quat< _Tp > | power (const Quat< _Tp > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回以四元数 \(q\) 为指数的幂函数的值。 | |
Quat< _Tp > | sin () const |
返回此四元数的正弦值,正弦值可计算为 | |
Quat< _Tp > | sinh () const |
返回此四元数的双曲正弦值,双曲正弦值可计算为:\(\sinh(p) = \sin(w)\cos(||\boldsymbol{v}||) + \cosh(w)\frac{v}{||\boldsymbol{v}||}\sin||\boldsymbol{v}||\) 其中 \(\boldsymbol{v} = [x, y, z].\) | |
Quat< _Tp > | sqrt (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
返回 \(\sqrt{q}\)。 | |
Quat< _Tp > | tan () const |
返回此四元数的正切值,正切值可计算为 | |
Quat< _Tp > | tanh () const |
返回此四元数的双曲正切值,双曲正切值可计算为 | |
Vec< _Tp, 3 > | toEulerAngles (QuatEnum::EulerAnglesType eulerAnglesType) |
将四元数 q 转换为欧拉角。 | |
Matx< _Tp, 3, 3 > | toRotMat3x3 (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
将四元数转换为 3x3 旋转矩阵。 | |
Matx< _Tp, 4, 4 > | toRotMat4x4 (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
将四元数转换为 4x4 旋转矩阵。 | |
Vec< _Tp, 3 > | toRotVec (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
将此四元数转换为旋转向量。 | |
Vec< _Tp, 4 > | toVec () const |
将此四元数转换为 Vec<T, 4>。 | |
静态公共成员函数 | |
static Quat< _Tp > | createFromAngleAxis (const _Tp angle, const Vec< _Tp, 3 > &axis) |
根据角度和轴创建四元数。轴在此函数中将被标准化。并且它生成 | |
static Quat< _Tp > | createFromEulerAngles (const Vec< _Tp, 3 > &angles, QuatEnum::EulerAnglesType eulerAnglesType) |
根据欧拉角创建四元数 | |
static Quat< _Tp > | createFromRotMat (InputArray R) |
根据 3x3 旋转矩阵创建四元数。 | |
static Quat< _Tp > | createFromRvec (InputArray rvec) |
根据旋转向量 \(r\) 创建四元数,\(r\) 的形式为 \(\theta \cdot \boldsymbol{u}\),其中 \(\theta\) 表示旋转角,\(\boldsymbol{u}\) 表示标准化的旋转轴。 | |
static Quat< _Tp > | createFromXRot (const _Tp theta) |
根据绕 X 轴旋转 \(\theta\) 角创建四元数。 | |
static Quat< _Tp > | createFromYRot (const _Tp theta) |
根据绕 Y 轴旋转 \(\theta\) 角创建四元数。 | |
static Quat< _Tp > | createFromZRot (const _Tp theta) |
根据绕 Z 轴旋转 \(\theta\) 角创建四元数。 | |
static Quat< _Tp > | interPoint (const Quat< _Tp > &q0, const Quat< _Tp > &q1, const Quat< _Tp > &q2, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
这是squad的一部分计算。计算每个三个四元数之间的中间四元数 \(s_i\)。 | |
static Quat< _Tp > | lerp (const Quat< _Tp > &q0, const Quat &q1, const _Tp t) |
使用线性插值 (Nlerp) 计算从 \(q_0\) 到 \(q_1\) 的插值。对于两个四元数,该插值曲线可以显示为 | |
static Quat< _Tp > | nlerp (const Quat< _Tp > &q0, const Quat &q1, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
使用归一化线性插值 (Nlerp) 计算从 \(q_0\) 到 \(q_1\) 的插值。它返回线性插值 (Lerp) 的归一化四元数。 | |
static Quat< _Tp > | slerp (const Quat< _Tp > &q0, const Quat &q1, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT, bool directChange=true) |
使用球面线性插值 (Slerp) 计算 \(q_0\) 和 \(q_1\) 之间的插值,其定义为 | |
static Quat< _Tp > | spline (const Quat< _Tp > &q0, const Quat< _Tp > &q1, const Quat< _Tp > &q2, const Quat< _Tp > &q3, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
计算由squad构建的\(C^1\)连续样条曲线在比例t处的四元数结果。这里的插值值在\(q_1\)和\(q_2\)之间。\(q_0\)和\(q_2\)用于确保\(C^1\)连续性。如果t=0,则返回\(q_1\),如果t=1,则返回\(q_2\)。 | |
static Quat< _Tp > | squad (const Quat< _Tp > &q0, const Quat< _Tp > &s0, const Quat< _Tp > &s1, const Quat< _Tp > &q1, const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT, bool directChange=true) |
计算使用球面四元数插值 (Squad) 对 \(q_0\), \(q_1\), \(q_2\), \(q_3\) 进行插值。这可以定义为 | |
公有属性 | |
_Tp | w |
_Tp | x |
_Tp | y |
_Tp | z |
静态公有属性 | |
static constexpr _Tp | CV_QUAT_CONVERT_THRESHOLD = (_Tp)1.e-6 |
static constexpr _Tp | CV_QUAT_EPS = (_Tp)1.e-6 |
友元函数 | |
template<typename T > | |
Quat< T > | acos (const Quat< T > &q) |
返回四元数q的反余弦值,反余弦值可以计算为 | |
template<typename T > | |
Quat< T > | acosh (const Quat< T > &q) |
返回四元数q的反双曲余弦值,反双曲余弦值可以计算为 | |
template<typename T > | |
Quat< T > | asin (const Quat< T > &q) |
返回四元数q的反正弦值,反正弦值可以计算为 | |
template<typename T > | |
Quat< T > | asinh (const Quat< T > &q) |
返回四元数q的反双曲正弦值,反双曲正弦值可以计算为 | |
template<typename T > | |
Quat< T > | atan (const Quat< T > &q) |
返回四元数q的反正切值,反正切值可以计算为 | |
template<typename T > | |
Quat< T > | atanh (const Quat< T > &q) |
返回四元数q的反双曲正切值,反双曲正切值可以计算为 | |
template<typename T > | |
Quat< T > | cos (const Quat< T > &q) |
返回四元数q的余弦值,余弦值可以计算为 | |
template<typename T > | |
Quat< T > | cosh (const Quat< T > &q) |
返回四元数q的双曲余弦值,双曲余弦值可以计算为 | |
template<typename T > | |
Quat< T > | crossProduct (const Quat< T > &p, const Quat< T > &q) |
返回\(p = (a, b, c, d) = (a, \boldsymbol{u})\)和\(q = (w, x, y, z) = (w, \boldsymbol{v})\)之间的叉积。 | |
template<typename T > | |
Quat< T > | cv::operator* (const Quat< T > &, const T s) |
四元数和标量的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
template<typename T > | |
Quat< T > | cv::operator* (const T s, const Quat< T > &) |
标量和四元数的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。 | |
template<typename T > | |
Quat< T > | cv::operator+ (const Quat< T > &, const T s) |
四元数和标量的加法运算符。将右操作数加到左操作数。 | |
template<typename T > | |
Quat< T > | cv::operator+ (const T s, const Quat< T > &) |
四元数和标量的加法运算符。将右操作数加到左操作数。 | |
template<typename T > | |
Quat< T > | cv::operator- (const Quat< T > &, const T s) |
四元数和标量的减法运算符。从左操作数减去右操作数。 | |
template<typename T > | |
Quat< T > | cv::operator- (const T s, const Quat< T > &) |
标量和四元数的减法运算符。从左操作数减去右操作数。 | |
template<typename S > | |
std::ostream & | cv::operator<< (std::ostream &, const Quat< S > &) |
template<typename T > | |
Quat< T > | exp (const Quat< T > &q) |
返回指数值。 | |
template<typename T > | |
Quat< T > | inv (const Quat< T > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
返回 \(q^{-1}\),它是 \(q\) 的逆,满足 \(q * q^{-1} = 1\)。 | |
template<typename T > | |
Quat< T > | log (const Quat< T > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
返回对数函数的值。 | |
template<typename T > | |
Quat< T > | power (const Quat< T > &p, const Quat< T > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
返回以四元数 \(q\) 为指数的幂函数的值。 | |
template<typename T > | |
Quat< T > | power (const Quat< T > &q, const T x, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
返回指数为 \(x\) 的幂函数的值。 | |
template<typename T > | |
Quat< T > | sin (const Quat< T > &q) |
返回四元数 q 的双曲正切值,正弦值可以计算为 | |
template<typename T > | |
Quat< T > | sinh (const Quat< T > &q) |
返回四元数 q 的双曲正弦值,双曲正弦值可以计算为 | |
template<typename T > | |
Quat< T > | sqrt (const Quat< T > &q, QuatAssumeType assumeUnit) |
返回 \(\sqrt{q}\)。 | |
template<typename T > | |
Quat< T > | tan (const Quat< T > &q) |
返回四元数 q 的正切值,正切值可以计算为 | |
template<typename T > | |
Quat< T > | tanh (const Quat< T > &q) |
返回四元数 q 的双曲正切值,双曲正切值可以计算为 | |
四元数是一种扩展复数的数系。它可以表示三维空间中的旋转。四元数通常表示为以下形式:
\[q = w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\]
\[q = [w, x, y, z]\]
\[q = [w, \boldsymbol{v}] \]
\[q = ||q||[\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\]
\[q = ||q||[\cos\psi, \boldsymbol{u}\sin\psi]\]
其中 \(\psi = \frac{\theta}{2}\),\(\theta\) 表示旋转角度,\(\boldsymbol{u} = [u_x, u_y, u_z]\) 表示归一化旋转轴,\(||q||\) 表示 \(q\) 的范数。
单位四元数通常表示旋转,其形式为:
\[q = [\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\]
要创建一个表示绕轴 \(\boldsymbol{u}\) 旋转一定角度 \(\theta\) 的四元数,可以使用:
您可以简单地使用四个相同类型的数字来创建一个四元数
或者使用 Vec4d 或 Vec4f 向量。
如果您已经有了 3x3 旋转矩阵 R,那么您可以使用
如果您已经有了旋转向量 rvec,其形式为 `angle * axis`,那么您可以使用
要从四元数中提取旋转矩阵,请参见 toRotMat3x3()
要提取 Vec4d 或 Vec4f,请参见 toVec()
要提取旋转向量,请参见 toRotVec()
如果需要插值两个四元数\(q_0, q_1\),可以使用 nlerp()、slerp() 或 spline()
spline 可以平滑地连接多个四元数的旋转
三种获取四元数中元素的方法
返回此四元数的反余弦值,反余弦值可计算为
\[\arccos(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arccosh(q)\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
返回此四元数的反正弦值,反正弦值可计算为
\[\arcsin(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arcsinh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
void cv::Quat< _Tp >::assertNormal | ( | _Tp | eps = CV_QUAT_EPS | ) | const |
获取元素的方法。
索引 | 范围为 [0, 3]。 |
四元数 q
q.at(0) 等效于 q.w,
q.at(1) 等效于 q.x,
q.at(2) 等效于 q.y,
q.at(3) 等效于 q.z。
返回此四元数的反正切值,反正切值可计算为
\[\arctan(q) = -\frac{\boldsymbol{v}}{||\boldsymbol{v}||}arctanh(q\frac{\boldsymbol{v}}{||\boldsymbol{v}||})\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
返回此四元数的反双曲正切值,反双曲正切值可计算为
\[arcsinh(q) = \frac{\ln(q + 1) - \ln(1 - q)}{2}\]
.
例如
返回此四元数的共轭。
\[q.conjugate() = (w, -x, -y, -z).\]
返回此四元数的余弦值,余弦值可计算为
\[\cos(p) = \cos(w) * \cosh(||\boldsymbol{v}||) - \sin(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}sinh(||\boldsymbol{v}||)\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
返回此四元数的双曲余弦值,双曲余弦值可计算为
\[\cosh(p) = \cosh(w) * \cos(||\boldsymbol{v}||) + \sinh(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}sin(||\boldsymbol{v}||)\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
|
静态 |
根据角度和轴创建四元数。轴在此函数中将被标准化。并且它生成
\[q = [\cos\psi, u_x\sin\psi,u_y\sin\psi, u_z\sin\psi].\]
其中 \(\psi = \frac{\theta}{2}\),\(\theta\) 是旋转角度。
|
静态 |
根据欧拉角创建四元数
可以通过组合欧拉旋转的四元数表示来从欧拉角生成四元数。
例如,如果我们按 X-Y-Z 的顺序使用内在旋转,\(\theta_1 \) 是绕 X 轴的旋转,\(\theta_2 \) 是绕 Y 轴的旋转,\(\theta_3 \) 是绕 Z 轴的旋转。最终的四元数 q 可以通过以下方式计算:
\[ {q} = q_{X, \theta_1} q_{Y, \theta_2} q_{Z, \theta_3}\]
其中 \( q_{X, \theta_1} \) 由 createFromXRot 创建,\( q_{Y, \theta_2} \) 由 createFromYRot 创建,\( q_{Z, \theta_3} \) 由 createFromZRot 创建。
角度 | 长度为 3 的向量中的欧拉角 |
eulerAnglesType | 转换欧拉角类型 |
根据 3x3 旋转矩阵创建四元数。
根据旋转向量 \(r\) 创建四元数,\(r\) 的形式为 \(\theta \cdot \boldsymbol{u}\),其中 \(\theta\) 表示旋转角,\(\boldsymbol{u}\) 表示标准化的旋转轴。
角度和轴可以很容易地推导为
\[ \begin{equation} \begin{split} \psi &= ||r||\\ \boldsymbol{u} &= \frac{r}{\theta} \end{split} \end{equation} \]
然后可以计算四元数:
\[q = [\cos\psi, \boldsymbol{u}\sin\psi]\]
其中 \(\psi = \theta / 2 \)
根据绕 X 轴旋转 \(\theta\) 角创建四元数。
\[q = \cos(\theta/2)+sin(\theta/2) i +0 j +0 k \]
根据绕 Y 轴旋转 \(\theta\) 角创建四元数。
\[q = \cos(\theta/2)+0 i+ sin(\theta/2) j +0k \]
根据绕 Z 轴旋转 \(\theta\) 角创建四元数。
\[q = \cos(\theta/2)+0 i +0 j +sin(\theta/2) k \]
返回\(p = (a, b, c, d) = (a, \boldsymbol{u})\)和\(q = (w, x, y, z) = (w, \boldsymbol{v})\)之间的叉积。
\[p \times q = \frac{pq- qp}{2}.\]
\[p \times q = \boldsymbol{u} \times \boldsymbol{v}.\]
\[p \times q = (cz-dy)i + (dx-bz)j + (by-xc)k. \]
例如
返回四元数\(q\)和此四元数的点积。
dot(p, q) 是衡量两个四元数接近程度的一个很好的指标。实际上,考虑单位四元数差 \(p^{-1} * q\),它的实部等于 dot(p, q)。同时,它的实部也等于 \(\cos(\beta/2)\),其中 \(\beta\) 是 p 和 q 之间的旋转角度。因此,dot(p, q) 越接近 1,它们之间的旋转角度就越小。
\[p \cdot q = p.w \cdot q.w + p.x \cdot q.x + p.y \cdot q.y + p.z \cdot q.z\]
q | 另一个四元数。 |
例如
_Tp cv::Quat< _Tp >::getAngle | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
获取四元数的角度,它返回旋转角度。
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 \[\psi = 2 *arccos(\frac{w}{||q||})\] |
例如
Vec< _Tp, 3 > cv::Quat< _Tp >::getAxis | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
获取四元数的轴,它返回一个长度为3的向量。
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 |
单位轴 \(\boldsymbol{u}\) 定义为
\[\begin{equation} \begin{split} \boldsymbol{v} &= \boldsymbol{u} ||\boldsymbol{v}||\\ &= \boldsymbol{u}||q||sin(\frac{\theta}{2}) \end{split} \end{equation}\]
其中 \(v=[x, y ,z]\),\(\theta\) 表示旋转角度。
例如
|
静态 |
这是squad的一部分计算。计算每个三个四元数之间的中间四元数 \(s_i\)。
\[s_i = q_i\exp(-\frac{\log(q^*_iq_{i+1}) + \log(q^*_iq_{i-1})}{4}).\]
q0 | 第一个四元数。 |
q1 | 第二个四元数。 |
q2 | 第三个四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设所有输入四元数都是单位四元数。否则,所有输入四元数将在函数内部进行归一化。 |
Quat< _Tp > cv::Quat< _Tp >::inv | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回\(q^{-1}\),它是满足\(q * q^{-1} = 1\)的\(q\)的逆。
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设四元数 q 为单位四元数,此函数将节省一些计算。 |
例如
bool cv::Quat< _Tp >::isNormal | ( | _Tp | eps = CV_QUAT_EPS | ) | const |
如果此四元数是单位四元数,则返回true。
eps | 归一化的容差范围。eps 可以定义为 |
\[eps = |1 - dotValue|\]
其中
\[dotValue = (this.w^2 + this.x^2 + this,y^2 + this.z^2).\]
当 dotValue 位于 \[1-eps, 1+eps] 范围内时,此函数将认为它已归一化。
|
静态 |
使用线性插值 (Nlerp) 计算从 \(q_0\) 到 \(q_1\) 的插值。对于两个四元数,该插值曲线可以显示为
\[Lerp(q_0, q_1, t) = (1 - t)q_0 + tq_1.\]
显然,如果我们将 \(q_0\) 和 \(q_1\) 看作二维空间中的向量,则 lerp 将沿直线进行插值。当 \(t = 0\) 时,它返回 \(q_0\),当 \(t= 1\) 时,它返回 \(q_1\)。通常情况下,\(t\) 应该在 \[0, 1] 范围内。
q0 | 用于线性插值的四元数。 |
q1 | 用于线性插值的四元数。 |
t | 向量 \(\overrightarrow{q_0q_1}\) 的百分比,范围为 [0, 1]。 |
Quat< _Tp > cv::Quat< _Tp >::log | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回对数函数的值。
\[\ln(q) = \ln||q|| + \frac{\boldsymbol{v}}{||\boldsymbol{v}||}\arccos\frac{w}{||q||}\]
. 其中 \(\boldsymbol{v} = [x, y, z].\)
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 |
例如
|
静态 |
使用归一化线性插值 (Nlerp) 计算从 \(q_0\) 到 \(q_1\) 的插值。它返回线性插值 (Lerp) 的归一化四元数。
\[ Nlerp(q_0, q_1, t) = \frac{(1 - t)q_0 + tq_1}{||(1 - t)q_0 + tq_1||}.\]
插值将始终选择最短路径,但不保证恒定速度。
q0 | 用于归一化线性插值的四元数。 |
q1 | 用于归一化线性插值的四元数。 |
t | 向量 \(\overrightarrow{q_0q_1}\) 的百分比,范围为 [0, 1]。 |
assumeUnit | 如果定义了QUAT_ASSUME_UNIT,则所有输入四元数都假定为单位四元数。否则,所有输入四元数将在函数内部进行归一化。 |
返回四元数的范数。
\[||q|| = \sqrt{w^2 + x^2 + y^2 + z^2}.\]
返回归一化的\(p\)。
\[p = \frac{q}{||q||}\]
其中 \(p\) 满足 \((p.x)^2 + (p.y)^2 + (p.z)^2 + (p.w)^2 = 1.\)
两个四元数q和p的乘法运算符。将运算符两侧的值相乘。
四元数乘法规则
\[ \begin{equation} \begin{split} p * q &= [p_0, \boldsymbol{u}]*[q_0, \boldsymbol{v}]\\ &=[p_0q_0 - \boldsymbol{u}\cdot \boldsymbol{v}, p_0\boldsymbol{v} + q_0\boldsymbol{u}+ \boldsymbol{u}\times \boldsymbol{v}]. \end{split} \end{equation} \]
其中 \(\cdot\) 表示点积,\(\times \) 表示叉积。
例如
四元数和标量的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
四元数与标量的乘法规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z] * s\\ &=[w * s, x * s, y * s, z * s]. \end{split} \end{equation} \]
例如
两个四元数q和p的乘法赋值运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
四元数乘法规则
\[ \begin{equation} \begin{split} p * q &= [p_0, \boldsymbol{u}]*[q_0, \boldsymbol{v}]\\ &=[p_0q_0 - \boldsymbol{u}\cdot \boldsymbol{v}, p_0\boldsymbol{v} + q_0\boldsymbol{u}+ \boldsymbol{u}\times \boldsymbol{v}]. \end{split} \end{equation} \]
其中 \(\cdot\) 表示点积,\(\times \) 表示叉积。
例如
返回相反的四元数\(-p\),满足\(p + (-p) = 0\)。
例如
四元数与标量的除法运算符。它将左操作数除以右操作数,并将结果赋给左操作数。
四元数与标量的除法规则
\[ \begin{equation} \begin{split} p / s &= [w, x, y, z] / s\\ &=[w/s, x/s, y/s, z/s]. \end{split} \end{equation} \]
例如
四元数与标量的除法赋值运算符。它将左操作数除以右操作数,并将结果赋给左操作数。
四元数与标量的除法规则
\[ \begin{equation} \begin{split} p / s &= [w, x, y, z] / s\\ &=[w / s, x / s, y / s, z / s]. \end{split} \end{equation} \]
例如
如果两个四元数 p 和 q 近似相等,则返回 true,即当每个 \(p_i\) 和 \(q_i\) 的绝对值小于 CV_QUAT_EPS 时。
Quat< _Tp > cv::Quat< _Tp >::power | ( | const _Tp | x, |
QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT ) const |
返回指数为 \(x\) 的幂函数的值。
\[q^x = ||q||(\cos(x\theta) + \boldsymbol{u}\sin(x\theta)).\]
x | 指数运算的指数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 |
例如
Quat< _Tp > cv::Quat< _Tp >::power | ( | const Quat< _Tp > & | q, |
QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT ) const |
返回以四元数 \(q\) 为指数的幂函数的值。
\[p^q = e^{q\ln(p)}.\]
q | 幂函数的指数四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 |
例如
返回此四元数的正弦值,正弦值可计算为
\[\sin(p) = \sin(w) * \cosh(||\boldsymbol{v}||) + \cos(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}\sinh(||\boldsymbol{v}||)\]
其中 \(\boldsymbol{v} = [x, y, z].\)
例如
返回此四元数的双曲正弦值,双曲正弦值可计算为:\(\sinh(p) = \sin(w)\cos(||\boldsymbol{v}||) + \cosh(w)\frac{v}{||\boldsymbol{v}||}\sin||\boldsymbol{v}||\) 其中 \(\boldsymbol{v} = [x, y, z].\)
例如
|
静态 |
使用球面线性插值 (Slerp) 计算 \(q_0\) 和 \(q_1\) 之间的插值,其定义为
\[ Slerp(q_0, q_1, t) = \frac{\sin((1-t)\theta)}{\sin(\theta)}q_0 + \frac{\sin(t\theta)}{\sin(\theta)}q_1\]
其中\(\theta\)可计算为
\[\theta=cos^{-1}(q_0\cdot q_1)\]
结果来自它们的范数都是单位向量。
q0 | 在Slerp中使用的四元数。 |
q1 | 在Slerp中使用的四元数。 |
t | 在[0, 1]范围内\(q_0\)和\(q_1\)之间角度的百分比。 |
assumeUnit | 如果为QUAT_ASSUME_UNIT,则所有输入四元数都假定为单位四元数。否则,所有输入四元数将在函数内部进行归一化。 |
directChange | 如果为QUAT_ASSUME_UNIT,插值将选择最近的路径。 |
|
静态 |
计算由squad构建的\(C^1\)连续样条曲线在比例t处的四元数结果。这里的插值值在\(q_1\)和\(q_2\)之间。\(q_0\)和\(q_2\)用于确保\(C^1\)连续性。如果t=0,则返回\(q_1\),如果t=1,则返回\(q_2\)。
q0 | 第一个输入四元数,以确保\(C^1\)连续性。 |
q1 | 第二个输入四元数。 |
q2 | 第三个输入四元数。 |
q3 | 第四个输入四元数,与\(q1\)用法相同。 |
t | 在[0, 1]范围内的比率。 |
assumeUnit | 如果为QUAT_ASSUME_UNIT,则\(q_0, q_1, q_2, q_3\)假定为单位四元数。否则,所有输入四元数将在函数内部进行归一化。 |
例如
如果有三个双四元数\(v_0, v_1, v_2\)等待插值。
比率为\(t_0\)的\(v_0\)和\(v_1\)之间的插值可以计算为
比率为\(t_0\)的\(v_1\)和\(v_2\)之间的插值可以计算为
Quat< _Tp > cv::Quat< _Tp >::sqrt | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
返回 \(\sqrt{q}\)。
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设此四元数为单位四元数,此函数将节省一些计算。 |
例如
|
静态 |
计算使用球面四元数插值 (Squad) 对 \(q_0\), \(q_1\), \(q_2\), \(q_3\) 进行插值。这可以定义为
\[Squad(q_i, s_i, s_{i+1}, q_{i+1}, t) = Slerp(Slerp(q_i, q_{i+1}, t), Slerp(s_i, s_{i+1}, t), 2t(1-t))\]
其中
\[s_i = q_i\exp(-\frac{\log(q^*_iq_{i+1}) + \log(q^*_iq_{i-1})}{4})\]
Squad表达式类似于\(B\acute{e}zier\)曲线,但使用球面线性插值而不是简单的线性插值。每个\(s_i\)需要由三个四元数计算。
q0 | 第一个四元数。 |
s0 | 第二个四元数。 |
s1 | 第三个四元数。 |
q1 | 第四个四元数。 |
t | 二次和线性插值的插值参数,范围为\([0, 1]\)。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设所有输入四元数都是单位四元数。否则,所有输入四元数将在函数内部进行归一化。 |
directChange | 如果为QUAT_ASSUME_UNIT,squad将找到最近的路径进行插值。 |
Vec< _Tp, 3 > cv::Quat< _Tp >::toEulerAngles | ( | QuatEnum::EulerAnglesType | eulerAnglesType | ) |
将四元数 q 转换为欧拉角。
当将四元数\(q = w + x\boldsymbol{i} + y\boldsymbol{j} + z\boldsymbol{k}\)转换为欧拉角时,旋转矩阵M可以计算为
\[ \begin{aligned} {M} &={\begin{bmatrix}1-2(y^{2}+z^{2})&2(xy-zx)&2(xz+yw)\\2(xy+zw)&1-2(x^{2}+z^{2})&2(yz-xw)\\2(xz-yw)&2(yz+xw)&1-2(x^{2}+y^{2})\end{bmatrix}}\end{aligned}.\]
另一方面,旋转矩阵可以由欧拉角得到。以使用内旋的欧拉角类型XYZ为例,θ₁、θ₂、θ₃是三个欧拉角,旋转矩阵R可由下式计算:
\[R =X(\theta_1)Y(\theta_2)Z(\theta_3) ={\begin{bmatrix}\cos\theta_{2}\cos\theta_{3}&-\cos\theta_{2}\sin\theta_{3}&\sin\theta_{2}\\\cos\theta_{1}\sin\theta_{3}+\cos\theta_{3}\sin\theta_{1}\sin\theta_{2}&\cos\theta_{1}\cos\theta_{3}-\sin\theta_{1}\sin\theta_{2}\sin\theta_{3}&-\cos\theta_{2}\sin\theta_{1}\\\sin\theta_{1}\sin\theta_{3}-\cos\theta_{1}\cos\theta_{3}\sin\theta_{2}&\cos\theta_{3}\sin\theta_{1}+\cos\theta_{1}\sin\theta_{2}\sin\theta_{3}&\cos\theta_{1}\cos\theta_{2}\end{bmatrix}}\]
旋转矩阵M和R相等。只要s₂≠1,通过比较两个矩阵的每个元素,解为\(\begin{cases} \theta_1 = \arctan2(-m_{23},m_{33})\\\theta_2 = \arcsin(m_{13}) \\\theta_3 = \arctan2(-m_{12},m_{11}) \end{cases}\).
当s₂=1或s₂=-1时,发生万向节死锁。函数将提示“警告:将发生万向节死锁。欧拉角不唯一。对于内旋,我们将第三个角设置为0;对于外旋,我们将第一个角设置为0”。
当s₂=1时,旋转矩阵R为\(R = {\begin{bmatrix}0&0&1\\\sin(\theta_1+\theta_3)&\cos(\theta_1+\theta_3)&0\\-\cos(\theta_1+\theta_3)&\sin(\theta_1+\theta_3)&0\end{bmatrix}}\).
在条件\(\begin{cases} \theta_1+\theta_3 = \arctan2(m_{21},m_{22})\\ \theta_2=\pi/2 \end{cases}\)下,解的数量是无限的。
我们设置θ₃=0,解为\(\begin{cases} \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \end{cases}\).
当s₂=-1时,旋转矩阵R为\(X_{1}Y_{2}Z_{3}={\begin{bmatrix}0&0&-1\\-\sin(\theta_1-\theta_3)&\cos(\theta_1-\theta_3)&0\\\cos(\theta_1-\theta_3)&\sin(\theta_1-\theta_3)&0\end{bmatrix}}\).
在条件\(\begin{cases} \theta_1+\theta_3 = \arctan2(m_{32},m_{22})\\ \theta_2=\pi/2 \end{cases}\)下,解的数量是无限的。
我们设置θ₃=0,解为\(\begin{cases}\theta_1=\arctan2(m_{32},m_{22}) \\ \theta_2=-\pi/2\\ \theta_3=0\end{cases}\).
由于sin θ∈[-1,1]且cos θ∈[-1,1],未归一化的四元数会造成计算问题。因此,此函数将首先对四元数进行归一化,并且不需要QuatAssumeType。
当发生万向节死锁时,对于内旋,我们将θ₃设置为0;对于外旋,我们将θ₁设置为0。
因此,对于每种欧拉角类型,我们可以得到如下表所示的解。
欧拉角类型 | 普通情况 | θ₂ = π/2 | θ₂ = -π/2 |
---|---|---|---|
INT_XYZ | \( \theta_1 = \arctan2(-m_{23},m_{33})\\\theta_2 = \arcsin(m_{13}) \\\theta_3= \arctan2(-m_{12},m_{11}) \) | \( \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{32},m_{22})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
INT_XZY | \( \theta_1 = \arctan2(m_{32},m_{22})\\\theta_2 = -\arcsin(m_{12}) \\\theta_3= \arctan2(m_{13},m_{11}) \) | \( \theta_1=\arctan2(m_{31},m_{33})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(-m_{23},m_{33})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
INT_YXZ | \( \theta_1 = \arctan2(m_{13},m_{33})\\\theta_2 = -\arcsin(m_{23}) \\\theta_3= \arctan2(m_{21},m_{22}) \) | \( \theta_1=\arctan2(m_{12},m_{11})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(-m_{12},m_{11})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
INT_YZX | \( \theta_1 = \arctan2(-m_{31},m_{11})\\\theta_2 = \arcsin(m_{21}) \\\theta_3= \arctan2(-m_{23},m_{22}) \) | \( \theta_1=\arctan2(m_{13},m_{33})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{13},m_{12})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
INT_ZXY | \( \theta_1 = \arctan2(-m_{12},m_{22})\\\theta_2 = \arcsin(m_{32}) \\\theta_3= \arctan2(-m_{31},m_{33}) \) | \( \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
INT_ZYX | \( \theta_1 = \arctan2(m_{21},m_{11})\\\theta_2 = \arcsin(-m_{31}) \\\theta_3= \arctan2(m_{32},m_{33}) \) | \( \theta_1=\arctan2(m_{23},m_{22})\\ \theta_2=\pi/2\\ \theta_3=0 \) | \( \theta_1=\arctan2(-m_{12},m_{22})\\ \theta_2=-\pi/2\\ \theta_3=0 \) |
EXT_XYZ | \( \theta_1 = \arctan2(m_{32},m_{33})\\\theta_2 = \arcsin(-m_{31}) \\\ \theta_3 = \arctan2(m_{21},m_{11})\) | \( \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{23},m_{22}) \) | \( \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{12},m_{22}) \) |
EXT_XZY | \( \theta_1 = \arctan2(-m_{23},m_{22})\\\theta_2 = \arcsin(m_{21}) \\\theta_3= \arctan2(-m_{31},m_{11})\) | \( \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{13},m_{33}) \) | \( \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{13},m_{12}) \) |
EXT_YXZ | \( \theta_1 = \arctan2(-m_{31},m_{33}) \\\theta_2 = \arcsin(m_{32}) \\\theta_3= \arctan2(-m_{12},m_{22})\) | \( \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{21},m_{11}) \) | \( \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{21},m_{11}) \) |
EXT_YZX | \( \theta_1 = \arctan2(m_{13},m_{11})\\\theta_2 = -\arcsin(m_{12}) \\\theta_3= \arctan2(m_{32},m_{22})\) | \( \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{31},m_{33}) \) | \( \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{23},m_{33}) \) |
EXT_ZXY | \( \theta_1 = \arctan2(m_{21},m_{22})\\\theta_2 = -\arcsin(m_{23}) \\\theta_3= \arctan2(m_{13},m_{33})\) | \( \theta_1= 0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{12},m_{11}) \) | \( \theta_1= 0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(-m_{12},m_{11}) \) |
EXT_ZYX | \( \theta_1 = \arctan2(-m_{12},m_{11})\\\theta_2 = \arcsin(m_{13}) \\\theta_3= \arctan2(-m_{23},m_{33})\) | \( \theta_1=0\\ \theta_2=\pi/2\\ \theta_3=\arctan2(m_{21},m_{22}) \) | \( \theta_1=0\\ \theta_2=-\pi/2\\ \theta_3=\arctan2(m_{32},m_{22}) \) |
欧拉角类型 | 普通情况 | θ₂ = 0 | θ₂ = π |
---|---|---|---|
INT_XYX | \( \theta_1 = \arctan2(m_{21},-m_{31})\\\theta_2 =\arccos(m_{11}) \\\theta_3 = \arctan2(m_{12},m_{13}) \) | \( \theta_1=\arctan2(m_{32},m_{33})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{23},m_{22})\\ \theta_2=\pi\\ \theta_3=0 \) |
INT_XZX | \( \theta_1 = \arctan2(m_{31},m_{21})\\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{13},-m_{12}) \) | \( \theta_1=\arctan2(m_{32},m_{33})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(-m_{32},m_{33})\\ \theta_2=\pi\\ \theta_3=0 \) |
INT_YXY | \( \theta_1 = \arctan2(m_{12},m_{32})\\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{21},-m_{23}) \) | \( \theta_1=\arctan2(m_{13},m_{11})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(-m_{31},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \) |
INT_YZY | \( \theta_1 = \arctan2(m_{32},-m_{12})\\\theta_2 = \arccos(m_{22}) \\\theta_3 =\arctan2(m_{23},m_{21}) \) | \( \theta_1=\arctan2(m_{13},m_{11})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{13},-m_{11})\\ \theta_2=\pi\\ \theta_3=0 \) |
INT_ZXZ | \( \theta_1 = \arctan2(-m_{13},m_{23})\\\theta_2 = \arccos(m_{33}) \\\theta_3 =\arctan2(m_{31},m_{32}) \) | \( \theta_1=\arctan2(m_{21},m_{22})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \) |
INT_ZYZ | \( \theta_1 = \arctan2(m_{23},m_{13})\\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(m_{32},-m_{31}) \) | \( \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=0\\ \theta_3=0 \) | \( \theta_1=\arctan2(m_{21},m_{11})\\ \theta_2=\pi\\ \theta_3=0 \) |
EXT_XYX | \( \theta_1 = \arctan2(m_{12},m_{13}) \\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{21},-m_{31})\) | \( \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{32},m_{33}) \) | \( \theta_1= 0\\ \theta_2=\pi\\ \theta_3= \arctan2(m_{23},m_{22}) \) |
EXT_XZX | \( \theta_1 = \arctan2(m_{13},-m_{12})\\\theta_2 = \arccos(m_{11}) \\\theta_3 = \arctan2(m_{31},m_{21})\) | \( \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{32},m_{33}) \) | \( \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(-m_{32},m_{33}) \) |
EXT_YXY | \( \theta_1 = \arctan2(m_{21},-m_{23})\\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{12},m_{32}) \) | \( \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{13},m_{11}) \) | \( \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(-m_{31},m_{11}) \) |
EXT_YZY | \( \theta_1 = \arctan2(m_{23},m_{21}) \\\theta_2 = \arccos(m_{22}) \\\theta_3 = \arctan2(m_{32},-m_{12}) \) | \( \theta_1= 0\\ \theta_2=0\\ \theta_3=\arctan2(m_{13},m_{11}) \) | \( \theta_1=0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{13},-m_{11}) \) |
EXT_ZXZ | \( \theta_1 = \arctan2(m_{31},m_{32}) \\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(-m_{13},m_{23})\) | \( \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{21},m_{22}) \) | \( \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{21},m_{11}) \) |
EXT_ZYZ | \( \theta_1 = \arctan2(m_{32},-m_{31})\\\theta_2 = \arccos(m_{33}) \\\theta_3 = \arctan2(m_{23},m_{13}) \) | \( \theta_1=0\\ \theta_2=0\\ \theta_3=\arctan2(m_{21},m_{11}) \) | \( \theta_1= 0\\ \theta_2=\pi\\ \theta_3=\arctan2(m_{21},m_{11}) \) |
eulerAnglesType | 转换欧拉角类型 |
Matx< _Tp, 3, 3 > cv::Quat< _Tp >::toRotMat3x3 | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
将四元数转换为 3x3 旋转矩阵。
assumeUnit | 如果 QUAT_ASSUME_UNIT 为真,则假设此四元数为单位四元数,此函数将节省一些计算。否则,此函数将首先规范化此四元数,然后进行变换。 |
\[\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 \end{bmatrix}\]
其中相同的下标表示一个点。A 的形状假定为 [3, n]。点矩阵 A 可以通过 toRotMat3x3() * A 旋转。结果也具有 3 行和 n 列。例如
Matx< _Tp, 4, 4 > cv::Quat< _Tp >::toRotMat4x4 | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
将四元数转换为 4x4 旋转矩阵。
assumeUnit | 如果 QUAT_ASSUME_UNIT 为真,则假设此四元数为单位四元数,此函数将节省一些计算。否则,此函数将首先规范化此四元数,然后进行变换。 |
操作类似于 toRotMat3x3,只是点矩阵应具有以下形式
\[\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\\ 0&0&0&...&0 \end{bmatrix}\]
Vec< _Tp, 3 > cv::Quat< _Tp >::toRotVec | ( | QuatAssumeType | assumeUnit = QUAT_ASSUME_NOT_UNIT | ) | const |
将此四元数转换为旋转向量。
assumeUnit | 如果 QUAT_ASSUME_UNIT 为真,则假设此四元数为单位四元数,此函数将节省一些计算。旋转向量 rVec 定义为 \[ rVec = [\theta v_x, \theta v_y, \theta v_z]\] 其中 \(\theta\) 表示旋转角度,\(\boldsymbol{v}\) 表示归一化的旋转轴。 |
例如
返回四元数q的余弦值,余弦值可以计算为
\[\cos(p) = \cos(w) * \cosh(||\boldsymbol{v}||) - \sin(w)\frac{\boldsymbol{v}}{||\boldsymbol{v}||}sinh(||\boldsymbol{v}||)\]
其中 \(\boldsymbol{v} = [x, y, z].\)
q | 一个四元数。 |
例如
|
友元 |
返回\(p = (a, b, c, d) = (a, \boldsymbol{u})\)和\(q = (w, x, y, z) = (w, \boldsymbol{v})\)之间的叉积。
\[p \times q = \frac{pq- qp}{2}\]
\[p \times q = \boldsymbol{u} \times \boldsymbol{v}\]
\[p \times q = (cz-dy)i + (dx-bz)j + (by-xc)k \]
例如
四元数和标量的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
四元数与标量的乘法规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z] * s\\ &=[w * s, x * s, y * s, z * s]. \end{split} \end{equation} \]
例如
标量和四元数的乘法运算符。它将右操作数与左操作数相乘,并将结果赋值给左操作数。
四元数与标量的乘法规则
\[ \begin{equation} \begin{split} p * s &= [w, x, y, z] * s\\ &=[w * s, x * s, y * s, z * s]. \end{split} \end{equation} \]
例如
四元数和标量的加法运算符。将右操作数加到左操作数。
例如
四元数和标量的加法运算符。将右操作数加到左操作数。
例如
四元数和标量的减法运算符。从左操作数减去右操作数。
例如
标量和四元数的减法运算符。从左操作数减去右操作数。
例如
|
友元 |
|
友元 |
返回 \(q^{-1}\),它是 \(q\) 的逆,满足 \(q * q^{-1} = 1\)。
q | 一个四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设四元数 q 为单位四元数,此函数将节省一些计算。 |
例如
|
友元 |
|
友元 |
返回以四元数 \(q\) 为指数的幂函数的值。
\[p^q = e^{q\ln(p)}.\]
p | 幂函数的底数四元数。 |
q | 幂函数的指数四元数。 |
assumeUnit | 如果QUAT_ASSUME_UNIT,则假设四元数\(p\)为单位四元数,此函数将节省一些计算。 |
例如
|
友元 |
返回指数为 \(x\) 的幂函数的值。
\[q^x = ||q||(cos(x\theta) + \boldsymbol{u}sin(x\theta))).\]
q | 一个四元数。 |
x | 指数运算的指数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设四元数 q 为单位四元数,此函数将节省一些计算。 |
例如
|
友元 |
返回 \(\sqrt{q}\)。
q | 一个四元数。 |
assumeUnit | 如果 QUAT_ASSUME_UNIT,则假设四元数 q 为单位四元数,此函数将节省一些计算。 |
例如