You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从pyqtgraph的EllipseROI中获取旋转后椭圆的中心?

获取pyqtgraph EllipseROI旋转后的椭圆中心

要解决这个问题,首先得明确EllipseROI的pos()返回的是其未旋转时边界矩形的左上角顶点,而非椭圆中心——当你旋转或移动ROI后,这个顶点的位置会变化,但我们可以通过ROI的坐标变换来计算出实际的椭圆中心。

方法一:利用ROI的坐标映射方法(最可靠)

pyqtgraph的ROI类提供了mapToParent()方法,可以直接将ROI局部坐标系中的点转换为父坐标系(也就是画布坐标系)中的位置。步骤如下:

  1. 先算出椭圆在ROI局部坐标系中的中心:因为局部坐标系的原点是pos(),所以中心就是半宽和半高的位置,即(width/2, height/2)。
  2. 使用mapToParent()将这个局部中心映射到全局坐标系,得到旋转后的实际中心。

代码示例:

import pyqtgraph as pg

# 假设你已经创建并调整了EllipseROI
ellipse = pg.EllipseROI(pos=[200, 200], size=125, pen='r', movable=True)

# 获取ROI的当前参数
x0 = ellipse.pos().x()
y0 = ellipse.pos().y()
width = ellipse.size()[0]
height = ellipse.size()[1]
angle = ellipse.angle()

# 计算局部坐标系中的椭圆中心
local_center = pg.QtCore.QPointF(width / 2, height / 2)

# 映射到全局坐标系,得到旋转后的实际中心
global_center = ellipse.mapToParent(local_center)

# 提取中心坐标
center_x = global_center.x()
center_y = global_center.y()

print(f"旋转后椭圆中心坐标:({center_x:.2f}, {center_y:.2f})")

方法二:手动计算变换(理解原理用)

如果你想手动实现坐标变换,需要考虑旋转和平移的顺序:ROI的变换是先绕局部原点旋转,再平移到pos()的位置。手动计算的公式如下(注意pyqtgraph的angle()返回的是顺时针旋转的角度,需要转换为弧度):

import math
from PyQt5.QtCore import QPointF

# 角度转弧度(顺时针)
angle_rad = math.radians(angle)

# 局部中心相对于pos的偏移量
dx = width / 2
dy = height / 2

# 旋转偏移量
rotated_dx = dx * math.cos(angle_rad) + dy * math.sin(angle_rad)
rotated_dy = -dx * math.sin(angle_rad) + dy * math.cos(angle_rad)

# 实际中心 = pos + 旋转后的偏移量
center_x = x0 + rotated_dx
center_y = y0 + rotated_dy

为什么直接用pos() + size/2不对?

因为当你旋转EllipseROI时,pos()对应的边界矩形左上角会偏离原来的位置,此时pos() + size/2得到的是未旋转时的中心位置,而非旋转后的实际中心——只有当ROI没有旋转时,这个值才是正确的。

内容的提问来源于stack exchange,提问作者apogalacticon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:23