opencv基础:罗德里格斯旋转公式(Rodrigues' rotation formula)推导 rodrigues()函数原理

参考:1—https://openhome.cc/Gossip/WebGL/Rodrigues.html(比较好的理解流程)
2—https://www.cnblogs.com/wtyuan/p/12324495.html(推导出旋转矩阵R)
建议看原链接!!
具体如下:


        <p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">在〈</font></font><a href="TransformationMatrix.html" target="_blank" rel="external nofollow" ><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">转换矩阵</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">〉中谈到的旋转,是顶点绕着X、Y或Z轴转动,然而有时会需要绕着指定的特定轴来旋转顶点,轴的部份会使用向量来表示,例如下图,使用u来表示旋转轴,旋转角度为θ:</font></font></p>

Rodrigues 旋转公式

如果对于3D方面的数学有些涉猎,看到这个需求应该会想到四元数与旋转,就结论来说,可以将这个需求化为一个四元数,然而套用四元数旋转矩阵,就可以达成任务,然而,若你对四元数或其旋转矩阵的导证有兴趣,认识Rodrigues旋转公式的导证,会有所帮助。

首先,旋转时的圆路径构成一个平面,该平面与u 正交,把这个平面置于原点,若未旋转的顶点使用向量v 来表示,可以将之分解为两个向量v1、v2:

Rodrigues 旋转公式

v1为v在u上的投影,而v2为v在平面上的投影,a为v1、v2的夹角,根据内积公式u‧v = |u||v| cos(a),若要求得v1可以如下:

Rodrigues 旋转公式

实际上对于旋转轴u,只需关心它的方向,不用在意它的大小,因此u 可以用单位向量指定,也就是|u| 会是1,结果就是:

Rodrigues 旋转公式

接下来要绕着u 旋转v 得到v',就可以看成是v1 与v2 绕着u 旋转,若旋转后分别得到v1' 与v2',最后得到v' = v1' + v2':

Rodrigues 旋转公式

对于v1 来说,因为跟u 平行,旋转后还是相同,也就是v1' = v1,至于v2 的转动,可以分解为平面上的两个向量:

Rodrigues 旋转公式

为了能计算v2' 在上图中垂直轴上的投影,必须要有垂直轴的向量w,因为指定的旋转轴u 与v2 正交,那么w 可以由u 与v2 的外积取得,也就是w = ux v2,单位向量为w/|w|,因此v21' 与v22' 会是:

Rodrigues 旋转公式

因为|v2'| 就是|v2|,因此:

Rodrigues 旋转公式

外积公式a x b = |a||b|sin(a) n,n为与a、b正交的单位向量,在这边a为u,b为v2,而u与v2正交,因此ux v2 = |u||v2| n,n就是w/| w|,因此|w|就是|u||v2|w / (ux v2),u是单位向量,|u|为1,因此|w|为|v2|w / (ux v2),代入上面的式子化简后得到:

Rodrigues 旋转公式

因此v2' = v21' + v22' = sin(θ)(ux v2) + cos(θ)v2,其中ux v2 可以是ux (v - v1) = uxv - ux v1,因为u 与v1 平行,ux v1为0,所以ux v2 会是uxv,最后就是v2' = sin(θ)(uxv) + cos(θ)v2。

因为v旋转后得到v' = v1' + v2',前面已导出v1' = v1,而v1 = (u‧v) u,v2 = v - (u‧v) u,因此
v'为(u‧ v) u + sin(θ)(uxv) + cos(θ)(v - (u‧v) u),整理一下可以得到最后的旋转公式:

Rodrigues 旋转公式

公式是导出来了,不过看起来复杂,有个轴角(axis–angle)转换矩阵与要转动的向量结合后,等价于此公式,不过矩阵相对于四元数旋转矩阵来说,还是复杂许多,因而比较少见到这个公式的运用或实作。

不过,利用分解向量以及有些向量之间的正交关系,来导证出旋转公式的过程,与导证四元数旋转矩阵的过程会有关联,这之后再来简单聊聊!

更多相关推荐

罗德里格斯(Rodrigues)旋转向...

   在做双目立体视觉深度图像生成的时候,遇到旋转向量(1x3)与旋转矩阵(3x3)的概念,得知...

继续阅读

xgboost 推导 /原理/公式/

首先要知道booster中四个经典模型,gbdt,lightgboost,xgboost,catboost,具体区别自己百度...

继续阅读

罗德里格斯(Rodrigues)变换

opencvC++实现罗德里格斯公式(Rodriguezformula)是计算机视觉中的一大经典公式,在描述相机...

继续阅读

python旋转矩阵90°_旋转矩阵(Ro...

向量的平移,比较简单。缩放也较为简单矩阵如何进行计算呢?之前的文章中有简介一种方法,把行...

继续阅读

OpenCV3历程(12)——双目视觉测...

转载自:https://blog.csdn.net/piaoxuezhong/article/details/79016615一、双目测距原理通过...

继续阅读

opencv基础---直方图均衡化(原...

直方图均衡化的作用是图像增强。有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什...

继续阅读

tensorflow 旋转图片_tensorflow...

tensorflow旋转矩阵的函数实现方法关键字:rot90,tensorflow1.背景在做数据增强的操作过程中,很...

继续阅读

XGBoost目标函数公式推导

主要看了以及参考了以下这几篇文章:通俗理解kaggle比赛大杀器xgboost 机器学习:XGBoost公式...

继续阅读