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

如何获取PyQtGraph中经缩放/旋转的矩形ROI的四个角坐标?

获取PyQtGraph RectROI旋转缩放后的四个角坐标

嘿,你说得太对了——手动用三角函数计算旋转后ROI的角点真的很容易踩坑,比如角度超过360°、旋转中心偏移这些细节稍不注意就出错。好在PyQtGraph已经内置了完善的坐标变换工具,完全不用自己折腾这些数学问题!

方法1:用mapToScene()转换本地角点

RectROI的所有变换(平移、旋转、缩放)都被封装在它的坐标系统里,我们只需要先定义ROI自身坐标系下的四个角点,再通过mapToScene()把它们转换到全局(ImageView的)坐标就行:

# 定义ROI本地坐标系的四个角点
# 注:RectROI的pos()是未变换时的左上角,size()是宽高
local_corners = [
    QtCore.QPointF(0, 0),                      # 左上角
    QtCore.QPointF(roi.size()[0], 0),          # 右上角
    QtCore.QPointF(roi.size()[0], roi.size()[1]),  # 右下角
    QtCore.QPointF(0, roi.size()[1])           # 左下角
]

# 转换为全局坐标
global_corners = [roi.mapToScene(pt) for pt in local_corners]

# 转成numpy数组方便后续数据处理
global_corners_np = np.array([(pt.x(), pt.y()) for pt in global_corners])

方法2:用变换矩阵批量处理(适合numpy场景)

如果你习惯用numpy数组操作,可以直接获取ROI的变换矩阵,批量映射所有角点:

import numpy as np

# 构造本地角点的numpy数组
local_corners_np = np.array([
    [0, 0],
    [roi.size()[0], 0],
    [roi.size()[0], roi.size()[1]],
    [0, roi.size()[1]]
])

# 获取ROI的变换矩阵(自动整合平移、旋转、缩放)
transform = roi.transform()

# 应用变换得到全局坐标
global_corners_np = transform.map(local_corners_np)

为什么这比手动计算更靠谱?

PyQtGraph的transform()已经帮我们处理了所有复杂的变换逻辑:

  • 自动处理角度循环(比如370°会被等价为10°,负角度也会正确转换)
  • 自动考虑ROI的旋转中心(你代码里设置的是ROI中心[0.5, 0.5])
  • 同步处理缩放和旋转的叠加效果
  • 完全匹配ImageView的坐标系统(左上角为原点)

这样你就能轻松拿到准确的四个角坐标,不用再纠结三角函数的细节啦!

内容的提问来源于stack exchange,提问作者a.smiet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:14