由Rodrigues公式有:
R=Icosθ+(1−cosθ)uuT+u×sinθR=Icos\theta+(1-cos\theta)uu^T+u_{\times}sin\thetaR=Icosθ+(1−cosθ)uuT+u×​sinθ
其中,Icosθ+(1−cosθ)uuTIcos\theta+(1-cos\theta)uu^TIcosθ+(1−cosθ)uuT是对称矩阵,u×sinθu_{\times}sin\thetau×​sinθ是反对称矩阵。
所以,
R−RT=2u×sinθR-R^T = 2u_{\times}sin\thetaR−RT=2u×​sinθ
因为R(n^,θ)=PR(z^,θ)P−1R(\hat{n},\theta)=PR(\hat{z},\theta)P^{-1}R(n^,θ)=PR(z^,θ)P−1,
所以tr(R)=2cosθ−1tr(R)=2cos\theta-1tr(R)=2cosθ−1
结合∥R−RT∥=2sinθ\|R-R^T\|=2sin\theta∥R−RT∥=2sinθ可以求解u、θu、\thetau、θ
参考代码:https://github.com/zjulion/handeyecat

Geo3d rodrigues2(const RotMat& matrix)
{Eigen::JacobiSVD<Eigen::Matrix3f> svd(matrix, Eigen::ComputeFullV | Eigen::ComputeFullU);RotMat R = svd.matrixU() * svd.matrixV().transpose();double rx = R(2, 1) - R(1, 2);double ry = R(0, 2) - R(2, 0);double rz = R(1, 0) - R(0, 1);double s = sqrt((rx*rx + ry*ry + rz*rz)*0.25);double c = (R.trace() - 1) * 0.5; //c=cos(theta)c = c > 1. ? 1. : c < -1. ? -1. : c;double theta = acos(c);if (s < XEPS)//sin s =0{double t;if (c > 0) //cos s=1rx = ry = rz = 0;else{t = (R( 0, 0) + 1)*0.5;rx = sqrt(std::max(t, 0.0));t = (R(1, 1) + 1)*0.5;ry = sqrt(std::max(t, 0.0)) * (R(0, 1) < 0 ? -1.0 : 1.0);t = (R(2, 2) + 1)*0.5;rz = sqrt(std::max(t, 0.0)) * (R(0, 2) < 0 ? -1.0 : 1.0);if (fabs(rx) < fabs(ry) && fabs(rx) < fabs(rz) && (R(1, 2) > 0) != (ry*rz > 0))//这里不懂rz = -rz;theta /= sqrt(rx*rx + ry*ry + rz*rz);rx *= theta;ry *= theta;rz *= theta;}}else{double vth = 1 / (2 * s);vth *= theta;rx *= vth; ry *= vth; rz *= vth;}return Eigen::Vector3d(rx, ry, rz).cast<float>();
}

参考源:
https://www2.cs.duke.edu/courses/fall13/compsci527/notes/rodrigues.pdf
http://web.cs.iastate.edu/~cs577/handouts/rotation.pdf

由旋转矩阵到Rodrigues相关推荐

  1. ORB_SLAM2中的Sim3变换

    对于双目.RGB-D相机,可获得深度,因此不存在尺度问题,因此Sim3中的尺度s=1. (1)通过词袋加速算法实现当前帧.闭环帧的特征点的匹配,建立闭环帧的路标点和当前帧的特征点间的联系. (2)使用 ...

  2. 《Learning OpenCV3》ch18:相机模型与标定

    省赛期间用到双目视觉的时候,只是很粗浅地调用了下API,毕竟初学而且时间紧迫.最近打算跟一个硕士生再做一个相关项目,而且也想用Stereo Vision作为毕业设计,所以很有必要了解一下其中的原理.最 ...

  3. OpenCV实现立体视觉的案例

    尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一.十二章和OpenCV论坛上一些前辈的讨论.过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的 ...

  4. 张正友畸变矫正C++代码

    1,在自己的项目下创建文件夹sample->left 2,创建两个txt文件,caliberation_result.txt,filename.txt 3,将拍的标定图名称写到filename. ...

  5. OpenCV-Python (官方)中文教程(部分三)

    [部分二]:https://blog.csdn.net/Thomson617/article/details/103961274 第七章.相机标定与3D重构 42.摄像头标定 在图像测量过程以及机器视 ...

  6. (01)ORB-SLAM2源码无死角解析-(58) 闭环线程→计算Sim3: 源码Sim3Solver::iterate()讲解

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (0 ...

  7. cv::omni::StereoCalibrate 源码解析 (一) —— 单目标定

    cv::omni::StereoCalibrate 的代码逻辑和cv::StereoCalibrate相似. 在opencv库基础上稍微改动. //omni单目标定 输入calibrate(世界坐标系 ...

  8. 摄像机标定和立体标定

    尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一.十二章和OpenCV论坛上一些前辈的讨论.过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的 ...

  9. 【算法】多视图几何三维重建+增量式SfM

    多视图几何三维重建的基本原理: 从两个或者多个视点观察同一景物,已获得在多个不同的视角下对景物的多张感知图像,运用三角测量的基本原理计算图像像素间位置偏差,获得景物的三维深度信息,这一个过程与人类观察 ...

最新文章

  1. 如何轻松搞定 CRUD 的创建人、修改人、时间等字段的赋值
  2. 使用图片方式自定义iOS导航栏navigationItem的backBarButtonItem
  3. 注册表数据提取工具RegRipper
  4. Java常用日志框架介绍
  5. Cloud for Customer Restriction and Exclusion Product Lists
  6. 1.9 编程基础之顺序查找 01 查找特定的值
  7. shell 将两行内容合并到同一行
  8. es xxx_by_query
  9. 【GStreamer开发】GStreamer基础教程07——多线程和Pad的有效性
  10. 读书笔记_中国期货市场量化交易(李尉)05
  11. php 替换 超链接,php 替换字符串所有url为超链接,并给超链接添加nofollow的简单示例...
  12. RecyclerView 下拉刷新和加载更多
  13. ROS学习记录:创建一个工作空间和功能包,完成话题与服务编程
  14. 学习Java随记之swing编程(2)
  15. flying saucer技术生成pdf文档
  16. dependency标签
  17. 路径规划——RRT算法实现
  18. 力扣14最长公共子串
  19. Love Deterrence【MMD动作+镜头下载】
  20. 新颖的基于物联网毕业设计题目50例

热门文章

  1. bert模型中的[CLS]、[UNK]、[SEP]是什么意思?
  2. QT笔记——临时的悬浮窗口
  3. 【KMP】Radio Transmission(最小循环子串)
  4. tf.extract_image_patches
  5. python壁纸高清图片_详解Python静态网页爬取获取高清壁纸
  6. bigdata_舆情挖掘项目
  7. php人民币小写转大写函数
  8. 环形队列、 条带环形队列 Striped-RingBuffer (史上最全)
  9. 2020北航计算机夏令营
  10. 华为软开面经(许愿OC)