Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
537 views
in Technique[技术] by (71.8m points)

python - How to show image to PYQT with opencv

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)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...