轴旋转问题

时间:2018-10-04 11:27:28

标签: python image-processing

我有一个包含一些边界框的输入图像,并且我试图对其进行旋转,以使边界框仍然可以绑定相同的对象。这是输入图像:

enter image description here

两个边界框具有以下坐标:

# box 1
x_min=273
y_min=181
x_max=334
y_max=398

# box 2
x_min =383
y_min =185
x_max =473
y_max =407

将图像旋转50度时,新坐标的计算如下:

新坐标的计算如下:

import numpy as np
import cv2

theta = np.deg2rad(50)
xc = 640 / 2 # axis of rotation
yc = 480 / 2 # axis of rotation

x1 = xc + (x_min-xc) * np.cos(theta) - (y_min-yc)*np.sin(theta)
y1 = yc - (x_min-xc) * np.sin(theta) + (y_min-yc)*np.cos(theta)

x2 = xc + (x_max-xc) * np.cos(theta) - (y_min-yc)*np.sin(theta)
y2 = yc - (x_max-xc) * np.sin(theta) + (y_min-yc)*np.cos(theta)

x3 = xc + (x_min-xc) * np.cos(theta) - (y_max-yc)*np.sin(theta)
y3 = yc - (x_min-xc) * np.sin(theta) + (y_max-yc)*np.cos(theta)

x4 = xc + (x_max-xc) * np.cos(theta) - (y_max-yc)*np.sin(theta)
y4 = yc - (x_max-xc) * np.sin(theta) + (y_max-yc)*np.cos(theta)

a = min(x1, x2, x3, x4)
b = min(y1, y2, y3, y4)
c = max(x1, x2, x3, x4)
d = max(y1, y2, y3, y4)      

cv2.rectangle(img, (int(a), int(b)), (int(c), int(d)), (0,255,0), 2)

但是,我得到的坐标显示不正确:

a=167 b=190 c=374 d=378
a=231 b=86 c=461 d=299

enter image description here 绿色框是计算框,红色框是预期框。

有人知道为什么计算出的坐标如此之远吗?

编辑:

代码已更改为占所有四个框角。

1 个答案:

答案 0 :(得分:0)

您的一些迹象是错误的。

代替此:

x1new = xc + (x1-xc) * np.cos(theta) - (y1-yc)*np.sin(theta)
y1new = yc - (x1-xc) * np.sin(theta) + (y1-yc)*np.cos(theta)

您要这样(因为您的起源在左上角):

x1new = xc + (x1-xc) * np.cos(theta) + (y1-yc)*np.sin(theta)
y1new = yc - (x1-xc) * np.sin(theta) + (y1-yc)*np.cos(theta)

我发现,无论您使用哪种坐标系,最简单的方法就是假设旋转很小,可视化x轴的新方向(cos ϴ,-sin ϴ)=(大,-small),并确保将(1,0)向量映射到该向量上。然后可视化y轴的新方向(sin ϴ,cos ϴ)=(小,大),并确保您正在映射(0,1)矢量