如何从pyqtgraph的EllipseROI中获取旋转后椭圆的中心?
获取pyqtgraph EllipseROI旋转后的椭圆中心
要解决这个问题,首先得明确EllipseROI的pos()返回的是其未旋转时边界矩形的左上角顶点,而非椭圆中心——当你旋转或移动ROI后,这个顶点的位置会变化,但我们可以通过ROI的坐标变换来计算出实际的椭圆中心。
方法一:利用ROI的坐标映射方法(最可靠)
pyqtgraph的ROI类提供了mapToParent()方法,可以直接将ROI局部坐标系中的点转换为父坐标系(也就是画布坐标系)中的位置。步骤如下:
- 先算出椭圆在ROI局部坐标系中的中心:因为局部坐标系的原点是
pos(),所以中心就是半宽和半高的位置,即(width/2, height/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
相关产品推荐
相关产品推荐

