How to capture a picture in opencv - python

python newbie here I have following code which I'm using to capture a picture using opencv. It captures the picture when I press q key on keyboard.
Working fine so far.
import cv2
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
cv2.imshow('frame', rgb)
if cv2.waitKey(1) & 0xFF == ord('q'):
out = cv2.imwrite('capture.jpg', frame)
break
cap.release()
cv2.destroyAllWindows()
I need it to capture the picture when I give a command (like 'Capture now'). Can anyone help me how to capture a frame when user gives the written command rather than by pressing the key. Thanks

You can write like
reqCommand = 'Capture_pic'
command = input('Enter command')
if command == reqCommand:
out = cv2.imwrite('capture.jpg', frame)
Update:
This update is to make it enable to not block the execution of the program
import cv2
import threading
command = None
def process():
while True:
command = input('Enter command')
thread = threading.Thread(target=process)
thread.start()
cap = cv2.VideoCapture(0)
reqCommand = 'Capture_pic'
while(True):
ret, frame = cap.read()
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
cv2.imshow('frame', rgb)
if command == reqCommand:
out = cv2.imwrite('capture.jpg', frame)
thread.terminate()
break
cap.release()
cv2.destroyAllWindows()

Related

Python VideoCapture(0) my camera bad work

This my codes :
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
I write the code like this and try to open my camera, but the camera image looks like the screenshot.
Stop working screen shot
Any idea ? What is the reason?
It's indentation problem.
Try this code:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Provide proper indentation so the program works fine.
Press "q" to stop the program.

Python OpenCV cv2.waitKey(1) cause video window to freeze/not responding

So I'm running this piece of code.
import cv2
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture("Resources/test_video.mp4")
while True:
success, img = cap.read()
if img is None:
break
img = cv2.resize(img, (frameWidth, frameHeight))
cv2.imshow("Result", img)
keyPressed = cv2.waitKey(5)
if keyPressed == ord('q'):
break;
test_video.mp4 is a short video here The moment it finishes running, the "Result" window freezes and become not responding. Even when I press "Q", nothing happens.
I run the program on Anaconda Spyder. cv2 is installed using pip install opencv-python
Edit: the code has been fixed so that the window exit when "q" is pressed
Try adding these two lines at the end:
import cv2
frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture("Resources/test_video.mp4")
while True:
success, img = cap.read()
if img is None:
break
#img = cv2.resize(img, (frameWidth, frameHeight))
cv2.imshow("Result", img)
if cv2.waitKey(1) and 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
It could be that it's failing to release the resource at the end of the script. See this post for further reference: What's the meaning of cv2.videoCapture.release()?
It also seems to be a common issue. See here and here.
Edit: Update to respond to comment requesting video exit on 'q'. Replace the lines:
if cv2.waitKey(1) and 0xFF == ord('q'):
break
With:
key = cv2.waitKey(1)
if key == ord('q'):
break
Tested and behaviour is as expected using:
Python 3.7
OpenCV 3.4.2

OpenCV input delay in capturing frames

I have written a code to enable capturing images from webcam feed using OpenCV. However there is an input delay whenever I press the key to capture my frame. There is no delay when I use it to quit, but there a significant delay when I use capture. I measured this by printing a statement inside both the cases, on pressing c the statement takes a delay before printing. The problem seems to me something like...the camera resources are being used and not freed up in time for the next key press or something like that....but not sure.
import cv2 as cv
import numpy as np
import glob
import matplotlib.pyplot as plt
cap = cv.VideoCapture(1)
img_counter = 0
while True:
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# cv.imshow('frame',frame)
cv.imshow('gray', gray)
if not ret:
break
if cv.waitKey(1) & 0xFF == ord('q'):
print('helloq')
break
elif cv.waitKey(1) & 0xFF == ord('c'):
print('hello{}'.format(img_counter))
img_name = "opencv_frame_{}.png".format(img_counter)
cv.imwrite(img_name, gray)
img_counter += 1
I am using an external web camera and
cv2.__version__ = 3.4.2`
Solved your issue, it seems like its caused by your key check.
You should not call waitKey(1) more than once. It causes lag.
Try this solution:
cap = cv.VideoCapture(0)
img_counter = 0
while True:
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# cv.imshow('frame',frame)
cv.imshow('gray', gray)
if not ret:
break
key = cv.waitKey(1)
if key==ord('c'):
print('img{}'.format(img_counter))
img_name = "opencv_frame_{}.png".format(img_counter)
cv.imwrite(img_name, gray)
img_counter += 1
print("Succesfully saved!")
if key==ord('q'):
print('Closing cam...')
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()

Play video Basic

im new to python openCV,found this code from openCV page;
import cv2
cap = cv2.VideoCapture('Megamind.avi')
while (cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('MMR3', gray)
if cv2.waitkey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()*
Tried to run it but it gives error which after done some digging up, i replaced this line:
"cap = cv2.VideoCapture('Megamind.avi')" with this line:
"cap = cv2.VideoCapture('Megamind.avi', cv2.CAP_FFMPEG)"
The program run without error but the video windows("MMR3") was not displayed.
**Im using python 2.7.13 with opencv3 running on MacOs Sierra.
**Megamind.avi is available in the same folder where the code is
your cv2.imshow has to be in the whille loop. If your cv2.imshow() is outside while loop than it will only display the last frame of you video. Change you code to below code
import cv2
cap = cv2.VideoCapture('Megamind.avi')
while (cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('MMR3', gray)
if cv2.waitkey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()

OpenCV wont' capture from MacBook Pro iSight

Since a couple of days I can't open my iSight camera from inside an opencv application any more. cap = cv2.VideoCapture(0) returns, and cap.isOpened() returns true. However, cap.grab() just returns false. Any ideas?
Example Code:
import cv2
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
rval = True
while rval:
rval, frame = vc.read()
cv2.imshow("preview", frame)
key = cv2.waitKey(20)
if key == 27: # exit on ESC
break
Mac OS 10.8.5
Python 2.7.5 (but also not working from inside a C++ app)
OpenCV 2.4.6.1
This is how I got the camera working for your code (on OSX 10.6):
import cv2
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
rval, frame = vc.read()
while True:
if frame is not None:
cv2.imshow("preview", frame)
rval, frame = vc.read()
if cv2.waitKey(1) & 0xFF == ord('q'):
break
I had a segmentation fault after I grab an image. It turned out that I used cv2.destroyAllWindows() before cap.release(). Below I show working code.
cap = cv2.VideoCapture(0)
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#do some ops
cap.release()
cv2.imshow("output", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
This code works on El Captain.

Categories

Resources