簡體   English   中英

將 Python Opencv 圖像(numpy 數組)轉換為 PyQt QPixmap 圖像

[英]Convert Python Opencv Image (numpy array) to PyQt QPixmap image

我正在嘗試將 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 是原始圖像。

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

並將這個 Qimage 設置為 Label。 來自 Qimage 的setPixmap參數。 有用!!!

只是補充AdityaIntwala的回答,如果圖像出現紅色或藍色,那是因為格式不是RGB,而是BGR(反之)。 在這種情況下,使用 QImage.rgbSwapped 方法來更正:

height, width, channel = cvImg.shape
bytesPerLine = 3 * width
qImg = QImage(cvImg.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped()
#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)

不想添加大量答案,但由於這是唯一對我有用的方法,以防其他人遇到同樣的問題。

正如在 GitHub 上提到的

首先將 numpy 數組/ndarry 包裝在np.require(array, np.uint8, 'C')調用中,例如:

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

AdityaIntwala 的回答很接近,但對我沒有用。 cvImg.data 給出了類似“參數 1 具有意外類型‘memoryview’”的錯誤。 所以我刪除了'cvImg.data'並將cvImg.tobytes()作為字節傳遞,並且它有效

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

然后我設置了像素圖,如下所示

self.imageLabel.setPixmap(QPixmap(qImg))

我建議使用軟件包qimage2ndarray將numpy數組與Qimages相互轉換。

有最簡單的方法:

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))
  image=cv2.imread("your_image.png")
  image = QtGui.QImage(image, image.shape[1],image.shape[0], image.shape[1] * 3, QtGui.QImage.Format_BGR888)
  pix = QtGui.QPixmap(image)
  self.image.setPixmap(QtGui.QPixmap(pix))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM