【问题标题】:How to combine OpenCV with PyQt to create a simple GUI?如何将 OpenCV 与 PyQt 结合起来创建一个简单的 GUI?
【发布时间】:2015-04-01 16:13:41
【问题描述】:

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

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

我的目标是用一个按钮替换键 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()

输出:

这是一个简单的 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()

如何混合这两个代码以达到我的目标?

【问题讨论】:

    标签: python python-2.7 opencv pyqt4


    【解决方案1】:

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

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

    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 是使用self.capture.read() 获得的帧)。

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

    【讨论】:

      【解决方案2】:

      根据您的帖子修改了一些代码,我没有使用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_()
      

      【讨论】:

      • 感谢您的尝试。首先,我确实需要使用 OpenCV 进行图像处理。其次,我在编译你的代码时遇到了几个错误。为努力 +1。
      • 此代码似乎正确。处理在 OpenCV 中(例如,查看 cv2.cvtColor),并且仅使用 Qt(QPixmap)处理显示,这很好。我在很多脚本中都在做同样的事情。将图像从 cv 转换为 qt 时要小心(在网上搜索转换器)!
      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 2013-03-14
      • 2018-06-24
      • 2018-03-05
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多