2015-02-02 2 views
11

Ich muss viele Operationen auf einem Bild durchführen. Also habe ich OpenCV benutzt. OpenCV ist sehr effizient in der Bildverarbeitung, aber es ist nicht gut, eine geeignete GUI zu präsentieren. Also entschied ich mich, PyQt zu verwenden, um eine benutzerdefinierte GUI und OpenCV zu zeichnen, um mein Bild zu verarbeiten.Wie kombiniere ich OpenCV mit PyQt, um eine einfache GUI zu erstellen?

Ich habe ein sehr einfaches Programm erstellt, das Sie direkt aus der Dokumentation ausgewählt haben. Ich lese einfach ein jpg Bild und speichern Sie es in einem png Format durch Drücken der Taste s.

Mein Ziel ist es, den Schlüssel s durch eine Taste zu ersetzen, um die gleiche Aktion mit PyQt durchzuführen. Außerdem möchte ich, dass das von PyQt angezeigte Fenster das gleiche Verhalten wie OpenCV hat: Hauptsächlich zeigt die Funktion imshow() ein Fenster an, das zur Bildgröße passt.

Hier ist mein OpenCV einfacher Code:

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() 

Ausgang:

enter image description here

Hier ist ein einfacher PyQt Code ein einfaches Fenster zu zeichnen:

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() 

Wie kann Ich mische die 2 Codes, um mein Ziel zu erreichen?

Antwort

9

Modifiziert einige Code basierend auf Ihrem Beitrag, ich habe nicht das Opencv verwendet, um das Bild zu rendern, stattdessen mit QPixmap, um es zu rendern. Verwenden Sie dann KeyPressEvent, um die Benutzereingabe zu erfassen.

# -*- 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_() 
+0

Vielen Dank für den Versuch. Zuerst muss ich wirklich OpenCV für die Bildverarbeitung verwenden. Zweitens habe ich mehrere Fehler beim Kompilieren Ihres Codes bekommen. +1 aber für die Mühe. –

+0

Dieser Code scheint korrekt zu sein. Die Verarbeitung erfolgt in OpenCV (z. B. cv2.cvtColor) und nur die Anzeige wird mit Qt (QPixmap) verarbeitet, was in Ordnung ist. Ich mache das gleiche in vielen Skripten. Seien Sie jedoch vorsichtig, wenn Sie Ihr Bild von cv in qt konvertieren (suchen Sie im Web nach Konvertern)! – Mailerdaimon

Verwandte Themen