罗德里格斯(Rodrigues)变换

opencv C++实现

#include 
#include 
#include 

int main()
{
	double r_vec[3] = { -2.100418,-2.167796,0.273330 };
	cv::Mat pr_vec(1, 3, CV_64FC1, r_vec);
	std::cout << "pr_vec = " << pr_vec << std::endl;
	cv::Mat pR_matrix;
	cv::Rodrigues(pr_vec, pR_matrix);
	std::cout << "pR_matrix = " << pR_matrix << std::endl;
	system("pause");
	return 0;
}

罗德里格斯公式(Rodriguez formula)是计算机视觉中的一大经典公式,在描述相机位姿的过程中很常用。公式:

                                                            \boldsymbol{R = I + sin(\theta )K +(1-cos(\theta ))K^2}

在三维空间中,旋转矩阵\boldsymbol{R}可以对坐标系(基向量组)进行刚性的旋转变换。

                                                          \boldsymbol{R = \begin{bmatrix} r_{xx} &r_{xy} &r_{xz} \\ r_{yx} &r_{yy} &r_{yz} \\ r_{zx} &r_{zy} &r_{zz} \end{bmatrix}}

通常为了方便计算,基向量组中的向量是相互正交的且都为单位向量,那么\boldsymbol{R}就是一个标准正交矩阵。两个重要性质:

  • \boldsymbol{R^TR = R^{-1}R=E}
  • \boldsymbol{\left | R \right | = 1}

假设原坐标系基向量矩阵为\boldsymbol{B},旋转后的坐标系基向量矩阵为\boldsymbol{C}

                                                         \boldsymbol{B = \begin{bmatrix} b_x &b_y &b_z \end{bmatrix} = \begin{bmatrix} 1 & 0 &0 \\ 0& 1 &0 \\ 0& 0& 1 \end{bmatrix}}

                                                                         \boldsymbol{C = RB}

                                                         \boldsymbol{C = \begin{bmatrix} r_{xx} &r_{xy} &r_{xz} \\ r_{yx} &r_{yy} &r_{yz} \\ r_{zx} &r_{zy} &r_{zz} \end{bmatrix}\begin{bmatrix} b_x &b_y &b_z \end{bmatrix}}

其变换过程如图所示:

罗德里格斯(Rodrigues)变换_第1张图片

 

根据线性代数的定义,旋转矩阵\boldsymbol{R}就是从基向量矩阵\boldsymbol{B}基向量矩阵\boldsymbol{C}过渡矩阵。由于旋转矩阵\boldsymbol{R}是标准3阶正交矩阵,故旋转矩阵\boldsymbol{R}的自由度为3,这说明最少可以用三个变量来表示旋转矩阵\boldsymbol{R},这就是罗德里格斯公式(Rodriguez formula)存在的基础。

罗德里斯公式(Rodriguez formula)首先要确定一个三维的单位向量\boldsymbol{k = \begin{bmatrix} k_x &k_y &k_z \end{bmatrix}^T}(两个自由度)和一个标量\boldsymbol{\theta }(一个自由度)。

                      \boldsymbol{v_{rot}=cos\theta \cdot v+(1-cos\theta )(k\cdot k^T)\cdot v+sin\theta \cdot \begin{bmatrix} 0 &-k_3 &k_2 \\ k_3&0 &-k_1 \\ -k_2& k_1 &0 \end{bmatrix}\cdot v =R\cdot v}

                       

                            \boldsymbol{R = cos\theta \cdot I_{3\times 3}+(1-cos\theta) \begin{bmatrix} k_1\\ k_2\\ k_3 \end{bmatrix}\begin{bmatrix} k_1 &k_2 &k_3 \end{bmatrix}+sin\theta \cdot \begin{bmatrix} 0 &-k_3 &k_2 \\ k_3& 0 &k_1 \\ -k_2& k_1 &0 \end{bmatrix}}

 

 

 

 

 

 

你可能感兴趣的:(opencv函数学习)