已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

已知中心点、长宽和旋转角度,求矩形的四个顶点坐标

  • 理论基础
    • 情况一:已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
    • 情况二:已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • python代码实现

理论基础

本次实现有几个前提:

  • 已知的信息如下形式:[x_center, y_center, w, h, angle],其中默认已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)是矩形最长的边,即已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知的旋转角度已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)是矩形的最长边已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)相对于已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)坐标轴的旋转角度
  • 旋转角度已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)的旋转区间在已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

可以将情况分为两种,即已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

情况一:已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

先看第一种情况已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

先来求已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python),用到图中绿色的辅助线,用到的三角形都标注了角已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

再来求已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python),用到图中紫色的辅助线:

  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

接下来的已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)就是已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)关于已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)的对称点,只需要将正项变为负项,负项变为正项即可:

  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

情况二:已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

先来求已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python),用到图中绿色的辅助线,用到的三角形都标注了角已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
  • 已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)就是已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)关于已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)的对称点。

可以看到两种情况下,得到的四个点的值是一样的,比如情况一里已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)和情况二里已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)一样,所以在代码实现里可以不分情况讨论,不影响最终结果。

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(1)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年8月22日
下一篇 2023年8月22日

相关推荐