處理三維旋轉(zhuǎn)問題時(shí),通常采用旋轉(zhuǎn)矩陣的方式來描述呼渣。一個(gè)向量乘以旋轉(zhuǎn)矩陣等價(jià)于向量以某種方式進(jìn)行旋轉(zhuǎn)蔑祟。除了采用旋轉(zhuǎn)矩陣描述外,還可以用旋轉(zhuǎn)向量來描述旋轉(zhuǎn)忌傻,旋轉(zhuǎn)向量的長度(模)表示繞軸逆時(shí)針旋轉(zhuǎn)的角度(弧度)大脉。旋轉(zhuǎn)向量與旋轉(zhuǎn)矩陣可以通過羅德里格斯(Rodrigues)變換進(jìn)行轉(zhuǎn)換。
算法過程
式中水孩,norm為求向量的模镰矿。反變換也可以很容易的通過如下公式實(shí)現(xiàn)
OpenCV實(shí)現(xiàn)Rodrigues變換的函數(shù)為
?int ?cvRodrigues2(const ?CvMat* ?src, ?CvMat* ?dst, ?CvMat* ?jacobian=0);
src為輸入的旋轉(zhuǎn)向量(3x1或者1x3)或者旋轉(zhuǎn)矩陣(3x3)。
dst為輸出的旋轉(zhuǎn)矩陣(3x3)或者旋轉(zhuǎn)向量(3x1或者1x3)荷愕。
jacobian為可選的輸出雅可比矩陣(3x9或者9x3)衡怀,是輸入與輸出數(shù)組的偏導(dǎo)數(shù)棍矛。
可以用上述方式法驗(yàn)證以下例子
驗(yàn)證代碼如下:
#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