OpenCV--旋转向量与旋转矩阵相互转化

来源:互联网 发布:软件企业评估规范 编辑:程序博客网 时间:2024/05/17 23:41

    处理三维旋转问题时,通常采用旋转矩阵的方式来描述。

    一个向量乘以旋转矩阵等价于向量以某种方式进行旋转。

    除了采用旋转矩阵描述外,还可以用旋转向量来描述旋转,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。

    旋转向量与旋转矩阵可以通过罗德里格斯(Rodrigues)变换进行转换。

算法过程如下:


式中,norm为求向量的模。反变换也可以很容易的通过如下公式实现:

OpenCV实现Rodrigues变换的函数为

int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );

src为输入的旋转向量(3x1或者1x3)或者旋转矩阵(3x3)。

dst为输出的旋转矩阵(3x3)或者旋转向量(3x1或者1x3)。

jacobian为可选的输出雅可比矩阵(3x9或者9x3),是输入与输出数组的偏导数。

  可以用上述方式法验证以下例子

 

#include <stdio.h>#include <cv.h>void main(){    int i;    double r_vec[3]={-2.100418,-2.167796,0.273330};    double R_matrix[9];    CvMat pr_vec;    CvMat pR_matrix;    cvInitMatHeader(&pr_vec,1,3,CV_64FC1,r_vec,CV_AUTOSTEP);    cvInitMatHeader(&pR_matrix,3,3,CV_64FC1,R_matrix,CV_AUTOSTEP);    cvRodrigues2(&pr_vec, &pR_matrix,0);    for(i=0; i<9; i++)    {        printf("%f\n",R_matrix[i]);    }}


 C++: void Rodrigues(InputArray src, OutputArray dst, OutputArray jacobian=noArray())