Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python Opencv图像(numpy数组)转换为PyQt QPixmap图像_Python_Qt_Opencv_Qimage - Fatal编程技术网

将Python Opencv图像(numpy数组)转换为PyQt QPixmap图像

将Python Opencv图像(numpy数组)转换为PyQt QPixmap图像,python,qt,opencv,qimage,Python,Qt,Opencv,Qimage,我正在尝试将python opencv图像转换为QPixmap 我按照说明进行操作,我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/255. imgDown = cv2.pyrDown(img) imgDown = np.float32(imgDown) cvRGBImg = cv2.cvtColor(imgDown, cv2.cv.CV_BGR2RGB) qimg = QtGui.QImage(cvRGBImg.data,cvRG

我正在尝试将python opencv图像转换为QPixmap

我按照说明进行操作,我的代码附在下面

img = cv2.imread('test.png')[:,:,::1]/255. 
imgDown = cv2.pyrDown(img)
imgDown = np.float32(imgDown)        
cvRGBImg = cv2.cvtColor(imgDown, cv2.cv.CV_BGR2RGB)
qimg = QtGui.QImage(cvRGBImg.data,cvRGBImg.shape[1], cvRGBImg.shape[0], QtGui.QImage.Format_RGB888)
pixmap01 = QtGui.QPixmap.fromImage(qimg)
self.image01TopTxt = QtGui.QLabel('window',self)
self.imageLable01 = QtGui.QLabel(self)
self.imageLable01.setPixmap(pixmap01)

该代码没有编译和运行时错误,但转换是错误的,我只是得到一些噪声图像。我不确定是什么问题。有人能帮忙吗?

用这个把cvImage转换成Qimage,这里cvImage是原始图像

#image is the numpy array that you got from cv2.imread(example_image.jpg)

image = QtGui.QImage(image, image.shape[1],\
                            image.shape[0], image.shape[1] * 3,QtGui.QImage.Format_RGB888)
pix = QtGui.QPixmap(image)

self.scene.addPixmap(pix)
高度、宽度、通道=cvImg.shape bytesPerLine=3*宽度 qImg=QImage(cvImg.data、宽度、高度、字节行、QImage.Format_RGB888)
并将此Qimage设置为标签。来自Qimage的参数。它工作

补充AdityaIntwala的答案,如果图像显示为红色或蓝色,这是因为格式不是RGB,而是BGR(相反)。在这种情况下,请使用QImage.rgbSwapped方法更正:

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()

我不想在大量的答案中添加更多的内容,但因为这是唯一对我有效的东西,我会的,以防其他人遇到同样的问题

如上所述

首先在
np.require(array,np.uint8,'C')
调用中包装numpy数组/ndarry,例如:

arr2 = np.require(arr, np.uint8, 'C')
qImg = QtGui.QImage(arr2, width, height, QtGui.QImage.Format_RGB888)

以下是我对此的看法:

def convert_nparray_to_QPixmap(self,img):
    w,h,ch = img.shape
    # Convert resulting image to pixmap
    if img.ndim == 1:
        img =  cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)

    qimg = QImage(img.data, h, w, 3*h, QImage.Format_RGB888) 
    qpixmap = QPixmap(qimg)

    return qpixmap

有最简单的方法:

from PIL.ImageQt import ImageQt 
from PIL import Image
from PySide2.QtGui import QPixmap
import cv2


# Convert an opencv image to QPixmap
def convertCvImage2QtImage(cv_img):
    rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
    PIL_image = Image.fromarray(rgb_image).convert('RGB')
    return QPixmap.fromImage(ImageQt(PIL_image))

我必须创建
QPixmap
明确:
self.imageLable01.setPixmap(QPixmap(qImg))
并传递
bytesPerLine+1
任何提到numpy格式的文档总是RGB888?不一定总是RGB888,从qt5文档来看,是一个支持格式的列表。当然,您必须确保您的numpy数组具有正确的数据。@MarkCarpenterJr是否有办法确定我需要的图像格式?尝试了几个链接,但都不起作用。@Matthias您可以先尝试转换为特定格式,然后创建
QImage()
。您还可以查看数组中的元组,猜测确定格式,例如,RGB888是每像素8位,被视为24位格式,一个像素看起来像3个8位值;(255,255,255). 但这一切都取决于你在做什么。