该程序基于pyqt和opencv。我计划在使用 QT 作为 GUI 的同时使用 opencv 读取和处理图像。
当我打开一个灰色图像时,结果是好的。但是打开彩色图像时会改变图像的颜色。我想这是因为我将 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_()