У меня проблемы с добавлением изображения open_cv (массив numpy) в центральный виджет моей программы PyQt5. Как вы можете видеть на изображении ниже, я пытаюсь управлять открытым окном cv во фрейме главного окна Pyqt5. Я пытаюсь найти решение, но не могу его найти. Я почти уверен, что есть прекрасное решение. Надеюсь, многие специалисты помогут в моих проблемах. Благодарность

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QDesktopWidget, QLabel, QVBoxLayout, QFileDialog, QMenu
from PyQt5.QtGui import QIcon, QPixmap
import cv2
from PyQt5.QtGui import QImage
from matplotlib import pyplot as plt

class MyApp(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()
    
    def initUI(self):

        self.statusBar() 
        self.createActions() 
        self.createMenus() 
        self.image_frame = QLabel()

        self.setWindowTitle('Menubar')
        self.resize(500, 350)
        # self.setGeometry(400, 300, 800, 400)
        self.center()
        self.show()
    
    
    def createActions(self):
        self.openAct = QAction("&Open...", self, shortcut = "Ctrl+O", triggered=self.open)
        self.exitAct = QAction("Exit", self, shortcut="Ctrl+Q", triggered=self.close)
    
    def createMenus(self):
    
        self.fileMenu = QMenu("&File", self)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.exitAct) 


        self.menuBar().addMenu(self.fileMenu)


    def center(self):
        qr = self.frameGeometry() 
        cp = QDesktopWidget().availableGeometry().center() 
        qr.moveCenter(cp) 
        self.move(qr.topLeft()) 
    
    def open(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self, 'QFileDialog.getOpenFileName()', '',
                                                  'Images (*.png *.jpeg *.jpg *.bmp *.gif)', options=options)

        if fileName:
            self.sid = QImage(fileName)
            self.src_raw = self.qimg2cv(self.sid)  
            
            self.src = self.src_raw.copy()
            self.img = self.src.copy() 
            # print(self.img)
            self.show_image(self.img)
    
    def qimg2cv(self, q_img):
        q_img.save('temp.png', 'png')
        mat = cv2.imread('temp.png')
        return mat

    def show_image(self, A):
    
        cv2.namedWindow("image_window")
        cv2.moveWindow("image_window", 300,50)
        cv2.imshow("image_window", A)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

enter image description here

1
Yong Hwan Kim 30 Ноя 2020 в 17:52

1 ответ

Лучший ответ
  1. Устанавливает self.image_frame в качестве центрального виджета главного окна.

  2. Преобразовать self.img в pixmap

  3. Установка растрового изображения


import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, \
    QDesktopWidget, QLabel, QVBoxLayout, QFileDialog, QMenu
from PyQt5.QtGui import QIcon, QPixmap, QImage
import cv2
#? from matplotlib import pyplot as plt


class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    
    def initUI(self):
#?        self.statusBar() 
        self.createActions() 
        self.createMenus() 
        
        self.image_frame = QLabel()
        self.setCentralWidget(self.image_frame)                            # ! 1

        self.setWindowTitle('Menubar')
        self.resize(500, 350)
        self.center()
        self.show()
    
    def createActions(self):
        self.openAct = QAction("&Open...", self, shortcut = "Ctrl+O", triggered=self.open)
        self.exitAct = QAction("Exit", self, shortcut="Ctrl+Q", triggered=self.close)
    
    def createMenus(self):
        self.fileMenu = QMenu("&File", self)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.exitAct) 
        self.menuBar().addMenu(self.fileMenu)

    def center(self):
        qr = self.frameGeometry() 
        cp = QDesktopWidget().availableGeometry().center() 
        qr.moveCenter(cp) 
        self.move(qr.topLeft()) 
    
    def open(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(
            self, 
            'QFileDialog.getOpenFileName()', 
            '',
            'Images (*.png *.jpeg *.jpg *.bmp *.gif)', 
            options=options
        )

        if fileName:
            self.sid = QImage(fileName)
            self.src_raw = self.qimg2cv(self.sid)           
            self.src = self.src_raw.copy()
            self.img = self.src.copy() 
            self.show_image(self.img)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv            # ! 2            
            height, width, bytesPerComponent = self.img.shape
            bytesPerLine = 3 * width
            cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB, self.img)
            QImg = QImage(
                self.img.data, 
                width, 
                height, 
                bytesPerLine, 
                QImage.Format_RGB888
            )
            pixmap = QPixmap.fromImage(QImg)
            
            self.image_frame.setPixmap(pixmap)                              # ! 3           
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^            
    
    def qimg2cv(self, q_img):                           
        q_img.save('temp_.png', 'png')
        mat = cv2.imread('temp_.png')                 
        return mat

    def show_image(self, A):
        cv2.namedWindow("image_window")
        cv2.moveWindow("image_window", 300,50)
        cv2.imshow("image_window", A)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

enter image description here

1
S. Nick 30 Ноя 2020 в 18:02