Important: Please read the Qt Code of Conduct -

setPixmap behaves strange

  • Hi everyoe I am new with Qt,
    I have been trying to show this image on GUI image. I check that wheter that image is valid or not using cv2.imshow and it is valid result
    But when i try to show image on GUI, it seems strange as you see.

    Note: Size of image is not always constat but its width is around 60 and its height is around 160.

    here is my code:

    import cv2
    import numpy as np
    from PyQt5.QtCore import QThread, QTimer
    from PyQt5.QtWidgets import QLabel, QWidget, QPushButton, QVBoxLayout, QApplication, QHBoxLayout, QMessageBox,  QMainWindow
    from PyQt5.QtGui import QPixmap, QImage
    class Camera:
        def __init__(self, cam_num):
            self.cap = cv2.VideoCapture(cam_num)
            self.cam_num = cam_num
        def open(self, width=640, height=480, fps=30):
            self.cap.set(3, width)  # set width 
            self.cap.set(4, height)  # set height
            return self.cap.isOpened()
        def read(self):
            roi2 = np.zeros((480, 640, 3), dtype="uint8")
            image2 = np.zeros((170, 70, 3), dtype="uint8")
            image = cv2.imread('image.jpg')
            cv2.imshow('image', image)
            image2[0:image.shape[0], 0: image.shape[1]] = image[0: image.shape[0], 0:image.shape[1]]  # PROBLEM IS HERE
            # image.shape = 159,66,3
            roi2[250:250 + image.shape[0] - 62, 50:50 + image.shape[1]] = image[0: image.shape[0] - 62, 0:image.shape[1]]
            return roi2, image2
        def close_camera(self):
    class UI_Window(QWidget):
        def __init__(self, cam_num):
            self.cam_num = cam_num
            # Create a timer.
            self.timer = QTimer()
            self.timer.start(1000 / 24)
            # Create a layout.
            layout = QHBoxLayout()
            # Add a button
            button_layout = QHBoxLayout()
            btnCamera = QPushButton("Find Defects and Plot Histogram")
            button2_layout = QHBoxLayout()
            btn2 = QPushButton("Acquire Frame")
            self.label = QLabel()
            self.label.setFixedSize(640, 640)
            self.label2 = QLabel()
            self.label2.setFixedSize(640, 640)
            self.label2.setGeometry(0, 50, 200, 200)
            self.setWindowTitle("First GUI with QT")
        def nextFrameSlot(self):
            frame,frame2 =
            if frame is not None:
                image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) #	The image is stored using a 24-bit RGB format (8-8-8).
                self.pixmap = QPixmap.fromImage(image)
            if frame2 is not None:
                image2 = QImage(frame2, frame2.shape[1], frame2.shape[0], QImage.Format_RGB888) #	The image is stored using a 24-bit RGB format (8-8-8).
                self.pixmap2 = QPixmap.fromImage(image2)
        def take_photo(self):
    if __name__ == '__main__': 
        camera = Camera(1)  #
        app = QApplication([])
        start_window = UI_Window(camera)

  • Lifetime Qt Champion

    QLabel can adapt itself on the size of the image.

  • Lifetime Qt Champion


    Why are you setting such fixed size if you know your images are going to be dynamic ?

    As for your "problem is here line", what exactly is image.jpg ? What size is it ? Because you already have a problem there since you might be trying to fit an image of a different size in a numpy array.

  • @SGaist Thanks for reply. I set fixed size as maximum size of image .
    Shape of image.jpg is 640x480x3. So I set size of label as 640x640.

  • Lifetime Qt Champion

    QLabel can adapt itself on the size of the image.

  • @SGaist
    I didn't know that. Thanks a lot

Log in to reply