罗德里格斯(Rodrigues)旋转向量与矩阵的变换

     在做双目立体视觉深度图像生成的时候,遇到旋转向量(1x3)与旋转矩阵(3x3)的概念,得知二者可以通过罗德里格斯相互转化。

1.旋转的表示

     处理三维旋转问题时,通常采用旋转矩阵的方式来描述旋转变换。旋转矩阵有以下两种方式得到。

      物体在三维空间中的旋转,可以被分为解为在直接坐标系下,分别先后围绕x,y,z坐标轴旋转得到。旋转的角度也就是我们常听到的角度roll,pitch,yew。如果已知这几个角度,就可以直接通过每一步的矩阵相乘得到整个旋转矩阵。

                              R=R(yaw)R(pitch)R(roll)

R=R(yaw)R(pitch)R(roll)

       旋转矩阵还可以理解为围绕空间中某一个向量,直接一次旋转某一个角度得到。在openCV相机标定时得到的旋转向量r就是用这种方式。即由旋转变量来描述。

2.旋转向量得到旋转矩阵

       旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。旋转向量与旋转矩阵可以通过罗德里格斯(Rodrigues)变换进行转换。

       旋转角度 θ=norm(r)      (norm表示求向量r的模长)
       单位向量 (rx,ry,rz)=r/θ 
       旋转矩阵 

R=cos(θ)I+(1cos(θ))rrT+sin(θ)0rzryrz0rxryrx0

       其中 I 为单位矩阵, rT r 的转置。 
       所以 
rrT=rxrxryrxrzrxrxryryryrzryrxrzryrzrzrz
3.根据旋转向量求另一个旋转向量

       用r表示待旋转的向量,v为旋转向量的单位向量θ为旋转角,旋转后的向量可以表示为 

r=rcos(θ)+(1cos(θ))(vr)v+sin(θ)(v×r)
4.根据两个旋转向量求旋转矩阵

(1)旋转角度

       已知旋转前向量为P, 旋转后变为Q。由点积定义可知:

image       可推出P,Q之间的夹角为:

image

(2)旋转轴

       旋转角所在的平面为有P和Q所构成的平面,那么旋转轴必垂直该平面。

       假定旋转前向量为a(a1, a2, a3), 旋转后向量为b(b1, b2, b3)。由叉乘定义得:

image

       所以旋转轴c(c1, c2, c3)为:

image

5.OpenCV实现Rodrigues变换的函数为

int cvRodrigues2const 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]);}
}

6、opencv另一种变换方法


//将旋转向量转化为旋转矩阵
Mat_<float> r_l = (Mat_<float>(3, 1) << 0.04345, -0.05236, -0.01810);//左摄像机的旋转向量
Mat_<float> r_r = (Mat_<float>(3, 1) << 0.04345, -0.05236, -0.01810);//右摄像机的旋转向量
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

根据旋转前后的两个向量值,先求出旋转角度和旋转轴,然后用罗德里格旋转公式即可求出对应的旋转矩阵。 https://www.cnblogs.com/xpvincent/archive/2013/02/15/2912836.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb 分片与副本集

测试搭建192.168.3.110mongos 30000&#xff0c;30001,30002config 40000,40001,40002shard1 50001,50002,50003shard2 50004,50005,50006,shard3 50007,50008,50009[rootmysql-slave10 data]# mkdir -p /data/config/1/data[rootmysql-slave10 data]# mkdir -p /data/config/2…

python必读5本书籍_免费下载!5本从Python入手机器学习的必备电子书!(附链接)...

大数据文摘授权转载自数据派THU作者&#xff1a;Richard Gall编译&#xff1a;车前子、丁楠雅今天&#xff0c;机器学习已成为软件工程所有领域中最重要的发展趋势之一。这门技术不再局限于研究者和数据分析者&#xff0c;从网络安全到网络开发机&#xff0c;器学习都至关重要。…

error c4996: 'fopen' This function or variable may be unsafe如何解决

1.问题描述 VS2013OPENCV249&#xff0c;不止一次遇到以下类似错误&#xff1a; error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.d:\open…

JavaParser中AST节点的观察者

我们离JavaParser 3.0的第一个候选发布版本越来越近。 我们添加的最后一项功能是支持观察抽象语法树的所有节点的更改。 当我为此功能编写代码时&#xff0c;我收到了Danny van Bruggen&#xff08;又名Matozoid&#xff09;和Cruz Maximilien的宝贵反馈。 因此&#xff0c;我使…

nc命令详解

NetCat&#xff0c;在网络工具中有“瑞士军刀”美誉&#xff0c;其有Windows和Linux的版本。因为它短小精悍&#xff08;1.84版本也不过25k&#xff0c;旧版本或缩减版甚至更小&#xff09;、功能实用&#xff0c;被设计为一个简单、可靠的网络工具&#xff0c;可通过TCP或UDP协…

