OpenCV Python: Comment détecter si une fenêtre est fermée?
J'ai le code suivant:
total_frames = 50
cv2.cv.NamedWindow("Dragonfly Simulation")
cv2.cv.StartWindowThread()
for i in range(total_frames):
# do stuff
img_name = # something
img = cv2.cv.LoadImage(img_name)
cv2.cv.ShowImage("Dragonfly Simulation", img)
cv2.cv.WaitKey(2)
cv2.cv.DestroyWindow("Dragonfly Simulation")
cv2.cv.WaitKey(1)
# rest of code
Alors que faut-il faire:
- Ouvre une fenêtre
- Dans une boucle, montre une image sur la fenêtre
- Une fois terminé, ferme la fenêtre
- Exécute le reste du code
Toutefois, dans ce cas, j'ai le total_frame
donné avant. Je n'en veux pas.
Au lieu de cela, je veux un code qui effectue les opérations suivantes:
- Ouvre une fenêtre
- Dans une boucle, montre une image sur la fenêtre
- Attend à l'utilisateur de fermer cette fenêtre
- Lorsque l'utilisateur ferme la fenêtre, à la sortie de la boucle, se poursuit avec le reste du code.
Cependant, je ne peux pas trouver une fonction dans OpenCV qui permet de détecter quand l'utilisateur ferme une fenêtre. Quelqu'un peut-il suggérer une solution s'il vous plaît?
Peut-être il y a quelques exceptions que vous pouvez attraper? Par exemple, essayez d'accès de la fenêtre, si elle ne parvient pas à NoWindowExistsException/NullPointerException puis aller avec votre code.
euh, désolé, je suis nouveau sur OpenCV, comment puis-je vérifier l'exception? avec mon code actuel, si je ferme la fenêtre, le code s'arrête. aussi, dans le manuel de ShowImage: "Si la fenêtre n'a pas été créé avant cette fonction, il est supposé la création d'une fenêtre avec CV_WINDOW_AUTOSIZE"
Je ne suis pas familier avec OpenCV. J'ai juste pensé que l'instance va rester après la fermeture de la Fenêtre. C'est peut-être ce que vous recherchez? Pour stocker une référence de cv à l'échelle mondiale afin d'y avoir accès, peu importe si la Fenêtre est fermée? Je suis juste spéculer.
euh je suis la modélisation d'un neurone de la simulation, donc je veux exécuter la simulation, tant que l'utilisateur le souhaite (au lieu d'une durée de temps spécifiée ou le nombre de frames). Donc en voulant détecter lorsque l'utilisateur ferme la fenêtre. Je suppose que sinon je pouvais détecter de frappe sur le clavier? pas entièrement sûr de savoir comment faire si...
Pouvez-vous fermer la fenêtre au cours de la boucle?
euh, désolé, je suis nouveau sur OpenCV, comment puis-je vérifier l'exception? avec mon code actuel, si je ferme la fenêtre, le code s'arrête. aussi, dans le manuel de ShowImage: "Si la fenêtre n'a pas été créé avant cette fonction, il est supposé la création d'une fenêtre avec CV_WINDOW_AUTOSIZE"
Je ne suis pas familier avec OpenCV. J'ai juste pensé que l'instance va rester après la fermeture de la Fenêtre. C'est peut-être ce que vous recherchez? Pour stocker une référence de cv à l'échelle mondiale afin d'y avoir accès, peu importe si la Fenêtre est fermée? Je suis juste spéculer.
euh je suis la modélisation d'un neurone de la simulation, donc je veux exécuter la simulation, tant que l'utilisateur le souhaite (au lieu d'une durée de temps spécifiée ou le nombre de frames). Donc en voulant détecter lorsque l'utilisateur ferme la fenêtre. Je suppose que sinon je pouvais détecter de frappe sur le clavier? pas entièrement sûr de savoir comment faire si...
Pouvez-vous fermer la fenêtre au cours de la boucle?
OriginalL'auteur dessskris | 2016-01-25
Vous devez vous connecter pour publier un commentaire.
J'étais juste à la recherche d'un moyen de détecter si la fenêtre a été fermée à l'aide de la
X
bouton de la fenêtre, en plus d'attendre pour une pression de touche, mais je ne pouvais pas trouver une réponse, n'importe où (IsWindowVisible
etcvGetWindowHandle
ne sont pas disponibles dans le Pythoncv2
module).J'ai donc joué un peu et voilà comment cela fonctionne:
cv2.getWindowProperty()
retourne-1
dès que la fenêtre est fermée.Pour plus d'explications, voir la documentation pour le dénombrement des
cv::WindowPropertyFlags
: arriver le drapeau avec l'indice de0
est la propriété fullscreen, mais en réalité, il n'est pas question que le drapeau à utiliser, ils deviennent tous-1
dès que la fenêtre est fermée.en Python ou en C++? Je n'obtiens aucune erreur en Python, et aussi j'ai utilisé OpenCV version 3.1... vous pouvez essayer en l'enveloppant dans un try/catch et de sortie dans l'instruction catch.
Oui, en Python, try..catch ne peux pas aider, parce que la opencv écrit dans stderr au lieu de jeter de l'python exception (mais ne pas s'en soucier, je l'ai réécrit déjà sur wx : ) ). Merci pour votre aide!
OriginalL'auteur Simon Hänisch
À partir de la version 2.2 il existe une solution simple (ce qui est modifié à partir de la boucle hist.py):
OriginalL'auteur David Kohen
OriginalL'auteur stephen george
Je l'ai testé sur le C++ à l'aide de la getWindowProperty('image', WND_PROP_VISIBLE), mais il ne fonctionne pas. J'ai donc utilisé le WND_PROP_AUTOSIZE et il fonctionne.
J'ai fait comme ceci:
cv2.imshow("image", image) if cv2.getWindowProperty('image',1) < 0: break
Oùcv2.getWindowProperty(<windowName>, 1)
se réfère à la autosize drapeau. [docs.opencv.org/3.1.0/d7/dfc/...OriginalL'auteur Derzu
Sûr, vous pouvez vérifier les entrées de l'utilisateur à l'aide de
waitKey
et voici un petit exemple basé sur votre code. J'ai changé la vieille interface cv à cv2. Je pense que le cv est obsolète.(Edit) j'ai déménagé cv2.destroyAllWindows() à l'intérieur de la boucle while pour le rendre clair que la fenêtre se ferme lorsque l'utilisateur appuie sur la touche ESC (que vous pouvez affecter une touche de votre choix). Je ne pense pas que opencv dispose d'un gestionnaire d'événement pour attraper la fenêtre près de l'événement, comme dans d'autres GUI toolkit (wxPython etc). De sorte que vous aurez besoin de définir la façon dont vos utilisateurs doit fermer la fenêtre et de regarder pour cela.
OriginalL'auteur otterb