如何获取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
相关产品推荐
相关产品推荐

