将numpy图像转换为QPixmap [英] Converting numpy image to 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屋!