![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
#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_) | |
| 同じ型の8つの数値から生成する。 | |
| DualQuat (const Vec< _Tp, 8 > &q) | |
| double または float のベクトルから生成する。 | |
| DualQuat< _Tp > | conjugate () const |
| デュアルクォータニオンの共役を返す。 | |
| _Tp | dot (DualQuat< _Tp > p) const |
| 2つのデュアルクォータニオンの内積を返す。 | |
| 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 |
| 並進ベクトルを返す。このデュアルクォータニオン \(\sigma\) における回転 \(r\) は並進 \(t\) よりも前に適用される。デュアルクォータニオン \(\sigma\) は次のように定義される | |
| DualQuat< _Tp > | inv (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
| \(\sigma = p + \epsilon q\) がデュアルクォータニオンで p が0でない場合、逆デュアルクォータニオンは次のようになる | |
| DualQuat< _Tp > | log (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
| 対数関数の値を返す。 | |
| DualQuat< _Tp > | norm () const |
| デュアルクォータニオン \(\sigma = p + \epsilon q\) のノルム \(||\sigma||\) を返す。 | |
| DualQuat< _Tp > | normalize () const |
| 正規化されたデュアルクォータニオンを返す。デュアルクォータニオンは次のように表せる | |
| DualQuat< _Tp > | operator* (const DualQuat< _Tp > &) const |
| 2つのデュアルクォータニオン q と p の乗算演算子。演算子の両辺の値を乗算する。 | |
| DualQuat< _Tp > | operator*= (const _Tp s) |
| クォータニオンとスカラーの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > & | operator*= (const DualQuat< _Tp > &) |
| 2つのクォータニオンの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > | operator+ (const DualQuat< _Tp > &) const |
| 2つのデュアルクォータニオン p と q の加算演算子。各値が \(p_i\) と \(q_i\) の和となる新しいデュアルクォータニオンを返す。 | |
| DualQuat< _Tp > & | operator+= (const DualQuat< _Tp > &) |
| 2つのデュアルクォータニオン p と q の加算代入演算子。右オペランドを左オペランドに加算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > | operator- () const |
| \(p + (-p) = 0.\) を満たす反対のデュアルクォータニオン \(-p\) を返す。 | |
| DualQuat< _Tp > | operator- (const DualQuat< _Tp > &) const |
| 2つのデュアルクォータニオン p と q の減算演算子。各値が \(p_i\) と \(-q_i\) の和となる新しいデュアルクォータニオンを返す。 | |
| DualQuat< _Tp > & | operator-= (const DualQuat< _Tp > &) |
| 2つのデュアルクォータニオン p と q の減算代入演算子。右オペランドを左オペランドから減算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > | operator/ (const _Tp s) const |
| デュアルクォータニオンとスカラーの除算演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > | operator/ (const DualQuat< _Tp > &) const |
| 2つのデュアルクォータニオン p と q の除算演算子。左オペランドを右オペランドで除算する。 | |
| Quat< _Tp > & | operator/= (const _Tp s) |
| デュアルクォータニオンとスカラーの除算代入演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。 | |
| DualQuat< _Tp > & | operator/= (const DualQuat< _Tp > &) |
| 2つのデュアルクォータニオン p と q の除算代入演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。 | |
| bool | operator== (const DualQuat< _Tp > &) const |
| 2つのデュアルクォータニオン p と q がほぼ等しい場合、すなわち各 \(p_i\) と \(q_i\) の差の絶対値が CV_DUAL_QUAT_EPS 未満である場合に true を返す。 | |
| DualQuat< _Tp > | power (const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const |
| p がデュアルクォータニオンであるときの \(p^t\) の値を返す。これは次のように計算できる: | |
| 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}\) からデュアルクォータニオンを生成する。次の形式のデュアルクォータニオン \(\sigma\) を生成する | |
| 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) |
| 同じ型の2つのクォータニオン 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) |
| 一般化デュアルクォータニオン線形ブレンディングは、2つを超える剛体変換に対して機能する。これらの変換が凸重み \(w = (w_1,...,w_n)\) を持つ単位デュアルクォータニオン \(q_1,...,q_n\) として表される場合、一般化DQBは単に次のようになる。 | |
| static DualQuat< _Tp > | gdqblend (InputArray dualquat, InputArray weights, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) |
| 一般化デュアルクォータニオン線形ブレンディングは、2つを超える剛体変換に対して機能する。これらの変換が凸重み \(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\) が初期姿勢と最終姿勢を表す2つのデュアルクォータニオンであるとき、ScLERP関数の補間は次のように定義できる: | |
公開変数類 | |
| _Tp | w |
| _Tp | w_ |
| _Tp | x |
| _Tp | x_ |
| _Tp | y |
| _Tp | y_ |
| _Tp | z |
| _Tp | z_ |
静的公開変数類 | |
| static 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) |
| \(\sigma = p + \epsilon q\) がデュアルクォータニオンで p が0でない場合、逆デュアルクォータニオンは次のようになる | |
| 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 がデュアルクォータニオンであるときの \(p^t\) の値を返す。これは次のように計算できる: | |
| 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\) はそれぞれ回転(通常の単位クォータニオン)と並進(純粋な通常クォータニオン)を表す。
2つのクォータニオンから構成される一般的なデュアルクォータニオンは、通常次の形式で表現される:
\[ \sigma = p + \epsilon q \]
ここで導入された双対単位 \(\epsilon\) は \(\epsilon^2 = \epsilon^3 =...=0\) を満たし、\(p, q\) はクォータニオンである。
あるいは、デュアルクォータニオンはすべてが 双対数 である4つの成分として解釈することもできる:
\[ \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^*.\) である。
\(Pl\ddot{u}cker\) 座標 \((\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() を参照;
2つのクォータニオン \(q_0, q_1\) を補間する必要がある場合は、sclerp() を使用できる
または dqblend() を使用できる。
2つを超えるデュアルクォータニオンをブレンドする場合は、対応する重みを用いた一般化線形デュアルクォータニオンブレンディング、すなわち 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_ ) |
同じ型の8つの数値から生成する。
| cv::DualQuat< _Tp >::DualQuat | ( | const Vec< _Tp, 8 > & | q | ) |
double型またはfloat型のベクトルから生成する。
| DualQuat< _Tp > cv::DualQuat< _Tp >::conjugate | ( | ) | const |
デュアルクォータニオンの共役を返す。
\[ \begin{equation} \begin{split} \sigma^* &= (p + \epsilon q)^* &= (p^* + \epsilon q^*) \end{split} \end{equation} \]
|
static |
アフィン行列からデュアルクォータニオンを生成する。アフィン行列の定義についてはcreateFromMat()を参照のこと。
|
static |
回転角\(\theta\)、回転軸\(\boldsymbol{u}\)、並進\(\boldsymbol{t}\)からデュアルクォータニオンを生成する。次の形式のデュアルクォータニオン\(\sigma\)を生成する。
\[\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}\]
| angle | 回転角。 |
| axis | 回転軸。 |
| translation | 長さ3のベクトル。 |
|
static |
このデュアルクォータニオンをアフィン変換行列\(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 行列。 |
|
static |
デュアルクォータニオンは次の形式のベクトルである。
\[ \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は軸方向の並進距離である。
| angle | 回転角。 |
| d | 回転軸に沿った並進。 |
| axis | w = 0 のクォータニオンで表される回転軸。 |
| moment | 直線のモーメント。軸に直交している必要がある。 |
|
static |
同じ型の2つのクォータニオン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はそれぞれ実部とデュアル部である。
| realPart | クォータニオン。デュアルクォータニオンの実部。 |
| dualPart | クォータニオン。デュアルクォータニオンの双対部。 |
2つのデュアルクォータニオンの内積を返す。
| p | 他のデュアルクォータニオン。 |
|
static |
デュアルクォータニオン線形ブレンディング(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\)は入力変換を表す単位デュアルクォータニオンである。2つより多い剛体変換に対して動作するDQBを使用したい場合は、gdqblendを参照のこと。
| q1 | 入力変換を表す単位デュアルクォータニオン。 |
| q2 | 入力変換を表す単位デュアルクォータニオン。 |
| t | パラメータ \(t\in[0,1]\)。 |
| assumeUnit | QUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。 |
| DualQuat< _Tp > cv::DualQuat< _Tp >::exp | ( | ) | const |
指数関数の値を返す。
|
static |
一般化デュアルクォータニオン線形ブレンディングは、2つより多い剛体変換に対して動作する。これらの変換が凸重み\(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||}. \]
| dualquat | デュアルクォータニオンのベクトル |
| weights | 重みのベクトル。weights のサイズは dualquat と同じである必要があり、重みは \(\sum_0^n w_{i} = 1\) かつ \(w_i>0\) を満たす必要がある。 |
| assumeUnit | QUAT_ASSUME_UNIT の場合、これらのデュアルクォータニオンは単位クォータニオンであると仮定され、この関数は一部の計算を省略する。 |
|
static |
一般化デュアルクォータニオン線形ブレンディングは、2つより多い剛体変換に対して動作する。これらの変換が凸重み\(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||}. \]
| dualquat | 8チャンネルかつ1行または1列を持つデュアルクォータニオン。 |
| weights | 重みのベクトル。weights のサイズは dualquat と同じである必要があり、重みは \(\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 |
並進ベクトルを返す。このデュアルクォータニオン\(\sigma\)における回転\(r\)は、並進\(t\)より前に適用される。デュアルクォータニオン\(\sigma\)は次のように定義される。
\[\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 |
\(\sigma = p + \epsilon q\)がデュアルクォータニオンであり、pが0でない場合、逆デュアルクォータニオンは次のようになる。
\[\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 |
デュアルクォータニオン\(\sigma = p + \epsilon q\)のノルム\(||\sigma||\)を返す。
\[ \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* | ( | const DualQuat< _Tp > & | ) | const |
2つのデュアルクォータニオン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} \]
例えば
| DualQuat< _Tp > & cv::DualQuat< _Tp >::operator*= | ( | const DualQuat< _Tp > & | ) |
2つのクォータニオンの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。
デュアルクォータニオンの乗算規則:デュアルクォータニオンはクォータニオンの順序対[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) = 0.\)を満たす反対のデュアルクォータニオン\(-p\)を返す。
例えば
デュアルクォータニオンとスカラーの除算演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。
スカラーとのデュアルクォータニオン除算規則:
\[ \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} \]
例えば
| DualQuat< _Tp > cv::DualQuat< _Tp >::operator/ | ( | const DualQuat< _Tp > & | ) | const |
2つのデュアルクォータニオンpとqの除算演算子。左オペランドを右オペランドで除算する。
デュアルクォータニオンとのデュアルクォータニオン除算規則:
\[ \begin{equation} \begin{split} p / q &= p * q.inv()\\ \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} \]
例えば
| DualQuat< _Tp > & cv::DualQuat< _Tp >::operator/= | ( | const DualQuat< _Tp > & | ) |
2つの双対四元数 p と q の除算代入演算子。左オペランドを右オペランドで除算し、その結果を左オペランドに代入する。
四元数を用いた双対四元数の除算則:
\[ \begin{equation} \begin{split} p / q&= p * q.inv()\\ \end{split} \end{equation} \]
例えば
| bool cv::DualQuat< _Tp >::operator== | ( | const DualQuat< _Tp > & | ) | const |
2つの双対四元数 p と q がほぼ等しい場合、すなわち各 \(p_i\) と \(q_i\) の差の絶対値が CV_DUAL_QUAT_EPS 未満である場合に true を返す。
| 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 | ( | const 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 の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。 |
|
static |
スクリュー線形補間(ScLERP)は、双対四元数の球面線形補間を拡張したものである。\(\sigma_1\) と \(\sigma_2\) を初期姿勢と最終姿勢を表す2つの双対四元数とする。ScLERP関数の補間は次のように定義できる:
\[ ScLERP(t;\sigma_1,\sigma_2) = \sigma_1 * (\sigma_1^{-1} * \sigma_2)^t, t\in[0,1] \]
| q1 | 初期姿勢を表すデュアルクォータニオン。 |
| q2 | デュアルクォータニオンは最終的な姿勢を表す。 |
| t | 補間パラメータ |
| directChange | true の場合、常に最短経路を返す。 |
| 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 |
\(\sigma = p + \epsilon q\)がデュアルクォータニオンであり、pが0でない場合、逆デュアルクォータニオンは次のようになる。
\[\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_ |