1.名词解释
首先要明白什么是旋转,这就涉及一个名词“刚体变换”。
听上去十分抽象,可以从字面上理解,“刚体”就是一个不会发生形变的物体。在三维坐标系中,如果一个物体,不发生形变,只是进行旋转 和 平移 的运动,这种运动就叫做刚体变换。
Xc是相机坐标,X是世界坐标。R和T和相机的内部参数无关,所以被称作相机的外参。
2.旋转原理
因为在三维世界中,世界坐标系有三个自由度,x轴,y轴,z轴,所以旋转可以看作是分别绕着这三个光轴旋转后的变化。
看到上图,在已知三维坐标的情况下,就可以对三维点进行任意角度的旋转。
3.Python演示
假设旋转的角度是90°。
绕三个光轴的三个旋转矩阵很容易口算出来。
找了一个一边没封闭的正方形。
# encoding:utf-8
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
x = [0, 0, 0, 0]
y = [0, 0, 1, 1]
z = [0, 1, 1, 0]
a1 = np.array([0,0,0])
a2 = np.array([0,0,1])
a3 = np.array([0,1,1])
a4 = np.array([0,1,0])
a1 = np.mat(a1)
a2 = np.mat(a2)
a3 = np.mat(a3)
a4 = np.mat(a4)
R = np.array([[1,0,0],[0,0,1],[0,-1,0]])
R2 = np.array([[0,0,-1],[0,1,0],[1,0,0]])
R3 = np.array([[0,1,0],[-1,0,0],[0,0,1]])
print R
aa1 = R*a1.T
aa2 = R*a2.T
aa3 = R*a3.T
aa4 = R*a4.T
x = [aa1.item(0), aa2.item(0), aa3.item(0), aa4.item(0)]
y = [aa1.item(1), aa2.item(1), aa3.item(1), aa4.item(1)]
z = [aa1.item(2), aa2.item(2), aa3.item(2), aa4.item(2)]
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(x, y, z)
plt.show()
旋转结果:
原图
绕x轴旋转90°
绕y轴旋转90°
绕z轴旋转90°