Python OpenCV - waitKey(0) does not respond? - python

I'm using opencv 2.4.7 on ubuntu 12.04. I'm programming with python and I have a problem when i run this script:
import cv2
img = cv2.imread('347620923614738322_233985812.jpg')
cv2.namedWindow("window")
cv2.imshow("window", img)
cv2.waitKey(0)
The problem is that the script doesn't stop when I close the image. I searched information about waitKey and I found that using cv2.waitKey(0) is correct.
I don't understand, where is the problem?

I found that it works if i press the key whilst the window is in focus. If the command line is in focus then nothing happens

Adding a cv2.waitKey(1) after you destroy the window should work in this case.
cv2.imshow('imgae',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

This code works for me from IDLE:
# -*- coding: utf-8 -*-
# Objectif : découvrir le fonctionnement d'opencv-python
# http://opencv-python-tutroals.readthedocs.org/en/latest/index.html
import numpy as np
import cv2
# Load an color image in grayscale
img = cv2.imread('Lena.tiff',0)
WINDOW_NAME = 'Image de Lena'
cv2.namedWindow(WINDOW_NAME, cv2.CV_WINDOW_AUTOSIZE)
cv2.startWindowThread()
# Display an image
cv2.imshow(WINDOW_NAME,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Hope this helps for future readers.

click on the image window(active) and then press and key, don't write in the terminal window.

Here a minimalistic code for best performance on all platforms:
import cv2
img = cv2.imread("image.jpg")
cv2.imshow("Window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
And now some observations:
When the user wants to close the window through the press of the 0 key, he/she has to make sure that the 0 key is pressed whilst the window is in focus. Because as stated above, if the terminal is in focus nothing happens and code execution stucks at the cv2.waitKey(0) until the 0 key is pressed properly whilst the window is in focus.
Pressing the 0 key whilst the window is in focus is the right way to close the window and make sure that, once the window is destroyed in line cv2.destroyAllWindows() and the program ends, the user can get back the control of the terminal.
If the window is exited by mouse click, the window will be destroyed yes, but the user will very much end up in the situation of not being able to get back the control of the terminal. In this kind of situation the user may want to shut down the unresponsive terminal and open a new one.

Try to execute the script directly from the Terminal works 100% for me but not from an IDE for example , i explain :
I'm using fedora 20 and got the same problem, copying the first example from official opencv python tutorial, i'm using :
Fedora 20 64bit
Spyder IDE for python
Python Version 2.7.5
Fedora 64 bit
OpenCV 2.4.7
Here is the code for test
import cv2
img = cv2.imread('/path/image1.jpeg',0)
cv2.imshow('Display',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
When running this script using F5 from Spyder, it runs it using the embedded python terminal with this line :
runfile('/home/user/Workspace/test.py', wdir=r'/home/user/Workspace')
In this instance, cv2.waitKey(0) or cv2.waitKey(-1) are not working and windows remains opened after pressing keys with the code of the example
Trying to close the windows will result in a "Not Responding , Force to Quit" Alert
But when executing the script from Terminal , it works 100%
didn't found the problem origin , will update if i find it.

Solved in Spyder under Ubuntu by following [Run]->[Configuration per file]->[Execute in an external system terminal].

Well the use cv2.waitKeyEx(0).
It runs in the same way and waits for your response until you revoke it.
I hope it helps.
Nithesh varmma

cv2.waitKey(0) means that script is in infinity loop with 0 miliseconds wait after loop
.only specified key can stop it.
you did not specified end of app condition.
Try this code:
Using other keys for the waitKey() function of opencv

There is a problem with unix based system running opencv programs from python notebooks.
Check this alternate method My suggestion is to run code in python in terminal. You will not face any kind of problem
Copy the same code and save with filename.py
import cv2
input = cv2.imread('path_to_image.png')
cv2.imshow('Hello World', input)
cv2.waitKey(0)
cv2.destroyAllWindows()
then open specific directory and then open terminal
Steps:
Open Terminal
cd path/to/filename.py
source activate YOURPROFILE
python filename.py
This will solve problem
https://youtu.be/8O-FW4Wm10s

This will work even if you close the window using the cross button on the window.
import numpy as np
import cv2
img = cv2.imread('arvid.jpg', 0)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img)
while True:
k = cv2.waitKey(30) & 0xFF
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('arvid2.jpg', img)
cv2.destroyAllWindows()
if cv2.getWindowProperty("image", 0) == -1:
break

This problem occurs in some earlier version of opencv.
So you just need to update opencv to the latest version. Version 4.0.0.21 worked for me.
Use the command below.
update opencv to version 4.0.0.21.

Related

Python Image Window Not Closing Properly on Mac

I'm working with OpenCV and trying to figure this out. When I want to read and show an image:
import cv2
img = cv2.imread('baboon.jpg', 0)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyWindow('image')
I write this. But whenever the image display window pops up, I'm not able to close it and execute everything after
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyWindow('image')
because the window will not close unless I quit it.
For example, if I run this code
import cv2
img = cv2.imread('baboon.jpg', 0)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyWindow('image')
#Nothing after this will get executed
print('Hello')
I get no output in my console, but the image window does pop up.
How can I fix this?
(I'm using Pycharm if that helps)
EDIT:
It seems that whenever I press any key the window closes and it works as intended (code after the comment is executed). Not sure why this is happening.
I believe the quit is acting as an interrupt, which quits the entire python program. This is different than pressing a key, which is incorporated into the logic of the actual program and continues to completion:
cv2.waitKey(0) # waits for any key to be pressed to continue the logic of the program
# this is what actually allows you to "display" an image without it immediately disappearing.
I believe you can click on anywhere in the pic and it would return to the code window

What is the use of function destroyAllWindows() if the window automatically gets destroyed using waitKey() function?

#!/usr/bin/python3
import cv2
cam=cv2.VideoCapture(0)
checking if camera is working!!
cam.isOpened():
print("Working")
while(cam.isOpened()):
status,frame=cam.read()
cv2.imshow('camera1',frame)
if cv2.waitKey(1) & 0xFF==ord('q') :
break
Removing windows by calling below function
If i dont write this function then also it will run properly!!
cv2.destroyAllWindows()
cam.release()
Closes all the open GUI windows.

Window freezing even after using waitKey() and destroyAllwindows() in Opencv

ENVIRONMENT
OS- mint Linux,
using opencv3.1,using spyder through anaconda
ISSUE
The code mentioned below opens a window of name frame and display the video captured through laptop camera.But when I press 'q', as mentioned in code, it should stop and terminate the window. But,here the window stops to display any further frames captured and do not terminates.then manually I force Quit the process.
What is the problem, why is it not terminating the window?
CODE:-
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
There is an open bug with this issue:
https://github.com/opencv/opencv/issues/7343
There are also similar questions without a good solution:
opencv videocapture hangs/freeze when camera disconnected instead of returning "False"
Try the solutions here: DestroyWindow does not close window on Mac using Python and OpenCV Calling several times waitKey seems to work for many people. You can try without the release() as well
I use macOS BigSur and also had this issue, I ended my code with the lines below and had no problem later:
video = cv.VideoCapture("your_video.mp4") # or 0 for your camera
while(video.isOpened()):
ret, frame = video.read()
if ret:
# Your frame manipulations
if cv.waitKey(1) & 0xFF == ord('q'):
video.release()
cv.waitKey(0)
cv.destroyAllWindows()
break
else:
break
video.release()
cv.waitKey(0)
cv.destroyAllWindows()
This will destroy the freezed window of the video but you have to press 3 times Q. One por stopping the video, one more for closing the window and one last for releasing the kernel if you're running on the Jupiter Notebook.
I also recommend to restart and clear all outputs in the kernel tab after applying the code because it could not work if so.
apparently this solves the issue, just include this line on top:
import pyautogui

Minimize OpenCV HighGUI Window

I see it is possible to resize window with OpenCV, for example:
import cv2
img = cv2.imread('Test.jpg')
cv2.imshow('image',img)
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 600,600)
cv2.waitKey(0)
cv2.destroyAllWindows()
But is it possible to minimize current window?
I think this is maybe cv2.setWindowProperty()this function for example here is fullscreen
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.imshow("window", img)
Well, there is no function/method in openCV official documentation to minimize the window automatically. You can try different method with python to do the task. Such method can be found here: Is there a way to minimize a window in Windows 7 via Python 3?
Though i'm posting it here too for complete reference:
To minimize a window you need to know either the title of the window, or its window class. The window class is useful when the exact window title is not known. For example the following script shows two different ways to minimize the Microsoft Windows Notepad application assuming:
import ctypes
notepad_handle = ctypes.windll.user32.FindWindowW(None, "Untitled - Notepad")
ctypes.windll.user32.ShowWindow(notepad_handle, 6)
notepad_handle = ctypes.windll.user32.FindWindowW(u"Notepad", None)
ctypes.windll.user32.ShowWindow(notepad_handle, 6)
To determine the class name to use, you would need to use an tool such as Microsoft's Spy++. Obviously if Notepad was opened with a file, it would have a different title such as test.txt - Notepad. If this was the case, the first example would now fail to find the window, but the second example would still work.
If two copies of notepad were running, then only one would be closed. If all copies needed to be closed, you would need to enumerate all windows which requires more code.
The ShowWindow command can also be used to restore the Window.
Maybe this code will help you, I use it to detect mouse events to minimize the opencv GUI when I click it, obviously, you can create another more interesting application with this:
import cv2
import numpy as np
import win32gui,win32con
a = np.zeros((200,200,3),np.uint8)
def tactil_sec(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.imshow("LOL",a)
Minimize = win32gui.GetForegroundWindow()
win32gui.ShowWindow(Minimize, win32con.SW_MINIMIZE)
cv2.namedWindow('LOL')
cv2.setMouseCallback('LOL',tactil_sec)
while 1:
cv2.imshow("LOL",a)
if (cv2.waitKey(20) & 0xFF == 27):
break
cv2.destroyAllWindows()

OpenCV display image in fullscreen on Mac without white border

I'm running opencv version 3.1.0 and python 2.7 on Mac OSX 10.9 and want to display a black image on fullscreen. My screen's resolution is 2880x1800.
However when I attempt to do so, there is a large white border on the top of the screen.
Here's my code, note that black.jpg is a 2880x1800 image.
import cv2
img = cv2.imread("black.jpg")
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("window",cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.imshow("window", img)
while True:
key = cv2.waitKey(20)
#exit on ESC
if key == 27:
break
I've also tried to just create a black image manually, using the following code.
import cv2
import numpy as np
img = np.zeros((1800, 2880))
cv2.namedWindow("window", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("window", cv2.WND_PROP_FULLSCREEN,cv2.WINDOW_FULLSCREEN)
cv2.imshow("window",img)
cv2.waitKey(0)
I've adjusted the dimensions of the numpy array to make it larger but the border still remains.
Doing some research I've discovered that this may be a bug with opencv. However the solutions only apply to windows operating systems, see the following:
OpenCV window in fullscreen and without any borders
and
How to display an image in full screen borderless window in openCV
If anyone has an idea of how to fix the bug for Macs I can go ahead and rebuild the library. Or if I am doing something incorrectly please let me know. Thanks!
I guess the key is to adapt the image size to the REAL macbook screen resolution. 1800x2880 probably is not the one you are currently adopting.
Find out the display resolution of your macbook at System Preferences -> Display -> Scaled
Code with OpenCV
import cv2
def show_full_screen_image():
while True:
print 'loading images...'
img = cv2.imread('preferred_image.png')
# Note: 900x1440 is the resolution with my MBP
img = cv2.resize(img, (1440, 900), interpolation=cv2.INTER_CUBIC)
cv2.namedWindow("test", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("test", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
cv2.imshow("test", img)
key=cv2.waitKey(0)
if key==27: # ESC to exit
break
if __name__ == '__main__':
show_full_screen_image()
The problem in those links is not the presence of a border, but the window's background showing through for some reason. From what I understand, OpenCV's namedWindow actually creates a two windows, one inside the other. The "white lines" are actually the grey background of the parent window. You might be facing the same problem in OSX since openCV creates windows this way.
I solved it in windows by changing the background colour of the parent window through the Windows API, maybe you can try something similar in OSX.

Categories