OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
cv::DualQuat< _Tp > クラステンプレート

#include <opencv2/core/dualquaternion.hpp>

Collaboration diagram for cv::DualQuat< _Tp >:

公開メンバ関数

 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< _Tpconjugate () const
 デュアルクォータニオンの共役を返す。
 
_Tp dot (DualQuat< _Tp > p) const
 2つのデュアルクォータニオンの内積を返す。
 
DualQuat< _Tpexp () const
 指数関数の値を返す。
 
Quat< _TpgetDualPart () const
 デュアルクォータニオンの双対部を表すクォータニオンを返す。双対部の定義は createFromQuat() にある。
 
Quat< _TpgetRealPart () const
 デュアルクォータニオンの実部を表すクォータニオンを返す。実部の定義は createFromQuat() にある。
 
Quat< _TpgetRotation (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 回転をクォータニオン形式で返す。
 
Vec< _Tp, 3 > getTranslation (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 並進ベクトルを返す。このデュアルクォータニオン \(\sigma\) における回転 \(r\) は並進 \(t\) よりも前に適用される。デュアルクォータニオン \(\sigma\) は次のように定義される
 
DualQuat< _Tpinv (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 \(\sigma = p + \epsilon q\) がデュアルクォータニオンで p が0でない場合、逆デュアルクォータニオンは次のようになる
 
DualQuat< _Tplog (QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 対数関数の値を返す。
 
DualQuat< _Tpnorm () const
 デュアルクォータニオン \(\sigma = p + \epsilon q\) のノルム \(||\sigma||\) を返す。
 
DualQuat< _Tpnormalize () const
 正規化されたデュアルクォータニオンを返す。デュアルクォータニオンは次のように表せる
 
DualQuat< _Tpoperator* (const DualQuat< _Tp > &) const
 2つのデュアルクォータニオン q と p の乗算演算子。演算子の両辺の値を乗算する。
 
DualQuat< _Tpoperator*= (const _Tp s)
 クォータニオンとスカラーの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。
 
DualQuat< _Tp > & operator*= (const DualQuat< _Tp > &)
 2つのクォータニオンの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。
 
DualQuat< _Tpoperator+ (const DualQuat< _Tp > &) const
 2つのデュアルクォータニオン p と q の加算演算子。各値が \(p_i\) と \(q_i\) の和となる新しいデュアルクォータニオンを返す。
 
DualQuat< _Tp > & operator+= (const DualQuat< _Tp > &)
 2つのデュアルクォータニオン p と q の加算代入演算子。右オペランドを左オペランドに加算し、結果を左オペランドに代入する。
 
DualQuat< _Tpoperator- () const
 \(p + (-p) = 0.\) を満たす反対のデュアルクォータニオン \(-p\) を返す。
 
DualQuat< _Tpoperator- (const DualQuat< _Tp > &) const
 2つのデュアルクォータニオン p と q の減算演算子。各値が \(p_i\) と \(-q_i\) の和となる新しいデュアルクォータニオンを返す。
 
DualQuat< _Tp > & operator-= (const DualQuat< _Tp > &)
 2つのデュアルクォータニオン p と q の減算代入演算子。右オペランドを左オペランドから減算し、結果を左オペランドに代入する。
 
DualQuat< _Tpoperator/ (const _Tp s) const
 デュアルクォータニオンとスカラーの除算演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。
 
DualQuat< _Tpoperator/ (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< _Tppower (const _Tp t, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 p がデュアルクォータニオンであるときの \(p^t\) の値を返す。これは次のように計算できる:
 
DualQuat< _Tppower (const DualQuat< _Tp > &q, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
 p と q がデュアルクォータニオンであるときの \(p^q\) の値を返す。これは次のように計算できる:
 
Affine3< _TptoAffine3 (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< _TpcreateFromAffine3 (const Affine3< _Tp > &R)
 アフィン行列からデュアルクォータニオンを生成する。アフィン行列の定義は createFromMat() を参照できる
 
static DualQuat< _TpcreateFromAngleAxisTrans (const _Tp angle, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &translation)
 回転角 \(\theta\)、回転軸 \(\boldsymbol{u}\)、並進 \(\boldsymbol{t}\) からデュアルクォータニオンを生成する。次の形式のデュアルクォータニオン \(\sigma\) を生成する
 
static DualQuat< _TpcreateFromMat (InputArray _R)
 このデュアルクォータニオンをアフィン変換行列 \(M\) に変換する。デュアルクォータニオンは回転 \(r=[a,b,c,d]\) と並進 \(t=[\Delta x,\Delta y,\Delta z]\) から構成される。アフィン変換行列 \(M\) は次の形式を持つ。
 
static DualQuat< _TpcreateFromPitch (const _Tp angle, const _Tp d, const Vec< _Tp, 3 > &axis, const Vec< _Tp, 3 > &moment)
 デュアルクォータニオンは次の形式のベクトルである。
 
static DualQuat< _TpcreateFromQuat (const Quat< _Tp > &realPart, const Quat< _Tp > &dualPart)
 同じ型の2つのクォータニオン p と q からデュアルクォータニオンを生成する。デュアルクォータニオン \(\sigma\) は次の形式を持つ:
 
static DualQuat< _Tpdqblend (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< _Tpgdqblend (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< _Tpgdqblend (InputArray dualquat, InputArray weights, QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT)
 一般化デュアルクォータニオン線形ブレンディングは、2つを超える剛体変換に対して機能する。これらの変換が凸重み \(w = (w_1,...,w_n)\) を持つ単位デュアルクォータニオン \(q_1,...,q_n\) として表される場合、一般化DQBは単に次のようになる。
 
static DualQuat< _Tpsclerp (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\) の値を返す。これは次のように計算できる:
 

詳細説明

template<typename _Tp>
class cv::DualQuat< _Tp >

デュアルクォータニオンは、通常のクォータニオンが回転のみを記述できるのに対し、回転と並進を同時に記述するために導入された。最短経路の姿勢補間、局所的な姿勢最適化、体積変形に利用できる。詳細は次を参照

単位デュアルクォータニオンは古典的に次のように表現できる:

\[ \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() を参照。

デュアルクォータニオンを生成したい場合は、次を使用できる:

using namespace cv;
double angle = CV_PI;
// create from eight number
DualQuatd dq1(1, 2, 3, 4, 5, 6, 7, 8); //p = [1,2,3,4]. q=[5,6,7,8]
// create from Vec
Vec<double, 8> v{1,2,3,4,5,6,7,8};
DualQuatd dq_v{v};
// create from two quaternion
Quatd p(1, 2, 3, 4);
Quatd q(5, 6, 7, 8);
// create from an angle, an axis and a translation
Vec3d axis{0, 0, 1};
Vec3d trans{3, 4, 5};
// If you already have an instance of class Affine3, then you can use
Affine3d R = dq3.toAffine3();
// or create directly by affine transformation matrix Rt
// see createFromMat() in detail for the form of Rt
Matx44d Rt = dq3.toMat();
// Any rotation + translation movement can
// be expressed as a rotation + translation around the same line in space (expressed by Plucker
// coords), and here's a way to represent it this way.
Vec3d axis{1, 1, 1}; // axis will be normalized in createFromPitch
Vec3d trans{3, 4 ,5};
axis = axis / std::sqrt(axis.dot(axis));// The formula for computing moment that I use below requires a normalized axis
Vec3d moment = 1.0 / 2 * (trans.cross(axis) + axis.cross(trans.cross(axis)) *
std::cos(rotation_angle / 2) / std::sin(rotation_angle / 2));
double d = trans.dot(qaxis);
DualQuatd dq6 = DualQuatd::createFromPitch(angle, d, axis, moment);
Affine transform.
Definition affine.hpp:127
Definition dualquaternion.hpp:146
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 ....
static DualQuat< _Tp > createFromMat(InputArray _R)
Transform this dual quaternion to an affine transformation matrix . Dual quaternion consists of a rot...
Affine3< _Tp > toAffine3(QuatAssumeType assumeUnit=QUAT_ASSUME_NOT_UNIT) const
Transform this dual quaternion to a instance of Affine3.
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,...
static DualQuat< _Tp > createFromAffine3(const Affine3< _Tp > &R)
create dual quaternion from an affine matrix. The definition of affine matrix can refer to createFrom...
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:
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.
_Tp dot(const Matx< _Tp, m, n > &v) const
dot product computed with the default precision
Definition quaternion.hpp:211
Template class for short numerical vectors, a partial case of Matx.
Definition matx.hpp:369
#define CV_PI
Definition cvdef.h:382
Definition core.hpp:107

点 \(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() を使用できる

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...

または dqblend() を使用できる。

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...

2つを超えるデュアルクォータニオンをブレンドする場合は、対応する重みを用いた一般化線形デュアルクォータニオンブレンディング、すなわち gdqblend() を使用できる。

構築子と解体子の詳解

◆ DualQuat() [1/3]

template<typename _Tp >
cv::DualQuat< _Tp >::DualQuat ( )

◆ DualQuat() [2/3]

template<typename _Tp >
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つの数値から生成する。

◆ DualQuat() [3/3]

template<typename _Tp >
cv::DualQuat< _Tp >::DualQuat ( const Vec< _Tp, 8 > & q)

double型またはfloat型のベクトルから生成する。

メンバ関数詳解

◆ conjugate()

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::conjugate ( ) const

デュアルクォータニオンの共役を返す。

\[ \begin{equation} \begin{split} \sigma^* &= (p + \epsilon q)^* &= (p^* + \epsilon q^*) \end{split} \end{equation} \]

◆ createFromAffine3()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::createFromAffine3 ( const Affine3< _Tp > & R)
static

アフィン行列からデュアルクォータニオンを生成する。アフィン行列の定義についてはcreateFromMat()を参照のこと。

◆ createFromAngleAxisTrans()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::createFromAngleAxisTrans ( const _Tp angle,
const Vec< _Tp, 3 > & axis,
const Vec< _Tp, 3 > & translation )
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のベクトル。
覚え書き
この関数内で軸は正規化される。また並進は回転の後に適用される。並進が回転より前に適用されるデュアルクォータニオンを生成するには、createFromQuat(r, r * t / 2)を使用する。
参照
Quat

◆ createFromMat()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::createFromMat ( InputArray _R)
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 行列。
覚え書き
並進は回転の後に適用される。並進が回転より前に適用されるデュアルクォータニオンを生成するには、createFromQuat(r, r * t / 2)を使用する。

◆ createFromPitch()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::createFromPitch ( const _Tp angle,
const _Tp d,
const Vec< _Tp, 3 > & axis,
const Vec< _Tp, 3 > & moment )
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回転軸に沿った並進。
axisw = 0 のクォータニオンで表される回転軸。
moment直線のモーメント。軸に直交している必要がある。
覚え書き
並進は回転の後に適用される。並進が回転より前に適用されるデュアルクォータニオンを生成するには、createFromQuat(r, r * t / 2)を使用する。

◆ createFromQuat()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::createFromQuat ( const Quat< _Tp > & realPart,
const Quat< _Tp > & dualPart )
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クォータニオン。デュアルクォータニオンの双対部。
参照
Quat

◆ dot()

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::dot ( DualQuat< _Tp > p) const

2つのデュアルクォータニオンの内積を返す。

引数
p他のデュアルクォータニオン。

◆ dqblend()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::dqblend ( const DualQuat< _Tp > & q1,
const DualQuat< _Tp > & q2,
const _Tp t,
QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_UNIT )
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]\)。
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。
参照
gdqblend

◆ exp()

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::exp ( ) const

指数関数の値を返す。

◆ gdqblend() [1/2]

template<typename _Tp >
template<int cn>
static DualQuat< _Tp > cv::DualQuat< _Tp >::gdqblend ( const Vec< DualQuat< _Tp >, cn > & dualquat,
InputArray weights,
QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_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デュアルクォータニオンのベクトル
weights重みのベクトル。weights のサイズは dualquat と同じである必要があり、重みは \(\sum_0^n w_{i} = 1\) かつ \(w_i>0\) を満たす必要がある。
assumeUnitQUAT_ASSUME_UNIT の場合、これらのデュアルクォータニオンは単位クォータニオンであると仮定され、この関数は一部の計算を省略する。
覚え書き
重みの要素の型は、dualquat内のデュアルクォータニオンのデータ型と同じであるべきである。

◆ gdqblend() [2/2]

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::gdqblend ( InputArray dualquat,
InputArray weights,
QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_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||}. \]

引数
dualquat8チャンネルかつ1行または1列を持つデュアルクォータニオン。
weights重みのベクトル。weights のサイズは dualquat と同じである必要があり、重みは \(\sum_0^n w_{i} = 1\) かつ \(w_i>0\) を満たす必要がある。
assumeUnitQUAT_ASSUME_UNIT の場合、これらのデュアルクォータニオンは単位クォータニオンであると仮定され、この関数は一部の計算を省略する。
覚え書き
重みの要素の型は、dualquat内のデュアルクォータニオンのデータ型と同じであるべきである。

◆ getDualPart()

template<typename _Tp >
Quat< _Tp > cv::DualQuat< _Tp >::getDualPart ( ) const

デュアルクォータニオンのデュアル部を表すクォータニオンを返す。デュアル部の定義はcreateFromQuat()にある。

参照
createFromQuat, getRealPart

◆ getRealPart()

template<typename _Tp >
Quat< _Tp > cv::DualQuat< _Tp >::getRealPart ( ) const

デュアルクォータニオンの実部を表すクォータニオンを返す。実部の定義はcreateFromQuat()にある。

参照
createFromQuat, getDualPart

◆ getRotation()

template<typename _Tp >
Quat< _Tp > cv::DualQuat< _Tp >::getRotation ( QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_UNIT) const

回転をクォータニオン形式で返す。

◆ getTranslation()

template<typename _Tp >
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^*.\]

引数
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。
覚え書き
このデュアルクォータニオンの並進は回転の後に適用される。

◆ inv()

template<typename _Tp >
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}.\]

引数
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。

◆ log()

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::log ( QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_UNIT) const

対数関数の値を返す。

引数
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。

◆ norm()

template<typename _Tp >
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].\]

覚え書き
デュアル数のデータ型はデュアルクォータニオンである。

◆ normalize()

template<typename _Tp >
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} \]

予想通り、実部は回転であり、デュアル部は純粋なクォータニオンである。

◆ operator*()

template<typename _Tp >
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
std::cout << p * q << std::endl; //[-60, 12, 30, 24, -216, 80, 124, 120]

◆ operator*=() [1/2]

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::operator*= ( const _Tp s)

クォータニオンとスカラーの乗算代入演算子。右オペランドを左オペランドに乗算し、結果を左オペランドに代入する。

スカラーとのデュアルクォータニオン乗算規則:

\[ \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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double s = 2.0;
p *= s;
std::cout << p << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ operator*=() [2/2]

template<typename _Tp >
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
p *= q;
std::cout << p << std::endl; //[-60, 12, 30, 24, -216, 80, 124, 120]

◆ operator+()

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::operator+ ( const DualQuat< _Tp > & ) const

2つのデュアルクォータニオンpとqの加算演算子。各値が\(p_i\)と\(q_i\)の和である新しいデュアルクォータニオンを返す。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
std::cout << p + q << std::endl; //[6, 8, 10, 12, 14, 16, 18, 20]

◆ operator+=()

template<typename _Tp >
DualQuat< _Tp > & cv::DualQuat< _Tp >::operator+= ( const DualQuat< _Tp > & )

2つのデュアルクォータニオンpとqの加算代入演算子。右オペランドを左オペランドに加算し、結果を左オペランドに代入する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
p += q; // equivalent to p = p + q
std::cout << p << std::endl; //[6, 8, 10, 12, 14, 16, 18, 20]

◆ operator-() [1/2]

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::operator- ( ) const

\(p + (-p) = 0.\)を満たす反対のデュアルクォータニオン\(-p\)を返す。

例えば

DualQuatd q{1, 2, 3, 4, 5, 6, 7, 8};
std::cout << -q << std::endl; // [-1, -2, -3, -4, -5, -6, -7, -8]

◆ operator-() [2/2]

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::operator- ( const DualQuat< _Tp > & ) const

2つのデュアルクォータニオンpとqの減算演算子。各値が\(p_i\)と\(-q_i\)の和である新しいデュアルクォータニオンを返す。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
std::cout << p - q << std::endl; //[-4, -4, -4, -4, 4, -4, -4, -4]

◆ operator-=()

template<typename _Tp >
DualQuat< _Tp > & cv::DualQuat< _Tp >::operator-= ( const DualQuat< _Tp > & )

2つのデュアルクォータニオンpとqの減算代入演算子。右オペランドを左オペランドから減算し、結果を左オペランドに代入する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
p -= q; // equivalent to p = p - q
std::cout << p << std::endl; //[-4, -4, -4, -4, 4, -4, -4, -4]

◆ operator/() [1/2]

template<typename _Tp >
DualQuat< _Tp > cv::DualQuat< _Tp >::operator/ ( const _Tp s) const

デュアルクォータニオンとスカラーの除算演算子。左オペランドを右オペランドで除算し、結果を左オペランドに代入する。

スカラーとのデュアルクォータニオン除算規則:

\[ \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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double s = 2.0;
p /= s; // equivalent to p = p / s
std::cout << p << std::endl; //[0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]
覚え書き
スカラーの型はこのデュアルクォータニオンと等しくあるべきである。

◆ operator/() [2/2]

template<typename _Tp >
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
std::cout << p / q << std::endl; // equivalent to p * q.inv()

◆ operator/=() [1/2]

template<typename _Tp >
Quat< _Tp > & cv::DualQuat< _Tp >::operator/= ( const _Tp s)

双対四元数とスカラーの除算代入演算子。左オペランドを右オペランドで除算し、その結果を左オペランドに代入する。

スカラーとのデュアルクォータニオン除算規則:

\[ \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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double s = 2.0;;
p /= s; // equivalent to p = p / s
std::cout << p << std::endl; //[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ operator/=() [2/2]

template<typename _Tp >
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
DualQuatd q{5, 6, 7, 8, 9, 10, 11, 12};
p /= q; // equivalent to p = p * q.inv()
std::cout << p << std::endl;

◆ operator==()

template<typename _Tp >
bool cv::DualQuat< _Tp >::operator== ( const DualQuat< _Tp > & ) const

2つの双対四元数 p と q がほぼ等しい場合、すなわち各 \(p_i\) と \(q_i\) の差の絶対値が CV_DUAL_QUAT_EPS 未満である場合に true を返す。

◆ power() [1/2]

template<typename _Tp >
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べき乗関数の指数。
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。

◆ power() [2/2]

template<typename _Tp >
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デュアルクォータニオン
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。

◆ sclerp()

template<typename _Tp >
static DualQuat< _Tp > cv::DualQuat< _Tp >::sclerp ( const DualQuat< _Tp > & q1,
const DualQuat< _Tp > & q2,
const _Tp t,
bool directChange = true,
QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_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補間パラメータ
directChangetrue の場合、常に最短経路を返す。
assumeUnitQUAT_ASSUME_UNIT の場合、このデュアルクォータニオンは単位デュアルクォータニオンであると仮定され、この関数は一部の計算を省略する。

例えば

double angle1 = CV_PI / 2;
Vec3d axis{0, 0, 1};
Vec3d t(0, 0, 3);
double angle2 = CV_PI;
DualQuatd inter = DualQuatd::sclerp(initial, final, 0.5);

◆ toAffine3()

template<typename _Tp >
Affine3< _Tp > cv::DualQuat< _Tp >::toAffine3 ( QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_UNIT) const

この双対四元数を Affine3 のインスタンスに変換する。

◆ toMat()

template<typename _Tp >
Matx< _Tp, 4, 4 > cv::DualQuat< _Tp >::toMat ( QuatAssumeType assumeUnit = QUAT_ASSUME_NOT_UNIT) const

この双対四元数を行列の形式のアフィン変換行列に変換する。createFromMat() を参照。

◆ toVec()

template<typename _Tp >
Vec< _Tp, 8 > cv::DualQuat< _Tp >::toVec ( ) const

この双対四元数をベクトルに変換する。

Friends And Related Symbol Documentation

◆ conjugate

template<typename _Tp >
template<typename T >
DualQuat< T > conjugate ( const DualQuat< T > & dq)
friend

デュアルクォータニオンの共役を返す。

\[ \begin{equation} \begin{split} \sigma^* &= (p + \epsilon q)^* &= (p^* + \epsilon q^*) \end{split} \end{equation} \]

引数
dqデュアルクォータニオン。

◆ cv::operator* [1/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator* ( const DualQuat< T > & ,
const T s )
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double s = 2.0;
std::cout << p * s << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator* [2/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator* ( const T s,
const DualQuat< T > &  )
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} \]

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double s = 2.0;
std::cout << s * p << std::endl; //[2, 4, 6, 8, 10, 12, 14, 16]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator+ [1/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator+ ( const DualQuat< T > & ,
const T s )
friend

双対四元数とスカラーの加算演算子。右オペランドを左オペランドに加算する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double scalar = 2.0;
std::cout << p + scalar << std::endl; //[3.0, 2, 3, 4, 5, 6, 7, 8]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator+ [2/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator+ ( const T s,
const DualQuat< T > &  )
friend

スカラーと双対四元数の加算演算子。右オペランドを左オペランドに加算する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double scalar = 2.0;
std::cout << scalar + p << std::endl; //[3.0, 2, 3, 4, 5, 6, 7, 8]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator- [1/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator- ( const DualQuat< T > & ,
const T s )
friend

双対四元数とスカラーの減算演算子。右オペランドを左オペランドから減算する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double scalar = 2.0;
std::cout << p - scalar << std::endl; //[-1, 2, 3, 4, 5, 6, 7, 8]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator- [2/2]

template<typename _Tp >
template<typename T >
DualQuat< T > cv::operator- ( const T s,
const DualQuat< T > &  )
friend

スカラーと双対四元数の減算演算子。右オペランドを左オペランドから減算する。

例えば

DualQuatd p{1, 2, 3, 4, 5, 6, 7, 8};
double scalar = 2.0;
std::cout << scalar - p << std::endl; //[1.0, -2, -3, -4, -5, -6, -7, -8]
覚え書き
スカラーの型はデュアルクォータニオンと等しくあるべきである。

◆ cv::operator<<

template<typename _Tp >
template<typename S >
std::ostream & cv::operator<< ( std::ostream & ,
const DualQuat< S > &  )
friend

◆ exp

template<typename _Tp >
template<typename T >
DualQuat< T > exp ( const DualQuat< T > & dq)
friend

指数関数の値を返す。

引数
dqデュアルクォータニオン。

◆ inv

template<typename _Tp >
template<typename T >
DualQuat< T > inv ( const DualQuat< T > & dq,
QuatAssumeType assumeUnit )
friend

\(\sigma = p + \epsilon q\)がデュアルクォータニオンであり、pが0でない場合、逆デュアルクォータニオンは次のようになる。

\[\sigma^{-1} = \frac{\sigma^*}{||\sigma||^2}, \]

あるいは同等に、

\[\sigma^{-1} = p^{-1} - \epsilon p^{-1}qp^{-1}.\]

引数
dqデュアルクォータニオン。
assumeUnitQUAT_ASSUME_UNIT の場合、デュアルクォータニオン dq は単位デュアルクォータニオンとみなされ、この関数は一部の計算を省略する。

◆ log

template<typename _Tp >
template<typename T >
DualQuat< T > log ( const DualQuat< T > & dq,
QuatAssumeType assumeUnit )
friend

対数関数の値を返す。

引数
dqデュアルクォータニオン。
assumeUnitQUAT_ASSUME_UNIT の場合、デュアルクォータニオン dq は単位デュアルクォータニオンとみなされ、この関数は一部の計算を省略する。

◆ power [1/2]

template<typename _Tp >
template<typename T >
DualQuat< T > power ( const DualQuat< T > & dq,
const T t,
QuatAssumeType assumeUnit )
friend

\(p^t\) の値を返す。ここで p は双対四元数である。これは次のように計算できる:

\[ p^t = \exp(t\ln p) \]

引数
dqデュアルクォータニオン。
tべき乗関数の指数。
assumeUnitQUAT_ASSUME_UNIT の場合、デュアルクォータニオン dq は単位デュアルクォータニオンとみなされ、この関数は一部の計算を省略する。

◆ power [2/2]

template<typename _Tp >
template<typename T >
DualQuat< T > power ( const DualQuat< T > & p,
const DualQuat< T > & q,
QuatAssumeType assumeUnit )
friend

\(p^q\) の値を返す。ここで p と q は双対四元数である。これは次のように計算できる:

\[ p^q = \exp(q\ln p) \]

引数
pデュアルクォータニオン。
qデュアルクォータニオン。
assumeUnitQUAT_ASSUME_UNIT の場合、デュアルクォータニオン p は単位デュアルクォータニオンとみなされ、この関数は一部の計算を省略する。

メンバ変数詳解

◆ CV_DUAL_QUAT_EPS

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::CV_DUAL_QUAT_EPS = (_Tp)1.e-6
staticconstexpr

◆ w

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::w

◆ w_

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::w_

◆ x

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::x

◆ x_

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::x_

◆ y

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::y

◆ y_

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::y_

◆ z

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::z

◆ z_

template<typename _Tp >
_Tp cv::DualQuat< _Tp >::z_

このクラス詳解は次のファイルから抽出されました: