У меня такая же проблема, и я заметил, что частота кадров в секунду при обновлении окна становится все медленнее и медленнее, пока полностью не зависает. Увеличение значения waitKey(x) до чего-то более высокого просто увеличивает продолжительность обновления изображений, но когда время, которое необходимо вычислить cv2.imshow(), превышает время от ожидания (Key), оно просто перестает обновляться.
(Пропустите эту жалобу :) Я думаю, что комбинация cv2.imshow() с waitKey() является полной ошибкой дизайна, почему imshow() просто не блокируется до тех пор, пока пользовательский интерфейс не будет обновлен? Это сделало бы жизнь намного проще без необходимости каждый раз вызывать waitKey()...
P.S.: Есть возможность запустить собственный поток для окон opencv внутри opencv:
import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)
источник: команда cv2.imshow не работает должным образом в opencv- питон
Ну, это не работает для меня, потому что я всегда получаю эти ошибки при запуске:
(python3:1177): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
Attempt to unlock mutex that was not locked
Aborted
Может быть, вы могли бы попробовать и сообщить, если это работает для вас?
Редактировать: Хорошо, я решил проблему для себя, создав отдельный скрипт imshow.py:
import cv2
import os.path
while True:
if os.path.exists("image.pgm"):
image = cv2.imread("image.pgm")
if not image is None and len(image) > 0:
cv2.imshow("Frame", image)
cv2.waitKey(20)
И я пишу изображение в своей другой программе с помощью: cv2.imwrite("image.pgm", image)
И я вызываю скрипт следующим образом:
import subprocess
subprocess.Popen(["python3", "imshow.py"])
Хотя это создает некоторые грязные чтения, иногда этого достаточно для меня, лучшим решением было бы использование каналов или очередей между двумя процессами.
person
ElDani
schedule
22.09.2016
cv2.waitKey
, который на самом деле перекачивает сообщения для работы графического интерфейса. Его нужно вызывать достаточно часто, чтобы пользовательский интерфейс действительно реагировал на все необходимые события (например, перерисовку и т. д.). Если обработка занимает так много времени, и вы хотите одновременно иметь отзывчивый пользовательский интерфейс, вам нужно выполнить обработку в отдельном потоке. - person Dan Mašek   schedule 05.05.2016