Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/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):
            self.cap.release()
    
    
    class UI_Window(QWidget):
    
        def __init__(self, cam_num):
            super().__init__()
            self.cam_num = cam_num
            self.cam_num.open()
            # Create a timer.
            self.timer = QTimer()
            self.timer.timeout.connect(self.nextFrameSlot)
            self.timer.start(1000 / 24)
            # Create a layout.
            layout = QHBoxLayout()
            # Add a button
            button_layout = QHBoxLayout()
            btnCamera = QPushButton("Find Defects and Plot Histogram")
            #btnCamera.clicked.connect(self.cam_num.findcnt)
            button_layout.addWidget(btnCamera)
            layout.addLayout(button_layout)
            button2_layout = QHBoxLayout()
            btn2 = QPushButton("Acquire Frame")
            btn2.clicked.connect(self.take_photo)
            button2_layout.addWidget(btn2)
            layout.addLayout(button2_layout)
            self.label = QLabel()
            self.label.setFixedSize(640, 640)
            layout.addWidget(self.label)
            self.label2 = QLabel()
            self.label2.setFixedSize(640, 640)
            self.label2.setGeometry(0, 50, 200, 200)
    
            layout.addWidget(self.label2)
            self.setLayout(layout)
            self.setWindowTitle("First GUI with QT")
    
        def nextFrameSlot(self):
    
            frame,frame2 = self.cam_num.read()
    
            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):
            self.label.setPixmap(self.pixmap)
            self.label2.setPixmap(self.pixmap2)
    
    
    if __name__ == '__main__': 
    
        camera = Camera(1)  #
    
        app = QApplication([])
        start_window = UI_Window(camera)
        start_window.show()
    
        app.exit(app.exec_()) 
        camera.close_camera()
    

  • Lifetime Qt Champion

    QLabel can adapt itself on the size of the image.


  • Lifetime Qt Champion

    Hi,

    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