我有一个包含一些边界框的输入图像,并且我试图对其进行旋转,以使边界框仍然可以绑定相同的对象。这是输入图像:
两个边界框具有以下坐标:
# 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
有人知道为什么计算出的坐标如此之远吗?
编辑:
代码已更改为占所有四个框角。
答案 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)矢量