setPixmap behaves strange
-
Hi everyoe I am new with Qt,
I have been trying to show this image on GUI. I check that wheter that image is valid or not using cv2.imshow and it is valid
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()
-
QLabel can adapt itself on the size of the image.
-
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.
-
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. -
QLabel can adapt itself on the size of the image.
-
@SGaist
I didn't know that. Thanks a lot