【问题标题】:how to get only image pixel from QGraphicsScene如何从 QGraphicsScene 仅获取图像像素
【发布时间】:2019-07-22 07:19:19
【问题描述】:

这是我在 pyqt python 3.7 中的 QGraphicsView 中显示图像的简单代码。当鼠标在 QGraphicsView 或 QGraphicsScene 的场景或窗口上按下时,我想要一个图像像素。

鼠标按下功能

鼠标按下事件处理程序

def mousePressEvent(self):
    p = QtGui.QCursor.pos()
    print("pressed here: ", p)

鼠标按下事件调用者

self.scene1.mousePressEvent = mousePressEvent

主代码

 import cv2
 from PyQt5 import QtCore, QtGui, QtWidgets
 from PyQt5.QtGui import *
 from PyQt5.QtWidgets import QGraphicsScene, QAction


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(20, 10, 761, 561))
        self.graphicsView.setObjectName("graphicsView")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #  ---- Mouse Press Event Handler ---- #
        def mousePressEvent(self):
            p = QtGui.QCursor.pos()  # Here I want image pixel coordinate (x,y) how we can..?
            print("pressed here: ", p)

        #  ---- Mouse Press Event caller ---- #
        self.scene1.mousePressEvent = mousePressEvent

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

        # -------------------------------------------------
        image = cv2.imread('lena.jpg')  # Read image
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

        height, width = image.shape  # read image size
        self.image_disp = QImage(image.data, width, height, QImage.Format_Grayscale8)
        # -------------------------------------------------
        self.scene1 = QGraphicsScene()
        pixMap = QPixmap.fromImage(self.image_disp)
        self.scene1.addPixmap(pixMap)
        self.graphicsView.setScene(self.scene1)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: opencv pyqt5 python-3.7 qgraphicsview qgraphicsscene


    【解决方案1】:

    您不应修改 Qt Designer 生成的类(1),而应创建另一个从小部件继承的类并将初始类用作接口。

    不要使用 self.scene1.mousePressEvent = mousePressEvent 覆盖 mousePressEvent 方法,因为您正在删除默认实现,而是可以创建一个继承自 QGraphicsScene 的类或使用事件过滤器,在这种情况下我将使用第二种方法。

    要获得鼠标相对于图像的位置 (QGraphicsPixmapItem),您必须使用 Qt 图形框架的不同元素之间的转换。

    import os
    
    import cv2
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
            self.graphicsView.setGeometry(QtCore.QRect(20, 10, 761, 561))
            self.graphicsView.setObjectName("graphicsView")
            MainWindow.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    
    
    class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setupUi(self)
    
            self.scene = QtWidgets.QGraphicsScene(self)
            self.graphicsView.setScene(self.scene)
            self.scene.installEventFilter(self)
    
            current_dir = os.path.dirname(os.path.realpath(__file__))
            filename = os.path.join(current_dir, "lena.jpg")
    
            image = cv2.imread(filename)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            height, width = image.shape
            image_disp = QtGui.QImage(
                image.data, width, height, QtGui.QImage.Format_Grayscale8
            )
            pixMap = QtGui.QPixmap.fromImage(image_disp)
            self.pixmap_item = self.scene.addPixmap(pixMap)
    
        def eventFilter(self, obj, event):
            if obj is self.scene and event.type() == QtCore.QEvent.GraphicsSceneMousePress:
                spf = event.scenePos()
                lpf = self.pixmap_item.mapFromScene(spf)
                brf = self.pixmap_item.boundingRect()
                if brf.contains(lpf):
                    lp = lpf.toPoint()
                    print(lp)
            return super().eventFilter(obj, event)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        w = MainWindow()
        w.show()
        sys.exit(app.exec_())
    

    (1)Using the Generated Code

    【讨论】:

    • 谢谢,朋友,经过一些修改后它对我有用,有没有其他方法可以获取像素值。
    • @ROHIT 如果我知道另一种方式,我会提出它,另一方面,如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做检查tour
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2011-11-19
    • 2013-07-21
    • 2017-09-24
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多