python - 如何使用opencv将图像显示到PYQT

标签 python opencv pyqt5 pyside

你好,我是 python 和 opencv 新手

我想问,如何在qlabel(pyqt)中显示我的图像,我想将qlabel转换为灰度。

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

当我点击加载图像按钮时它崩溃了,图像无法在qlabel中显示 和这个错误

Process finished with exit code -1073740791 (0xC0000409)

最佳答案

有 2 个错误:

  • 您必须将 bytesPerLine 传递给 QImage
  • 设置对齐方式时,trainOpenImg 中会有“n”个以上。

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)

另一方面,IDE 在处理某些类型的错误时存在问题,并且仅启动代码,因此在这些情况下,建议在 CMD 或终端中运行它,因为它们会为您提供更多信息,例如在本例中错误消息是:

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)

关于python - 如何使用opencv将图像显示到PYQT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52869400/

相关文章:

python - celery 无法在 docker 中启动

c++ - 为 OpenCV 编译 MATLAB 绑定(bind)

python - 在 PyQt 中绘制多边形

python - QHBoxLayout 以不同的顺序添加小部件

python - 迭代数组并在文件中搜索数组中的每个项目

python - 从 O(n) 中的列表生成分类数据集

python - 通过相机输入的实时性能消除运动模糊

python - 为什么在 pyqt5 中我应该使用 pyuic5 而不是 uic.loadUi ("my.ui")?

python - 评估 python 中元组的字符串表示形式

python - 像素化 ROI 边界框并使用 OpenCV 将其覆盖在原始图像上