2015-02-02 3 views
11

Мне нужно выполнить много операций над изображением. Поэтому я использовал OpenCV. OpenCV очень эффективен в обработке изображений, однако не слишком хорошо представить подходящий графический интерфейс. Поэтому я решил использовать PyQt для создания пользовательского графического интерфейса и OpenCV для обработки моего изображения.Как объединить OpenCV с PyQt для создания простого графического интерфейса?

Я создал очень простую программу, которую вы непосредственно выбрали из документации. Я просто прочитал изображение jpg и сохранил его в формате png, нажав клавишу s.

Моя цель - заменить ключ s нажатием кнопки для выполнения того же действия с использованием PyQt. Кроме того, я хочу, чтобы окно, отображаемое PyQt, имело то же поведение, что и OpenCV: в основном говоря, функция отображает окно, соответствующее размеру изображения.

Вот мой 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 кода, чтобы достичь своей цели?

ответ

9

Изменен код, основанный на вашем сообщении, я не использовал 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_() 
+0

Благодарим вас за попытку. Во-первых, мне действительно нужно использовать OpenCV для обработки изображений. Во-вторых, я получил несколько ошибок при компиляции вашего кода. +1 однако для усилий. –

+0

Этот код кажется правильным. Обработка выполняется в OpenCV (например, посмотрите cv2.cvtColor), и только отображение обрабатывается с использованием Qt (QPixmap), который является прекрасным. Я делаю то же самое во многих сценариях. Будьте осторожны, хотя при конвертировании изображения с cv на qt (поиск в Интернете для конвертеров)! – Mailerdaimon

Смежные вопросы