【问题标题】:Display OpenCv window on top of PyQt's main window在 PyQt 的主窗口顶部显示 OpenCv 窗口
【发布时间】:2015-11-20 11:03:05
【问题描述】:

我制作了一个 opencv 项目,它处理来自视频的输入流并显示处理后的输出。我使用 PyQt 按钮从一个输出切换到另一个输出。我的 PyQt 窗口几乎覆盖了整个屏幕,当我单击按钮时,opencv 窗口仍保留在 PyQt 窗口后面。另外,我已将 PyQt 的主窗口设为我的父窗口。如何将 opencv 窗口置于 PyQt 窗口之上。我搜索了 cvGetWindowHandle(),但没有找到它的 python 实现。

我用过PyQt4和opencv2,PyQt窗口还没有用QtDesigner设计过。

【问题讨论】:

  • 你可以试试here的一些技巧吗?我也为此苦苦挣扎,但类似这些解决方案的方法最终对我有用。

标签: python opencv pyqt4


【解决方案1】:

您总是可以将OpenCV 窗口包裹在Qt 小部件中...

class QtCapture(QtGui.QWidget):
    def __init__(self, *args):
        super(QtGui.QWidget, self).__init__()

        self.fps = 24
        self.cap = cv2.VideoCapture(*args)

        self.video_frame = QtGui.QLabel()
        lay = QtGui.QVBoxLayout()
        lay.setMargin(0)
        lay.addWidget(self.video_frame)
        self.setLayout(lay)

    def setFPS(self, fps):
        self.fps = fps

    def nextFrameSlot(self):
        ret, frame = self.cap.read()
        # OpenCV yields frames in BGR format
        frame = cv2.cvtColor(frame, cv2.cv.CV_BGR2RGB)
        img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888)
        pix = QtGui.QPixmap.fromImage(img)
        self.video_frame.setPixmap(pix)

    def start(self):
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.nextFrameSlot)
        self.timer.start(1000./self.fps)

    def stop(self):
        self.timer.stop()

    def deleteLater(self):
        self.cap.release()
        super(QtGui.QWidget, self).deleteLater()

...随心所欲地使用它:

class ControlWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.capture = None

        self.start_button = QtGui.QPushButton('Start')
        self.start_button.clicked.connect(self.startCapture)
        self.quit_button = QtGui.QPushButton('End')
        self.quit_button.clicked.connect(self.endCapture)
        self.end_button = QtGui.QPushButton('Stop')

        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.start_button)
        vbox.addWidget(self.end_button)
        vbox.addWidget(self.quit_button)
        self.setLayout(vbox)
        self.setWindowTitle('Control Panel')
        self.setGeometry(100,100,200,200)
        self.show()

    def startCapture(self):
        if not self.capture:
            self.capture = QtCapture(0)
            self.end_button.clicked.connect(self.capture.stop)
            self.capture.setFPS(30)
            self.capture.setParent(self)
            self.capture.setWindowFlags(QtCore.Qt.Tool)
        self.capture.start()
        self.capture.show()

    def endCapture(self):
        self.capture.deleteLater()
        self.capture = None


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = ControlWindow()
    sys.exit(app.exec_())

【讨论】:

  • 感谢您的帖子。我已经在 Qt 小部件中包装了我的 OpenCV 窗口,它工作正常 :)
猜你喜欢
  • 2023-01-26
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
相关资源
最近更新 更多