복붙노트

[PYTHON] 간단한 GUI를 만들기 위해 OpenCV와 PyQt를 결합하는 방법은 무엇입니까?

PYTHON

간단한 GUI를 만들기 위해 OpenCV와 PyQt를 결합하는 방법은 무엇입니까?

이미지에서 많은 작업을 수행해야합니다. 그래서 OpenCV를 사용했습니다. OpenCV는 이미지 처리에서 매우 효율적이지만 적절한 GUI를 제시하는 것은 그리 좋지 않습니다. 그래서 PyQt를 사용하여 내 이미지를 처리하기 위해 사용자 지정 GUI와 OpenCV를 그리기로 결정했습니다.

설명서에서 직접 선택한 매우 간단한 프로그램을 만들었습니다. 간단히 jpg 그림을 읽고 png 형식으로 저장합니다.

필자의 목표는 키를 버튼으로 대체하여 눌러서 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()

목표를 달성하기 위해 2 가지 코드를 어떻게 혼합 할 수 있습니까?

해결법

  1. ==============================

    1.귀하의 게시물을 기반으로 몇 가지 코드를 수정, 나는 이미지를 렌더링하는 대신 QPixmap 그것을 사용하여 Opencv를 사용하지 않았다. 그런 다음 KeyPressEvent를 사용하여 사용자 입력을 캡처하십시오.

    귀하의 게시물을 기반으로 몇 가지 코드를 수정, 나는 이미지를 렌더링하는 대신 QPixmap 그것을 사용하여 Opencv를 사용하지 않았다. 그런 다음 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_()
    
  2. from https://stackoverflow.com/questions/28282434/how-to-combine-opencv-with-pyqt-to-create-a-simple-gui by cc-by-sa and MIT license