Как ждать рисования изображения в Qt - PullRequest
0 голосов
/ 25 декабря 2018

Для лабораторного применения мне необходимо проецировать изображения с помощью проектора и впоследствии записывать проецируемые изображения с помощью камеры.В этом случае важно быть уверенным, что кадр проецируется до того, как мы сделаем запись с помощью камеры.Однако, поскольку мы должны сделать это для большого количества изображений, мы не хотим иметь большую задержку между последующими кадрами.Как создать функцию, которая рисует изображение и возвращает его только после того, как рамка была нарисована на экране?

У меня есть пример кода ниже.

import PyQt5
from PyQt5 import QtGui, QtCore, QtWidgets
import numpy as np


class ShowLiveImage(QtWidgets.QWidget):   
def __init__(self):
    """ Create a tiny window in which a frame can be displayed using
        show_image.
    """
    super().__init__()
    self.imageLabel = QtWidgets.QLabel()
    self.layout = QtWidgets.QVBoxLayout()
    self.setLayout(self.layout)
    self.layout.addWidget(self.imageLabel)
    self.window().setMinimumSize(512,512)
    self.win = self.window()
    self.show()

def show_image(self, image_array, wait_for_drawing=True):
    """
    Shows an image given as a numpy array and (should) wait for the frame to be drawn onto the monitor before returning.

    """
    N = image_array.shape[0]
    self.im = QtGui.QImage(image_array, N, N, QtGui.QImage.Format_Grayscale8)
    qpm = QtGui.QPixmap(self.im)
    self.imageLabel.setPixmap(qpm)
    if wait_for_drawing:
        # These do not help, what do I do here?
        self.imageLabel.repaint()
        QtGui.QGuiApplication.postEvent(self, QtCore.QEvent(QtCore.QEvent.UpdateRequest))
    QtGui.QGuiApplication.processEvents()

Однако, когда я продолжаю обновлять изображения с использованием этого кода, частота кадров становится слишком высокой, около 400 кадров в секунду на моем компьютере, которую я тестировал следующим образом:

from PyQt5.Qt import QApplication
import time
app = QApplication([])
viewer = ShowLiveImage()

t0 = time.time()
for i in range(1000):
    random_image = np.random.randint(0,255,(512,512), np.uint8)
    viewer.show_image(random_image)
t1 = time.time()
print(' FPS: ', 1000./(t1-t0))

Как мне убедиться, что show_image возвращается только тогда, когда кадр был спроецирован?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...