Как объединить OpenCV с PyQt для создания простого графического интерфейса?
Мне нужно выполнить много операций над изображением. Поэтому я использовал OpenCV. OpenCV очень эффективен в обработке изображений, однако не слишком хорошо представить подходящий графический интерфейс. Поэтому я решил использовать PyQt для создания пользовательского графического интерфейса и OpenCV для обработки моего изображения.
Я создал очень простую программу, которую вы непосредственно выбрали из документации. Я просто прочитал изображение jpg
и сохранил его в формате png
, нажав клавишу s
.
Моя цель - заменить клавишу 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()
Вывод:
![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 кода для достижения моей цели?
Ответы
Ответ 1
Измененный код, основанный на вашем сообщении, я не использовал 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_()