startindex 不能大于字符串长度_「12」学习MySQL第二类函数:字符串函数

前一篇文章总结了下MySQL中常用的数学函数&#xff0c;本文接下来的重点就是认识“字符串函数”。上图这匹漂亮的马儿就是通过各种字符(字母、括号、逗号、竖线等)画出来的。我不由自主地会去想下面几个问题&#xff1a;它到底有多少个字符&#xff1f;--字符串长度它里面的小写…

对数函数的C、MATLAB表示

1、C语言中的对数函数 头文件&#xff1a;#include格式&#xff1a;①double log (double x);log() 函数返回以 e 为底的对数值&#xff0c;即数学中的lnx&#xff1b;如果 x 为负数或 0&#xff0c;则会发生错误并设置 errno 值。错误代码&#xff1a;EDOM&#xff1a;参数x 为…

微信小程序开发——超链接或按钮点击跳转到其他页面失效

1. 超链接导航失效&#xff1a; 小程序规则——wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面&#xff0c;只能用 wx.switchTab 跳转到 tabbar 页面转载于:https://www.cnblogs.com/xyyt/p/9252835.html

javaone_JavaOne 2012:Lambda之路

javaone我最热切期待的JavaOne 2012演讲之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技术主题演讲中的Lambda味道仅增加了预期。 这是在希尔顿广场A / B举行的&#xff0c;距离我之前在金门大桥A / B / C参加的演讲仅几步之遥。 我曾预计会打包相对较大的Plaza A / B&…

uml 时序图_UML各种图总结:

UML的书籍&#xff1a;《UML distilled》、《UML和模式应用》、《UML用户指南》、《UML对象设计与编程》、《UMLOracle8建模》UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种…

让程序结果在屏幕上暂停一段时间

现在使用VS2013输出printf显示结果&#xff0c;经常会出现一闪而过的情况&#xff0c;现有以下解决办法&#xff1a; 1.调用系统命令暂停 #include <stdlib.h>system("pause");2. #include<conio.h> getchar(); 3. #include<stdlib.h> getchar(); …

Linux shell的标准输入、输出和错误

1.文件描述符 在linux shell执行命令时&#xff0c;每个进程都和三个打开的文件相联系&#xff0c;并使用文件描述符来引用这些文件。由于文件描述符不容易记忆&#xff0c;shell同时也给出了相应的文件名&#xff1a; 文件文件描述符输入文件—标准输入0&#xff08;缺省是键…

微基准测试进入Java 9

我已经几个月没有在这里写文章了&#xff0c;这种例外也会继续下去。 我计划在明年三月左右恢复写作。 本文末尾的说明。 等待&#xff01; 不完全是最后&#xff0c;因为您可以向下滚动。 它在文章结尾处。 继续阅读&#xff01; 三年前&#xff0c;我在写有关Java编译器如何…

摆渡车(noip2018 pj t3)

摆渡车&#xff08;题目和测试右转 洛谷P5017&#xff09; 做法&#xff1a;dp各种优化(剪枝) 这道题考场上看了一脸懵逼...第一眼看这 tm 不是个一维dp吗...结果按着这个朦胧的思路&#xff0c;删删改改约莫0.5h&#xff0c;终于过了小样例&#xff0c;然后一测大样例...GG了。…

关于树的冷知识

1、为什么冬天树干刷白漆&#xff1f; 刷的是是石灰水&#xff0c;主要成分是石灰乳,还有食盐,大豆粉,石榴合剂。 好处一、石灰具有一定的杀菌、杀虫作用&#xff0c;可以杀死寄生在树干上的一些越冬的真菌、细菌和害虫。 好处二、由于害虫一般都喜欢黑色、航脏的地方&#x…

乐玩自动化测试模块_自动化测试模型(一)自动化测试模型介绍

一个自动化测试框架就是一个集成体系&#xff0c;在这一体系中包含测试功能的函数库&#xff0c;测试数据源&#xff0c;测试对象标准&#xff0c;以及各种可重用的模块。自动化测试在发展过程中经历了以下几个阶段&#xff0c;模块驱动测试&#xff0c;数据驱动测试及对象驱动…

linux特殊权限位之setuid、setgid和sticky

我们登陆到系统之后,创建一个普通文件或者目录的时候,会有一个默认的权限。普通文件是644,目录文件是755,想必大家都知道这个是由umask这个值决定的。我们可以直接执行umask命令查看&#xff0c;linux系统默认的umask值是0022。想改变创建文件默认的权限&#xff0c;我们直接修…

js获取当前时间,并实时更新

可以使用JavaScript的Date()对象来获取当前时间&#xff0c;并使用setInterval()函数实现实时更新。 以下是一个示例代码&#xff1a; <p id"time"></p>function updateTime() {var now new Date();var hours now.getHours();var minutes now.getMi…

11.23日常

整理相关资料&#xff0c;阅读c#课本转载于:https://www.cnblogs.com/JL3Peanut/p/10032318.html