罗德里格斯公式推导,以及如何使用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旋转矩阵转换为旋转向量,这个旋转向量并不是欧拉角,因此通过这个旋转矩阵和我们用欧拉角转换得到的旋转矩阵也是有区别的!!!!

目录
相关文章
|
传感器 C++ 计算机视觉
【opencv3】详述PnP测距完整流程(附C++代码)
【opencv3】详述PnP测距完整流程(附C++代码)
1690 0
疲劳检测-闭眼检测(详细代码教程)
疲劳检测-闭眼检测(详细代码教程)
|
传感器 机器学习/深度学习 自动驾驶
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
5987 1
自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
6440 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
1682 0
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
1754 0
三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
存储 Ubuntu 机器人
机械臂手眼标定详解
这篇文章是关于机械臂手眼标定的详细教程,包括了使用ROS1 Noetic和Realsense D415相机在Ubuntu 20.04环境下进行标定的步骤和配置方法。
3599 0
机械臂手眼标定详解
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
3142 3
|
机器学习/深度学习 算法 Ubuntu
【ROS_Driver驱动真实UR机械臂】
【ROS_Driver驱动真实UR机械臂】
2684 0

热门文章

最新文章