将Python Opencv图像(numpy数组)转换为PyQt QPixmap图像
我正在尝试将python opencv图像转换为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
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). 但这一切都取决于你在做什么。