Why does the OpenCV loop not end - python

i have a simple webcam opening using cv2 module:
cap=cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.imshow('webcam',img)
k=cv2.waitKey(10)
if k == 27:
break
cap.release()
cv2.destroyWindows()
this program runs for ever, although i try to close it, the only way is closing vsCode

You can close the webcam window by clicking on your webcam window and press esc while if you want to close it with specific alphabet then you can use the below code to destroy the window by pressing q.
import cv2
cap=cv2.VideoCapture(0)
while True:
ret, img = cap.read()
cv2.imshow('webcam',img)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

Related

Camera don't show image in openCV

I am using below code to access my laptop camera or usb webcam but it doesn't work. I am not sure how to debug this to get to root cause of this issue. Code and output:
import cv2
vid = cv2.VideoCapture(0)
print (vid)
print (vid.isOpened())
while(vid.isOpened()):
ret, frame = vid.read()
print (ret)
print (frame)
if not ret:
break
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
vid.release()
cv2.destroyAllWindows()
The output of above is
<VideoCapture 0000000002DAE970>
True
False
None
When the cv2.VideoCapture(0) is executed I can see my laptop's camera light lit up and same happens when cv2.VideoCapture(1) is executed, I can see my webcam's light lit up. I am not sure why ret, frame = vid.read() ret is being return as False and image as None.
Please note that both cameras work in skype and other utilities. Even on VLC as well. I have checked in my device manager and they both show up. I am running this on Windows 7, openCV version is 4.5.5 and Python version is 3.8.6
Regards,
Yasar

why doesn't python give me the option to close openCV window?

I have the following code that prints the following image. Why don't I have the option to close the window (small Red Cross missing in top left corner)?
import cv2
img = cv2.imread('/Users/natashabustnes/Desktop/geeks14.png')
cv2.imshow('image', img)
cv2.waitKey(0)
Your code displays window and waits for a keypress.
When you pressed a key, waitKey returned and the GUI froze because there's was no more instructions.
Do something like this instead.
import cv2
img = cv2.imread('/Users/natashabustnes/Desktop/geeks14.png')
cv2.imshow('image', img)
while True:
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
This code waits until you press the 'q' button before closing.
OpenCV by default does not support closing windows using the normal close button.

Python macOS Mojave cv2.waitKey doesn't work

Since I updated my mac to Mojave, my python script doesn't work properly.
cap = cv2.VideoCapture(0)
cv2.namedWindow('frame', cv2.WINDOW_NORMAL)
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
key=cv2.waitKey(0) & 0xFF
print(key)
if key == ord('q'):
break
cv2.destroyAllWindows()
If I run this Script on my mac and press q, I will just get the mac beep sound and nothing happens. On Ubuntu instead it prints 113 and closes the window. Any ideas how I can fix this issue?

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

Can't save video on Raspberry PI by using python with OpenCV

import cv
import cv2
cap = cv2.VideoCapture(0)
cap.set(8,100)
out = cv2.VideoWriter('/home/pi/Desktop/output.mp4',cv2.cv.CV_FOURCC('D','I','V','X'),20.0,(640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(10) == 27:
break
cv2.VideoCapture(0).release()
out.release()
cv2.destroyAllWindows()
This code worked but it never stopped and no video file had been saved. Does anyone know how to solve this? Thanks a lot.
Both release() calls can be removed.
cv2.VideoCapture(0).release()
would call release() on a new VideoCapture, what you meant was cap.release().
For the VideoWriter, the release method doesn't exist - you don't have to care about releasing the VideoWriter or VideoCapture in Python. They will be released when their object is destroyed at the end of your program.

Categories