我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

理论基础

本次实现有几个前提:

  • 已知的信息如下形式:[x_center, y_center, w, h, angle],其中默认 w w w是矩形最长的边,即 w>h w > h w>h
  • 已知的旋转角度 θ \theta θ是矩形的最长边 w w w相对于 x x x坐标轴的旋转角度
  • 旋转角度 θ \theta θ的旋转区间在 [0,π] [0, \pi] [0,π]

可以将情况分为两种,即 θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ[0,π/2] θ ∈ [ π / 2 , π ] \theta \in [\pi/2, \pi] θ[π/2,π]

情况一: θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ[0,π/2]

先看第一种情况 θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ[0,π/2]
在这里插入图片描述
已知矩形的中心点 ( x , y ) (x, y) (x,y),旋转角度 θ \theta θ在图中用橙色标注。

先来求 ( x1 , y1 ) (x_1,y_1) (x1,y1),用到图中绿色的辅助线,用到的三角形都标注了角 θ \theta θ

  • x 1 =x+cosθ∗w/2−sinθ∗h/2 x_1=x+cos\theta*w/2-sin\theta*h/2 x1=x+cosθw/2sinθh/2
  • y 1 =y+sinθ∗w/2+cosθ∗h/2 y_1=y+sin\theta*w/2+cos\theta*h/2 y1=y+sinθw/2+cosθh/2

再来求 ( x2 , y2 ) (x_2,y_2) (x2,y2),用到图中紫色的辅助线:

  • x 2 =x+cosθ∗w/2+sinθ∗h/2 x_2=x+cos\theta*w/2+sin\theta*h/2 x2=x+cosθw/2+sinθh/2
  • y 2 =y+sinθ∗w/2−cosθ∗h/2 y_2=y+sin\theta*w/2-cos\theta*h/2 y2=y+sinθw/2cosθh/2

接下来的 ( x3 , y3 ) (x_3,y_3) (x3,y3) ( x4 , y4 ) (x_4,y_4) (x4,y4)就是 ( x1 , y1 ) (x_1,y_1) (x1,y1) ( x2 , y2 ) (x_2,y_2) (x2,y2)关于 ( x , y ) (x, y) (x,y)的对称点,只需要将正项变为负项,负项变为正项即可:

  • x 3 =x−cosθ∗w/2+sinθ∗h/2 x_3=x-cos\theta*w/2+sin\theta*h/2 x3=xcosθw/2+sinθh/2
  • y 3 =y−sinθ∗w/2−cosθ∗h/2 y_3=y-sin\theta*w/2-cos\theta*h/2 y3=ysinθw/2cosθh/2
  • x 4 =x−cosθ∗w/2−sinθ∗h/2 x_4=x-cos\theta*w/2-sin\theta*h/2 x4=xcosθw/2sinθh/2
  • y 4 =y−sinθ∗w/2+cosθ∗h/2 y_4=y-sin\theta*w/2+cos\theta*h/2 y4=ysinθw/2+cosθh/2

情况二: θ ∈ [ π / 2 , π ] \theta \in [ \pi/2,\pi] θ[π/2,π]

在这里插入图片描述
同理,此时旋转角度 θ \theta θ大于 π / 2 \pi/2 π/2,所以用到的辅助三角形的角度标注为 π − θ \pi -\theta πθ

先来求 ( x1 , y1 ) (x_1,y_1) (x1,y1),用到图中绿色的辅助线,用到的三角形都标注了角 π − θ \pi -\theta πθ

  • x 1 =x−cos(π−θ)∗w/2+sin(π−θ)∗h/2=x+cosθ∗w/2+sinθ∗h/2 x_1=x-cos(\pi-\theta)*w/2+sin(\pi-\theta)*h/2=x+cos\theta*w/2+sin\theta*h/2 x1=xcos(πθ)w/2+sin(πθ)h/2=x+cosθw/2+sinθh/2
  • y 1 =y−sin(π−θ)∗w/2−cos(π−θ)∗h/2=y−sinθ∗w/2+cosθ∗h/2 y_1=y-sin(\pi-\theta)*w/2-cos(\pi-\theta)*h/2=y-sin\theta*w/2+cos\theta*h/2 y1=ysin(πθ)w/2cos(πθ)h/2=ysinθw/2+cosθh/2
  • x 2 =x−cos(π−θ)∗w/2−sin(π−θ)∗h/2=x+cosθ∗w/2−sinθ∗h/2 x_2=x-cos(\pi-\theta)*w/2-sin(\pi-\theta)*h/2=x+cos\theta*w/2-sin\theta*h/2 x2=xcos(πθ)w/2sin(πθ)h/2=x+cosθw/2sinθh/2
  • y 2 =y+sin(π−θ)∗w/2−cos(π−θ)∗h/2=y+sinθ∗w/2+cosθ∗h/2 y_2=y+sin(\pi-\theta)*w/2-cos(\pi-\theta)*h/2=y+sin\theta*w/2+cos\theta*h/2 y2=y+sin(πθ)w/2cos(πθ)h/2=y+sinθw/2+cosθh/2

( x3 , y3 ) (x_3,y_3) (x3,y3) ( x4 , y4 ) (x_4,y_4) (x4,y4)就是 ( x1 , y1 ) (x_1,y_1) (x1,y1) ( x2 , y2 ) (x_2,y_2) (x2,y2)关于 ( x , y ) (x, y) (x,y)的对称点。

可以看到两种情况下,得到的四个点的值是一样的,比如情况一里 ( x1 , y1 ) (x_1,y_1) (x1,y1)和情况二里 ( x2 , y2 ) (x_2,y_2) (x2,y2)一样,所以在代码实现里可以不分情况讨论,不影响最终结果。

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

来源地址:https://blog.csdn.net/weixin_45453121/article/details/129582622

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录