2015-02-02 14 views
11

Ho bisogno di eseguire molte operazioni su un'immagine. Quindi ho usato OpenCV. OpenCV è molto efficiente nell'elaborazione delle immagini, tuttavia non è bello presentare una GUI adeguata. Così ho deciso di usare PyQt per disegnare una GUI personalizzata e OpenCV per elaborare la mia immagine.Come combinare OpenCV con PyQt per creare una semplice GUI?

Ho creato un programma molto semplice che è stato scelto direttamente dalla documentazione. Ho semplicemente letto un'immagine jpg e salvata in un formato png premendo il tasto s.

Il mio obiettivo è sostituire la chiave s con un pulsante da premere per eseguire la stessa azione usando PyQt. Inoltre, voglio che la finestra visualizzata da PyQt abbia lo stesso comportamento di OpenCV: principalmente, la funzione imshow() visualizza una finestra che si adatta alle dimensioni dell'immagine.

Ecco il mio OpenCV codice semplice:

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

uscita:

enter image description here

Ecco un codice PyQt semplice per disegnare una semplice finestra:

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

Come può Mescolo i 2 codici per raggiungere il mio obiettivo?

risposta

9

Modificato codice in base al post, non ho utilizzato Opencv per eseguire il rendering dell'immagine, invece di utilizzare QPixmap per renderlo. quindi utilizzare KeyPressEvent per acquisire l'input dell'utente.

# -*- 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

Grazie per aver provato. Innanzitutto, ho davvero bisogno di usare OpenCV per l'elaborazione delle immagini. In secondo luogo, ho ricevuto diversi errori durante la compilazione del codice. +1 tuttavia per lo sforzo. –

+0

Questo codice sembra corretto. L'elaborazione è in OpenCV (ad esempio, guarda cv2.cvtColor) e solo la visualizzazione viene gestita usando Qt (QPixmap) che va bene. Sto facendo lo stesso in molte sceneggiature. Stai attento quando converti la tua immagine da cv a qt (cerca nel web i convertitori)! – Mailerdaimon

Problemi correlati