旋转矩阵,表示边界框X度

时间:2018-04-14 10:54:39

标签: python numpy math rotation

我有图像,旋转30度。 但是我也需要旋转边界框。边界框的协调为Substring(xmin,ymin)=左上角,(xmax,ymax)=右下角。

现在我想通过在旋转矩阵上运行它来旋转这个矩阵

[xmin,ymin,xmax,ymax] = [101,27,270,388]

使用

theta = np.radians(30)
c, s = np.cos(theta), np.sin(theta)
r = np.array(((c,-s), (s, c)))

但这会导致错误的值。如果我没有弄错线性转换应该是正确的我是否忽略了某些东西或者我在某处犯了错误?谢谢你的帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

选项1

您只需在angle中使用patches.Rectangle参数:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import numpy as np
from skimage import data, io, filters

im = np.array(data.coins(), dtype=np.uint8)

# Create figure and axes
fig,ax = plt.subplots(1)

# Display the image
ax.imshow(im)

# Create a Rectangle patch
rect = patches.Rectangle((50,100),100,80,linewidth=1,edgecolor='r',facecolor='none')
rect_2 = patches.Rectangle((50,100),100,80,linewidth=1,edgecolor='r',facecolor='none', angle=30)

# Add the patch to the Axes
ax.add_patch(rect)
ax.add_patch(rect_2)

plt.show()

enter image description here

选项2

或者如果您想以数学方式执行此操作,请使用旋转矩阵。我只是告诉你如何计算旋转框的角点

上一个角点

enter image description here

首先我设置了未旋转的点:

x = [101,101,270, 270]
y = [27, 388, 27,388]

现在我们创建旋转矩阵

rot_mat = np.array([[np.cos(pi/6), -np.sin(pi/6)], [ np.sin(pi/6), np.cos(pi/6)]])

现在我们通过移动它们来集中xy(以便矩形的中心等同于原点)

x_cen = np.array(x) - np.mean(x)
y_cen = np.array(y) -np.mean(y)

将旋转矩阵应用于集中式阵列并向后移动

x_rot = np.dot(rot_mat, np.array((x_cen,y_cen)))[0,:] + np.mean(x)
y_rot = np.dot(rot_mat, np.array((x_cen,y_cen)))[1,:] + np.mean(x)

旋转角点:

enter image description here