我是计算机科学系的学生,正在学习使用Python
和OpenCv进行图像处理。我正在使用眼周区域进行性别检测。在浏览图像时,我遇到了问题;作物代码工作正常,但在界面上未按要求显示输出。
我搜索了解决方案并应用了各种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_())
用户单击"Region of Interest"
按钮时需要;如lable_box
中所示,只有裁剪的图像应显示在second image.
您必须使用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)