如何将OpenCV与PyQt结合起来创建一个简单的GUI?

时间:2015-02-02 16:40:26

标签: python python-2.7 opencv pyqt4

我需要对图像执行大量操作。所以我使用了OpenCV。 OpenCV在图像处理方面非常有效,但是提供合适的GUI并不太好。所以我决定使用PyQt绘制自定义GUI和OpenCV来处理我的图像。

我创建了一个非常简单的程序,您直接从文档中选择。我只需阅读jpg图片,然后按png键将其保存为s格式。

我的目标是用按钮替换键s以按下以使用PyQt执行相同的操作。另外,我希望PyQt显示的窗口具有与OpenCV相同的行为:主要说来,函数imshow()显示适合图像大小的窗口。

这是我的OpenCV简单代码:

import numpy 
import cv2

class LoadImage:
    def loadImage(self):
        img = cv2.imread('photo.jpg')
        cv2.imshow('Image on a window',img)
        k = cv2.waitKey(0)
        if k == 27:
            cv2.destroyAllWindows()
        elif k == ord('s'):
            cv2.imwrite('photopng.png',img)
            cv2.destroyAllWindows()

if __name__=="__main__":
    LI=LoadImage()
    LI.loadImage()

输出:

enter image description here

这是一个简单的PyQt代码,用于绘制一个简单的窗口:

import sys
from PyQt4 import QtGui

class DrawWindow:
    def drawWindow(self):
        app=QtGui.QApplication(sys.argv)
        w=QtGui.QWidget()
        #w.resize(250,250)
        w.move(300,300)
        w.setWindowTitle("Simple Window")
        w.show()

        sys.exit(app.exec_())

if __name__=="__main__":
    DW=DrawWindow()
    DW.drawWindow()

如何将两个代码混合以实现我的目标?

2 个答案:

答案 0 :(得分:11)

根据您的帖子修改了一些代码,我没有使用Opencv来渲染图像,而是使用QPixmap来渲染它。然后使用KeyPressEvent捕获用户输入。

# -*- coding: utf-8 -*-


import numpy
import cv2
from PyQt4.QtGui import *
from PyQt4.QtCore import *


class MyDialog(QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)

        self.cvImage = cv2.imread(r'cat.jpg')
        height, width, byteValue = self.cvImage.shape
        byteValue = byteValue * width

        cv2.cvtColor(self.cvImage, cv2.COLOR_BGR2RGB, self.cvImage)

        self.mQImage = QImage(self.cvImage, width, height, byteValue, QImage.Format_RGB888)

    def paintEvent(self, QPaintEvent):
        painter = QPainter()
        painter.begin(self)
        painter.drawImage(0, 0, self.mQImage)
        painter.end()

    def keyPressEvent(self, QKeyEvent):
        super(MyDialog, self).keyPressEvent(QKeyEvent)
        if 's' == QKeyEvent.text():
            cv2.imwrite("cat2.png", self.cvImage)
        else:
            app.exit(1)


if __name__=="__main__":
    import sys
    app = QApplication(sys.argv)
    w = MyDialog()
    w.resize(600, 400)
    w.show()
    app.exec_()

答案 1 :(得分:0)

您可以直接从OpenCV读取的图像数据创建QImage,使用QPixmap将其转换为QPixmap.fromImage,然后使用它来设置{{1} },使用QLabel方法。

本页显示了如何使用PySide和OpenVC来查看网络摄像头:https://gist.github.com/bsdnoobz/8464000。通过注释掉这两行,我也将其用于视频

setPixmap

,而不是使用

self.capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, self.video_size.width())
self.capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, self.video_size.height())

在视频帧上(其中resized_bgr_frame = cv2.resize( bgr_frame, (self.video_size.width(), self.video_size.height()), interpolation=cv2.INTER_CUBIC if self.video_size.width() > bgr_frame.shape[1] else cv2.INTER_AREA) 是通过bgr_frame获得的帧)。

(请注意,这里的OpenCV常量有一些不同的命名和命名空间约定,可能是由于self.capture.read()版本不同导致的?)