已知中心点、长宽和旋转角度,求矩形的四个顶点坐标
- 理论基础
- 情况一:
- 情况二:
- python代码实现
理论基础
本次实现有几个前提:
- 已知的信息如下形式:[x_center, y_center, w, h, angle],其中默认是矩形最长的边,即。
- 已知的旋转角度是矩形的最长边相对于坐标轴的旋转角度
- 旋转角度的旋转区间在
可以将情况分为两种,即和
情况一:
先看第一种情况:
先来求,用到图中绿色的辅助线,用到的三角形都标注了角:
再来求,用到图中紫色的辅助线:
接下来的和就是和关于的对称点,只需要将正项变为负项,负项变为正项即可:
情况二:
先来求,用到图中绿色的辅助线,用到的三角形都标注了角:
和就是和关于的对称点。
可以看到两种情况下,得到的四个点的值是一样的,比如情况一里和情况二里一样,所以在代码实现里可以不分情况讨论,不影响最终结果。
python代码实现
def get_corners(box): #这里本人项目yaw [-pi/4, 3*pi/4),需要映射到[0, pi)
box = box.detach().cpu().numpy()
x = box[0]
y = box[1]
w = box[2]
l = box[3]
yaw = box[4]
if yaw <0: #用来映射
yaw = yaw + np.pi
bev_corners = np.zeros((4, 2), dtype=np.float32)
cos_yaw = np.cos(yaw)
sin_yaw = np.sin(yaw)
bev_corners[0, 0] = (w / 2) * cos_yaw - (l / 2) * sin_yaw +x
bev_corners[0, 1] = (w / 2)* sin_yaw + (l / 2) * cos_yaw +y
bev_corners[1, 0] = (l / 2) * sin_yaw + (w / 2) * cos_yaw +x
bev_corners[1, 1] = (w / 2)* sin_yaw - (l / 2) * cos_yaw +y
bev_corners[2, 0] = (-w / 2) * cos_yaw - (-l / 2) * sin_yaw +x
bev_corners[2, 1] = (-w / 2)* sin_yaw + (-l / 2) * cos_yaw +y
bev_corners[3, 0] = (-l / 2) * sin_yaw + (-w / 2) * cos_yaw +x
bev_corners[3, 1] = (-w / 2)* sin_yaw - (-l / 2) * cos_yaw +y
return bev_corners
文章出处登录后可见!
已经登录?立即刷新