Ho lo stesso problema e ho notato che il fps che la finestra viene aggiornata sta diventando più lento e lento fino a quando non si blocca completamente. Aumentare il waitKey (x) a qualcosa di più alto aumenta solo la durata di aggiornamento delle immagini, ma quando il tempo che cv2.imshow() deve calcolare supera il tempo di attesa (chiave), si interrompe semplicemente l'aggiornamento.
(Salta questo reclamo :) Penso che la combinazione cv2.imshow() with waitKey() sia un errore di progettazione completo, perché non è imshow() che blocca fino a quando l'interfaccia utente non viene aggiornata? Ciò renderebbe la vita molto più facile, senza dover chiamare WAITKEY) ogni volta (...
PS: C'è la possibilità di avviare un proprio thread per le finestre OpenCV OpenCV all'interno:
import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)
fonte: cv2.imshow command doesn't work properly in opencv-python
Beh questo non funziona per me, perché ho sempre questo errore quando l'eseguo:
(python3:1177): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
Attempt to unlock mutex that was not locked
Aborted
Forse si potrebbe provare e riferire se è lavoro per te?
Edit: Ok ho risolto il problema per me con la creazione di un imshow.py script separato:
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)
E sto scrivendo l'immagine nel mio altro programma con: cv2.imwrite("image.pgm", image)
E io sono chiamando lo script come questo:
import subprocess
subprocess.Popen(["python3", "imshow.py"])
Anche se questa è la creazione di un po 'di sporco letture a volte è sufficiente per me, una soluzione migliore potrebbe essere quella di utilizzare pipe o code tra i due processi.
È 'cv2.waitKey' che in realtà pompa i messaggi affinché la GUI funzioni. Deve essere chiamato abbastanza frequentemente affinché l'interfaccia utente risponda effettivamente a tutti gli eventi necessari (come i ripetuti, ecc.). Se l'elaborazione richiede molto tempo e si desidera avere un'interfaccia utente reattiva allo stesso tempo, è necessario eseguire l'elaborazione in un thread separato. –
@ DanMašek In un programma a thread singolo che funziona in sequenza mi aspettavo prima di eseguire un altro comando, dopo che è stata completata un'attività corrente (in questo caso aggiorna l'immagine). Grazie per il suggerimento con il threading, ma per essere onesti questo rende inutile il complicato – user3085931
Se non vuoi trattare i thread (anche se non è quello che considererei complicato, ma capisco che YMMV), l'altra possibilità è per fornire un modo per pompare i messaggi (chiama waitKey) mentre stai facendo l'elaborazione (tra i singoli passaggi). Sarà maldestro, ma almeno in questo modo la finestra rimarrà abbastanza reattiva. –