处理三维旋转问题时,通常采用旋转矩阵的方式来描述。一个向量乘以旋转矩阵等价于向量以某种方式进行旋转。除了采用旋转矩阵描述外,还可以用旋转向量来描述旋转,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。旋转向量与旋转矩阵可以通过罗德里格斯(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
#include
voidmain()
{
inti;
doubler_vec[3]={-2.100418,-2.167796,0.273330};
doubleR_matrix[9];
CvMatpr_vec;
CvMatpR_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]);
}
}
http://blog.sina.com.cn/s/blog_5fb3f125010100hp.html
网友评论