罗德里格斯(Rodrigues)旋转向量与矩阵的变换
? ?? 在做雙目立體視覺深度圖像生成的時候,遇到旋轉(zhuǎn)向量(1x3)與旋轉(zhuǎn)矩陣(3x3)的概念,得知二者可以通過羅德里格斯相互轉(zhuǎn)化。
1.旋轉(zhuǎn)的表示
? ? ?處理三維旋轉(zhuǎn)問題時,通常采用旋轉(zhuǎn)矩陣的方式來描述旋轉(zhuǎn)變換。旋轉(zhuǎn)矩陣有以下兩種方式得到。
? ?? ?物體在三維空間中的旋轉(zhuǎn),可以被分為解為在直接坐標系下,分別先后圍繞x,y,z坐標軸旋轉(zhuǎn)得到。旋轉(zhuǎn)的角度也就是我們常聽到的角度roll,pitch,yew。如果已知這幾個角度,就可以直接通過每一步的矩陣相乘得到整個旋轉(zhuǎn)矩陣。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? R=R(yaw)R(pitch)R(roll)
R=R(yaw)R(pitch)R(roll)
? ? ? ?旋轉(zhuǎn)矩陣還可以理解為圍繞空間中某一個向量,直接一次旋轉(zhuǎn)某一個角度得到。在openCV相機標定時得到的旋轉(zhuǎn)向量r就是用這種方式。即由旋轉(zhuǎn)變量來描述。
2.旋轉(zhuǎn)向量得到旋轉(zhuǎn)矩陣
? ? ???旋轉(zhuǎn)向量的長度(模)表示繞軸逆時針旋轉(zhuǎn)的角度(弧度)。旋轉(zhuǎn)向量與旋轉(zhuǎn)矩陣可以通過羅德里格斯(Rodrigues)變換進行轉(zhuǎn)換。
? ? ? ?旋轉(zhuǎn)角度?θ=norm(r)? ? ? (norm表示求向量r的模長)
? ? ? ?單位向量?(rx,ry,rz)=r/θ?
? ? ? ?旋轉(zhuǎn)矩陣?
? ? ? ?其中 I 為單位矩陣, rT 為 r 的轉(zhuǎn)置。?
? ? ? ?所以?
rrT=∣∣∣∣∣rx?rxry?rxrz?rxrx?ryry?ryrz?ryrx?rzry?rzrz?rz∣∣∣∣∣ 3.根據(jù)旋轉(zhuǎn)向量求另一個旋轉(zhuǎn)向量
? ? ? ?用r表示待旋轉(zhuǎn)的向量,v為旋轉(zhuǎn)向量的單位向量,θ為旋轉(zhuǎn)角,旋轉(zhuǎn)后的向量可以表示為?
(1)旋轉(zhuǎn)角度
? ? ? ?已知旋轉(zhuǎn)前向量為P, 旋轉(zhuǎn)后變?yōu)镼。由點積定義可知:
? ? ? ?可推出P,Q之間的夾角為:
(2)旋轉(zhuǎn)軸
? ? ? ?旋轉(zhuǎn)角所在的平面為有P和Q所構(gòu)成的平面,那么旋轉(zhuǎn)軸必垂直該平面。
? ? ? ?假定旋轉(zhuǎn)前向量為a(a1, a2, a3), 旋轉(zhuǎn)后向量為b(b1, b2, b3)。由叉乘定義得:
? ? ? ?所以旋轉(zhuǎn)軸c(c1, c2, c3)為:
5.OpenCV實現(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ù)。
驗證代碼如下:
#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]);} }6、opencv另一種變換方法
//將旋轉(zhuǎn)向量轉(zhuǎn)化為旋轉(zhuǎn)矩陣 Mat_<float> r_l = (Mat_<float>(3, 1) << 0.04345, -0.05236, -0.01810);//左攝像機的旋轉(zhuǎn)向量 Mat_<float> r_r = (Mat_<float>(3, 1) << 0.04345, -0.05236, -0.01810);//右攝像機的旋轉(zhuǎn)向量 Mat R_R, R_L; Rodrigues(r_l, R_L); Rodrigues(r_r, R_R);
參考:
1?http://blog.csdn.net/tl_tj/article/details/47006007
2?http://blog.sina.com.cn/s/blog_5fb3f125010100hp.html
3?根據(jù)旋轉(zhuǎn)前后的兩個向量值,先求出旋轉(zhuǎn)角度和旋轉(zhuǎn)軸,然后用羅德里格旋轉(zhuǎn)公式即可求出對應(yīng)的旋轉(zhuǎn)矩陣。?https://www.cnblogs.com/xpvincent/archive/2013/02/15/2912836.html
總結(jié)
以上是生活随笔為你收集整理的罗德里格斯(Rodrigues)旋转向量与矩阵的变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MATLAB中median函数的用法
- 下一篇: error c4996: 'fopen'