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

目录
相关文章
|
20天前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
89 0
|
3月前
|
计算机视觉
图像处理之给定任意四点不规则放缩
图像处理之给定任意四点不规则放缩
24 3
|
1月前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
36 2
|
20天前
|
Python
python实现:旋转矩阵转换为四元数
python实现:旋转矩阵转换为四元数
27 0
|
1月前
第4章-变换-4.1-基础变换
第4章-变换-4.1-基础变换
13 0
|
4月前
|
数据可视化
R语言进行数据结构化转换:Box-Cox变换、“凸规则”变换方法
R语言进行数据结构化转换:Box-Cox变换、“凸规则”变换方法
|
4月前
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
用图直观上理解梯度算子(一阶)与拉普拉斯算子(二阶)的区别,线检测与边缘检测的区别
120 1
|
4月前
|
机器学习/深度学习 算法 C#
C# | 凸包算法之Jarvis,寻找一组点的边界/轮廓
这篇关于凸包算法的文章,本文使用C#和Jarvis算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多边形。凸多边形是指多边形中的每个内角都小于180度的多边形。 凸包算法有什么用呢? 凸包算法的作用是找到这个凸多边形,并且使用最少的点来绘制出它的轮廓。凸包算法在计算机图形学、计算几何和机器学习等领域中有着广泛的应用。
63 0
|
数据可视化 图形学
【数学篇】08 # 如何利用三角剖分和向量操作描述并处理多边形?
【数学篇】08 # 如何利用三角剖分和向量操作描述并处理多边形?
91 0
【数学篇】08 # 如何利用三角剖分和向量操作描述并处理多边形?