将numpy图像转换为QPixmap [英] Converting numpy image to QPixmap

查看:262
本文介绍了将numpy图像转换为QPixmap的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am student of Computer-Sciences and I am learning image processing using OpenCv with Python. I am working on gender detection using Periocular region. There I am facing a problem while I browse image; the Crop code work fine but on the interface Output is not displayed as requirement.

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

I searched for solution and apply various Qimage-Format but it did not work properly.

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

I would be grateful if you help me out.

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

I have attached code along with current output and desired output also I am going to attach so that it make the question more clearly understandable

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_())

我需要在用户单击 "Region of Interest" 按钮时;如 second image.

I need when user click on "Region of Interest" button ; only cropped image should be displayed there at lable_box as displayed in second image.

推荐答案

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

You must use the QImage::Format_Indexed8 format to convert the numpy array to QImage. I have implemented a method that converts some types of numpy arrays to 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)

这篇关于将numpy图像转换为QPixmap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