Issue
Hello I'm new in python and opencv
I want to ask, how to show my image in qlabel (pyqt) and i want to convert qlabel to grayscale.
import sys
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class UIProgram(QMainWindow):
def __init__(self):
super(UIProgram,self).__init__()
loadUi("Backpro2.ui",self)
#self.image=None
self.trainLoadImgBtn.clicked.connect(self.loadClicked)
self.image = QImage()
@pyqtSlot()
def loadClicked(self):
fname,filter=QFileDialog.getOpenFileName(self,'Open File','D:\\',"Image Files(*.jpg)")
if fname:
self.loadImage(fname)
else:
print('invalid image')
def loadImage(self,fname):
self.image=cv2.imread(fname,cv2.IMREAD_COLOR)
self.displayImage()
def displayImage(self):
qformat =QImage.Format_Indexed8
if len(self.image.shape)==3:
if(self.image.shape[2])==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
img=QtGui.QImage(self.image.data,self.image.shape[1],self.image[0],QtGui.QImage.Format_RGB888)
img = img.rgbSwapped()
self.trainOpenImg.setPixmap(QPixmap.fromImage(img))
self.trainOpenImgn.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)
if __name__ == "__main__":
app=QApplication(sys.argv)
window=UIProgram()
window.setWindowTitle('Test')
window.show()
sys.exit(app.exec_())
it crashed when i click load image button, the image can't show in qlabel and this error
Process finished with exit code -1073740791 (0xC0000409)
Solution
It has 2 errors:
- You have to pass the
bytesPerLine
to the QImage - You have an "n" of more in
trainOpenImg
when you set the alignment.
def displayImage(self):
qformat =QImage.Format_Indexed8
if len(self.image.shape)==3:
if self.image.shape[2] ==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
img = QtGui.QImage(self.image.data,
self.image.shape[1],
self.image.shape[0],
self.image.strides[0], # <--- +++
qformat)
img = img.rgbSwapped()
self.trainOpenImg.setPixmap(QPixmap.fromImage(img))
self.trainOpenImg.setAlignment(QtCore.Qt.AlignCenter)
On the other hand IDEs have problems handling certain types of errors and only launch a code, so in those cases it is advisable to run it in the CMD or terminal as they give you more information, for example in this case the error message was :
Traceback (most recent call last):
File "test.py", line 20, in loadClicked
self.loadImage(fname)
File "test.py", line 26, in loadImage
self.displayImage()
File "test.py", line 36, in displayImage
img=QtGui.QImage(self.image.data,self.image.shape[1],self.image[0],QtGui.QImage.Format_RGB888)
TypeError: arguments did not match any overloaded call:
QImage(): too many arguments
QImage(QSize, QImage.Format): argument 1 has unexpected type 'memoryview'
QImage(int, int, QImage.Format): argument 1 has unexpected type 'memoryview'
QImage(bytes, int, int, QImage.Format): argument 3 has unexpected type 'numpy.ndarray'
QImage(sip.voidptr, int, int, QImage.Format): argument 3 has unexpected type 'numpy.ndarray'
QImage(bytes, int, int, int, QImage.Format): argument 3 has unexpected type 'numpy.ndarray'
QImage(sip.voidptr, int, int, int, QImage.Format): argument 3 has unexpected type 'numpy.ndarray'
QImage(List[str]): argument 1 has unexpected type 'memoryview'
QImage(str, format: str = None): argument 1 has unexpected type 'memoryview'
QImage(QImage): argument 1 has unexpected type 'memoryview'
QImage(Any): too many arguments
Aborted (core dumped)
Answered By - eyllanesc
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.