罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化

简介: 罗德里格斯公式推导,以及如何使用cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化

1 罗德里格斯公式推导

在三维空间中,旋转矩阵R 可以对坐标系(基向量组)进行刚性的旋转变换:

$$ R=\left[\begin{array}{lll} r_{x x} & r_{x y} & r_{x z} \\ r_{y x} & r_{y y} & r_{y z} \\ r_{z x} & r_{z y} & r_{z z} \end{array}\right] $$

2 cv2.Rodrigues进行旋转矩阵和旋转向量之间的相互转化

我们在使用retval, rvec, tvec = cv2.solvePnP(objp, imgp, K, D_0, flags=cv2.SOLVEPNP_ITERATIVE)会计算得到一个旋转向量rvec,但是我们通常需要把这个旋转向量转换为旋转矩阵。

而opencv内置的cv.Rodrigues()函数可以进行将:

  • 旋转向量转换为旋转矩阵
  • 或把旋转矩阵转换为旋转向量

1、Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian

  • 输入src:旋转向量((3,1)或者(1,3))或者旋转矩阵(3,3);
  • 输出dst:旋转矩阵(3,3)或者旋转向量((3,1)或者(1,3));
  • 输出jacobin:可选项,输出雅克比矩阵(3x9或者9x3),输入数组对输出数组的偏导数。

2、代码

import cv2
import numpy as np

extrinsic = np.array([[0.05812254, 0.9969995, 0.05112498, 0.043909],
                    [-0.02821786, -0.04955038, 0.99837293, -0.026862],
                    [0.99791058, -0.05947061, 0.02525319, -0.006717],
                    [0., 0., 0., 1.]])
rot_mat = extrinsic[:3, :3]
print(f"rot_mat:\n {rot_mat}")

# 把旋转矩阵转化为旋转向量
rvec, _ = cv2.Rodrigues(rot_mat)
print(f"rvec:\n {rvec}")

# 把旋转向量转换为旋转矩阵
rot_mat, _ = cv2.Rodrigues(rvec)
print(f"rot_mat:\n {rot_mat}")

输出结果如下:

rot_mat:
 [[ 0.05812254  0.9969995   0.05112498]
 [-0.02821786 -0.04955038  0.99837293]
 [ 0.99791058 -0.05947061  0.02525319]]
rvec:
 [[-1.25346463]
 [-1.12186936]
 [-1.21480507]]
rot_mat:
 [[ 0.05812254  0.9969995   0.05112498]
 [-0.02821786 -0.04955038  0.99837293]
 [ 0.99791058 -0.05947061  0.02525319]]

注意:

使用cv.Rodrigues把旋转矩阵转换为旋转向量,这个旋转向量并不是欧拉角,因此通过这个旋转矩阵和我们用欧拉角转换得到的旋转矩阵也是有区别的!!!!

目录
相关文章
疲劳检测-闭眼检测(详细代码教程)
疲劳检测-闭眼检测(详细代码教程)
|
传感器 机器学习/深度学习 自动驾驶
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
6348 1
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
18251 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
传感器 C++ 计算机视觉
【opencv3】详述PnP测距完整流程(附C++代码)
【opencv3】详述PnP测距完整流程(附C++代码)
1879 0
|
Ubuntu Windows
教你彻底卸载Ubuntu双系统,去污不残留
教你彻底卸载Ubuntu双系统,去污不残留
7110 0
教你彻底卸载Ubuntu双系统,去污不残留
|
8月前
|
编解码 资源调度 算法
深度图与点云去噪实战:双边滤波+统计/半径滤波原理与Open3D全实现
本文系统讲解3D视觉中深度图与点云的工业级去噪方案:详解统计滤波(剔孤立点)、半径滤波(除稀疏噪点簇)及双边滤波(边缘保留平滑),提供Open3D+OpenCV全流程代码,支持深度图预处理→点云生成→联合去噪,兼顾精度、效率与鲁棒性。(239字)
1296 6
|
10月前
|
存储 数据采集 算法
具身智能:零基础入门睿尔曼机械臂(六)——手眼标定代码库详解,从原理到实践
本文详解睿尔曼手眼标定代码库,涵盖眼在手上与眼在手外两种模式的实现原理及核心代码解析。内容包括数据采集、位姿处理、相机标定与手眼矩阵求解全流程,结合OpenCV的Tsai算法实现高精度坐标转换,助力机器人视觉精准抓取应用开发。
1283 3
|
机器学习/深度学习 传感器 编解码
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
DINOv3是Meta推出的自监督视觉模型,支持冻结主干、仅训练轻量任务头即可在分割、深度估计等任务上达到SOTA,极大降低训练成本。其密集特征质量优异,适用于遥感、工业检测等多领域,真正实现“一个模型走天下”。
6551 2
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
7313 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达