画像に対して多くの操作を実行する必要があります。そこで、OpenCVを使用しました。 OpenCVは画像処理において非常に効率的ですが、適切なGUIを提示するのはあまり良いことではありません。そこで、PyQtを使用してカスタムGUIと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()
出力:
以下は、単純なウィンドウを描画するための単純な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つのコードを混ぜて目標を達成できますか?
あなたの投稿に基づいていくつかのコードを変更しました、私は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_()
OpenCVによって読み取られた画像データから直接QImage
を作成し、それを_QPixmap.fromImage
_を使用してQPixmap
に変換し、それを使用してQLabel
メソッドを使用してsetPixmap
のピクスマップを設定できます。
このページは、PySideとOpenVCを使用してウェブカメラフィードを表示する方法を示しています: https://Gist.github.com/bsdnoobz/84640 。この2行をコメントアウトすることで、動画でも機能するようにしました
_self.capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, self.video_size.width())
self.capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, self.video_size.height())
_
代わりに
_resized_bgr_frame = cv2.resize(
bgr_frame,
(self.video_size.width(), self.video_size.height()),
interpolation=cv2.INTER_CUBIC if self.video_size.width() > bgr_frame.shape[1] else cv2.INTER_AREA)
_
ビデオフレーム(_bgr_frame
_はself.capture.read()
で取得されたフレームです)。
(おそらく、_cv2
_のバージョンが異なるため、OpenCV定数にはいくつかの異なる命名規則と名前空間規則があります。)