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