web-dev-qa-db-ja.com

OpenCVとPyQtを組み合わせてシンプルなGUIを作成する方法は?

画像に対して多くの操作を実行する必要があります。そこで、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()

出力:

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つのコードを混ぜて目標を達成できますか?

13
user3522371

あなたの投稿に基づいていくつかのコードを変更しました、私は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_()
12
Cui Heng

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定数にはいくつかの異なる命名規則と名前空間規則があります。)

0
HelloGoodbye