Как настроить цвет при преобразовании массива numpy в QImage?

Программа основана на pyqt и opencv. Я планирую читать и обрабатывать изображение с помощью opencv при использовании QT в качестве графического интерфейса.

когда я открываю серое изображение, результат в порядке. Но при открытии цветного изображения он изменит цвет изображения. Я думаю, это потому, что я ошибся, когда преобразовываю массив numpy в тип OImage, но я не могу понять, как его исправить.

# -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys import cv2 from cv2 import cv QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) class MainWindow(QMainWindow): def __init__(self,parent=None): super(MainWindow,self).__init__(parent) self.setWindowTitle("Show Image with pyqt") self.imageLabel=QLabel() self.imageLabel.setSizePolicy(QSizePolicy.Ignored,QSizePolicy.Ignored) self.setCentralWidget(self.imageLabel) self.image=QImage() self.createActions() self.createMenus() self.cv_img = None def createActions(self): self.fileOpenAction=QAction(QIcon(":/fileopen.png"),self.tr("Open"),self) self.fileOpenAction.setShortcut("Ctrl+O") self.fileOpenAction.setStatusTip(self.tr("Open the file")) self.connect(self.fileOpenAction,SIGNAL("triggered()"),self.slotOpenFile) self.exitAction=QAction(QIcon(":/filequit.png"),self.tr("Quit"),self) self.exitAction.setShortcut("Ctrl+Q") self.setStatusTip(self.tr("Quit")) self.connect(self.exitAction,SIGNAL("triggered()"),self.close) def createMenus(self): fileMenu=self.menuBar().addMenu(self.tr("File")) fileMenu.addAction(self.fileOpenAction) fileMenu.addAction(self.exitAction) def slotOpenFile(self): fileName=QFileDialog.getOpenFileName(self,self.tr("Open a file"),\ ".",self.tr("Image File(*.png *.jpg *.jpeg *.bmp)")) cvfilename=fileName.toLocal8Bit().data() if fileName.isEmpty()==False: cvfilename=fileName.toLocal8Bit().data() #convert Qstring to char* self.cv_img = cv2.imread(cvfilename) #read image with opencv cv2.imshow("Show Image with Opencv",self.cv_img) #show image with opencv, this is the right result self.image =QImage(self.cv_img.tostring(),\ self.cv_img.shape[0],self.cv_img.shape[1],QImage.Format_RGB888) #convert numpy array to QImage self.imageLabel.setPixmap(QPixmap.fromImage(self.image)) self.resize(self.image.width(),self.image.height()) app=QApplication(sys.argv) main=MainWindow() main.show() app.exec_() 

Вот результат с цветным изображением, цвет изображения меняется, когда вы показываете его с помощью QT, но хорошо с простым opencv

  • Ошибка при рисовании QImage на виджет с PIL и PyQt
  • Загрузка файлов .ui в QtDesigner в PySide
  • Отладка приложения pyQT4?
  • Как запустить два разных потока одновременно в pyqt
  • PyQT Слушайте события SystemWide Key и mouse
  • Сон не работает на pyqt4
  • многопроцессорные схемы графического интерфейса для борьбы с блокировкой «Неответ»
  • Как я могу перехватить, когда виджет теряет фокус
  • 2 Solutions collect form web for “Как настроить цвет при преобразовании массива numpy в QImage?”

    Вам необходимо преобразовать данные изображения из BGR в RGB. Вам также нужно поменять ширину и высоту (см. Ниже) – ваш код работает только для изображений с одинаковой шириной и высотой.

     self.cv_img = cv2.imread(cvfilename) if self.cv_img != None: # Notice the dimensions. height, width, bytesPerComponent = cv_img.shape bytesPerLine = bytesPerComponent * width; cv2.imshow("Show Image with Opencv", self.cv_img) # Convert to RGB for QImage. cv2.cvtColor(self.cv_img, cv.CV_BGR2RGB, self.cv_img) self.image = QImage(self.cv_img.data, width, height, bytesPerLine, QImage.Format_RGB888) 

    Я знаю, что это довольно старая нить, но для меня cv2.cvtColor работает очень медленно. Я нашел еще одну функцию, которая может помочь тем, кто понадобится в будущем (взял меня навсегда, чтобы найти это средство):

     def cv2_to_qimage(cv_img): height, width, bytesPerComponent = cv_img.shape bgra = np.zeros([height, width, 4], dtype=np.uint8) bgra[:, :, 0:3] = cv_img return QtGui.QImage(bgra.data, width, height, QtGui.QImage.Format_RGB32) 

    Надеюсь, вы найдете это полезным

    Python - лучший язык программирования в мире.