我的目标是编码一个不能旋转的椭圆ROI。考虑从其中一个PyQtGraph示例修改的以下代码:
import numpy as np
import cv2
import pyqtgraph as pg
from PyQt5 import QtGui
import numpy.ma as ma
from PyQt5.QtWidgets import QMessageBox
pg.setConfigOptions(imageAxisOrder='row-major')
## Create image to display
image = cv2.imread('panda.jpg')
def picturetranspose(picture):
shape = picture.shape
result = np.empty((shape[1],shape[0],shape[2]),dtype= np.uint8)
for i in range(0,3):
result[:,:,i] = np.transpose(picture[:,:,i])
return result
arr = np.rot90(picturetranspose(image))
app = pg.mkQApp("ROI Examples")
w = pg.GraphicsLayoutWidget(show=True, size=(1000,800), border=True)
w.setWindowTitle('pyqtgraph example: ROI Examples')
w1 = w.addLayout(row=0, col=0)
v1a = w1.addViewBox(row=1, col=0, lockAspect = True)
v1a.setLimits(minXRange = arr.shape[0]//10, minYRange = arr.shape[1]//10, maxXRange = 5*arr.shape[0], maxYRange = 5*arr.shape[1])
img1a = pg.ImageItem(arr)
v1a.addItem(img1a)
rois = []
x=pg.EllipseROI([60, 10], [30, 20], pen=pg.mkPen('b', width=5),rotatable = False)
x.removeHandle(0)
rois.append(x)
for roi in rois:
roi.sigRegionChanged.connect(img1a.setImage(arr))
v1a.addItem(roi)
img1a.setImage(arr)这里的图像"panda.jpg“是由:uRX2JvlruMKvPX?usp=sharing提供的。运行代码并移动ROI将提供:

通过单击方形浅蓝手柄,可以更改ROI的大小。由于我设置了rotatable = False,ROI无法旋转,单击循环句柄将不会旋转ROI。
但是,行x.removeHandle(0)应该删除浅蓝色的圆形手柄,这样它就不会出现在屏幕上。这是个虫子吗?我错过了什么?
发布于 2022-06-01 02:11:52
当创建一个QGraphicsItem时,它不会立即添加到场景中,在那个时间框架内,一些与场景相关的方面将被“存储”,直到项目被实际放到场景中为止。其中一些属性非常明显(例如项位置),但其他属性则不明显。其中之一是添加子项。当一个“主”项目被添加到场景中时,它的所有子代(和孙子、曾孙等)都会被添加到场景中。都和它一起添加。
这就是创建ROI时所发生的情况:它的句柄是在它的__init__中创建的(参见资料来源),但是只有当ROI实际上有一个scene()时,removeHandle()才会从场景中移除句柄。
请记住,PyQt (和PySide)是Qt的绑定,这意味着我们总是使用C++对象的。即使删除了对python对象的最后一次引用,实际上也只删除了python对象,但是如果该对象是C++对象的包装器,并且该对象具有父对象,则实际对象毕竟不会被删除。
虽然pyqtGraph将句柄从其内部列表中移除,但表示句柄的C++对象仍然作为ROI的子对象存在,因此,当ROI被添加到场景时,句柄仍然存在。
一个可能的解决方案是在将ROI添加到场景后移除手柄:
for roi in rois:
roi.sigRegionChanged.connect(img1a.setImage(arr))
v1a.addItem(roi)
roi.removeHandle(0)这是因为removeHandle只在项目的场景存在时才移除句柄,这样子项才能实际从场景中移除。
注意,根据源,EllipseROI添加了两个句柄:旋转和缩放。您可能想要删除所有这些内容:
for roi in rois:
roi.sigRegionChanged.connect(img1a.setImage(arr))
v1a.addItem(roi)
while roi.handles:
roi.removeHandle(0)我建议您在吡咯烷图储存库上提交一份关于这一点的报告,在他们这边解决这个问题应该相当容易。
https://stackoverflow.com/questions/72438584
复制相似问题