将numpy图片转换为QPixmap

问题描述 投票:2回答:1

我是计算机科学系的学生,正在学习使用PythonOpenCv进行图像处理。我正在使用眼周区域进行性别检测。在浏览图像时,我遇到了问题;作物代码工作正常,但在界面上未按要求显示输出。

我搜索了解决方案并应用了各种Qimage-Format,但无法正常工作。

如果您能帮助我,我将不胜感激。

我已经附加了代码以及当前的输出和所需的输出,我还将对其进行附加,以使问题更易于理解

from PyQt5 import QtGui,QtWidgets,QtCore,uic
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QMessageBox,QStatusBar
from PyQt5.QtCore import QCoreApplication

import sys
import cv2

IMAGE_1=0
class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        uic.loadUi('Welcome1.ui',self)
        self.title="Gender_Identifier"

        self.setWindowIcon(QtGui.QIcon("main-logo.png"))
#        self.browse_button.clicked.connect(self.setimage)
 #       self.roi_button.clicked.connect(self.crop)
        self.work_IMAGE=None
        self.browse_button.clicked.connect(self.setimage)
        self.roi_button.clicked.connect(self.crop)

        button=QPushButton("close",self)
        button.clicked.connect(self.close)

        self.InitWindow()

        #IMAGE=self.set_image()
    def InitWindow(self):

        self.statusBar().showMessage("This is a simple status bar")
        self.setWindowTitle(self.title)

    def file(self):

        fileName ,_ =QtWidgets.QFileDialog.getOpenFileName(None,"Select Image", "D:\python_data\interface","Image Files (*.png *.jpg)")
        return fileName

    def setimage(self):
        fileName ,_ =QtWidgets.QFileDialog.getOpenFileName(None,"Select Image", "D:\python_data\interface\images\preprocessed","Image Files (*.png *.jpg)")

        if fileName:
            #pixmap object
            pixmap=QtGui.QPixmap(fileName)
            pixmap=pixmap.scaled(self.browse_label.width(),self.browse_label.height(),QtCore.Qt.KeepAspectRatio)
            self.browse_label.setPixmap(pixmap)
            self.browse_label.setAlignment(QtCore.Qt.AlignCenter)
            if(fileName):
                self.work_IMAGE=fileName
    def crop(self):
        if(self.work_IMAGE):
            file=self.work_IMAGE
            img = cv2.imread(file, 0)

            height,width=img.shape[:2]
            start_row,strt_col=int(height*.40),int(width*.15)
            end_row,end_col=int(height*.60),int(width*.90)
            croped=img[start_row:end_row,strt_col:end_col].copy()
            #cv2.imshow("img",croped)
            image = QtGui.QImage(croped, croped.shape[0], croped.shape[1], QtGui.QImage.Format_RGB888)
            pixmap = QtGui.QPixmap(image)
            print(type(image))
            print(type(pixmap))
            print(type(croped))
            #cv2.imshow("img",croped)

            pixmap=pixmap.scaled(self.roi_label.width(),self.roi_label.height(),QtCore.Qt.KeepAspectRatio)
            cv2.imshow("img",croped)
            self.roi_label.setPixmap(pixmap)
            self.roi_label.setAlignment(QtCore.Qt.AlignCenter)


if __name__=='__main__':

    App=QtWidgets.QApplication(sys.argv)
    window=Window()
   # IMAGE=window.setimage()
    #window.crop(IMAGE)
   # IMAGE_1=IMAGE
    #print(IMAGE)
    #print(IMAGE_1)
    window.show()
    sys.exit(App.exec_())

enter image description here

enter image description here

用户单击"Region of Interest"按钮时需要;如lable_box中所示,只有裁剪的图像应显示在second image.

python opencv image-processing pyqt pyqt5
1个回答
1
投票

您必须使用QImage::Format_Indexed8格式将numpy数组转换为QImage。我实现了一种将某些类型的numpy数组转换为QImage的方法

def numpyQImage(image):
    qImg = QtGui.QImage()
    if image.dtype == np.uint8:
        if len(image.shape) == 2:
            channels = 1
            height, width = image.shape
            bytesPerLine = channels * width
            qImg = QtGui.QImage(
                image.data, width, height, bytesPerLine, QtGui.QImage.Format_Indexed8
            )
            qImg.setColorTable([QtGui.qRgb(i, i, i) for i in range(256)])
        elif len(image.shape) == 3:
            if image.shape[2] == 3:
                height, width, channels = image.shape
                bytesPerLine = channels * width
                qImg = QtGui.QImage(
                    image.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888
                )
            elif image.shape[2] == 4:
                height, width, channels = image.shape
                bytesPerLine = channels * width
                fmt = QtGui.QImage.Format_ARGB32
                qImg = QtGui.QImage(
                    image.data, width, height, bytesPerLine, QtGui.QImage.Format_ARGB32
                )
    return qImg

因此您的情况应该是:

def crop(self):
    if not self.work_IMAGE:
        return
    img = cv2.imread(self.work_IMAGE, cv2.IMREAD_GRAYSCALE)
    if img is None:
        return
    height, width = img.shape[:2]
    start_row, strt_col = int(height * 0.40), int(width * 0.15)
    end_row, end_col = int(height * 0.60), int(width * 0.90)
    croped = img[start_row:end_row, strt_col:end_col].copy()
    qImg = numpyQImage(croped)
    pixmap = QtGui.QPixmap.fromImage(qImg)
    pixmap = pixmap.scaled(self.roi_label.size(), QtCore.Qt.KeepAspectRatio)
    self.roi_label.setPixmap(pixmap)
    self.roi_label.setAlignment(QtCore.Qt.AlignCenter)
© www.soinside.com 2019 - 2024. All rights reserved.