在PyQt的主风上显示OpenCv窗口

2024-09-30 10:37:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我使用了PyQt4和opencv2,PyQt窗口没有使用QtDesigner设计。在


Tags: 项目视频屏幕按钮opencvpyqtpyqt4opencv2
1条回答
网友
1楼 · 发布于 2024-09-30 10:37:42

您可以始终将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()

…你想怎么做都行:

^{pr2}$

相关问题 更多 >

    热门问题