Python旋转矩阵与旋转向量的相互转换(OpenCV)

Posted Xavier Jiezou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python旋转矩阵与旋转向量的相互转换(OpenCV)相关的知识,希望对你有一定的参考价值。

引言

因为任意旋转矩阵仅有 3 个自由度,因此旋转向量是旋转矩阵的一个方便和最紧凑的表示。在全局 3D 几何优化中常用到旋转矩阵和旋转向量的相互转换,例如相机标定、PnP 问题的求解等。本文介绍基于 OpenCV-Python 的互转换实现方法。

方法

Rodrigues()
void cv::Rodrigues(InputArray 	src,
                   OutputArray 	dst,
                   OutputArray 	jacobian = noArray() 
                  )		
Python:
	cv.Rodrigues(src[, dst[, jacobian]]) ->	dst, jacobian

参数详解

  • src:输入旋转向量(3x1 或 1x3)或旋转矩阵(3x3);
  • dst:输出旋转矩阵(3x3)或旋转向量(3x1 或 1x3);
  • jacobian:可选输出,雅可比矩阵,3x9 或 9x3,它是输出数组分量相对于输入数组分量的偏导数矩阵。

实验

通过 OpenCV 提供的 Rodrigues 函数即可实现旋转矩阵与旋转向量的相互转换。

  • R_vec:表示旋转向量;
  • R_mat:表示旋转矩阵。

旋转向量➡旋转矩阵

>>> import numpy as np
>>> import cv2 as cv
>>> R_vec = np.array([[0.1], [0.1], [0.1]])
>>> R_mat = cv.Rodrigues(R_vec)[0]
>>> R_mat
array([[ 0.99002498, -0.09451324,  0.10448826],
       [ 0.10448826,  0.99002498, -0.09451324],
       [-0.09451324,  0.10448826,  0.99002498]])

旋转矩阵➡旋转向量

>>> import numpy as np
>>> import cv2 as cv
>>> R_mat = np.array([
...        [ 0.99002498, -0.09451324,  0.10448826],
...        [ 0.10448826,  0.99002498, -0.09451324],
...        [-0.09451324,  0.10448826,  0.99002498]])
>>> R_vec = cv.Rodrigues(R_mat)[0]
>>> R_vec
array([[0.1],
       [0.1],
       [0.1]])

参考

OpenCV: Camera Calibration and 3D Recongtruction

以上是关于Python旋转矩阵与旋转向量的相互转换(OpenCV)的主要内容,如果未能解决你的问题,请参考以下文章

Python旋转矩阵与旋转向量的相互转换(OpenCV)

从两个变换的 3D 向量推导出 3D 旋转矩阵

三维坐标下的旋转

变换矩阵

旋转矩阵未正确应用于向量

将四元数旋转转换为旋转矩阵?