How to Capture Frames from Camera with OpenCV in Python
Introduction
OpenCV is a library of programming functions mainly aimed at real-time computer vision. It is widely used to capture images from cameras, do some processing, and then play it back or save it. The following wiki includes a small sample program in Python to capture frames from camera.
Dependencies
- Python
- OpenCV >= 3.0
- v4l-ctl
Video Device Information
1. Get the ID of the camera to be used
ls /dev/video*
You may get several video entries depending on the number of video devices that are connected
/dev/video0 /dev/video1
2. Choose the video device and verify formats
Install required tool
sudo apt install v4l-utils
Run the following command to get available image formats
v4l2-ctl --device /dev/video0 --list-formats-ext
You will get a results with supported formats by video source
ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.017s (60.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 640x480 Interval: Discrete 0.008s (120.101 fps) Size: Discrete 800x600 Interval: Discrete 0.017s (60.000 fps) Size: Discrete 1280x1024 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 320x240 Interval: Discrete 0.008s (120.101 fps) Index : 1 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Size: Discrete 1920x1080 Interval: Discrete 0.167s (6.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.111s (9.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.167s (6.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 800x600 Interval: Discrete 0.050s (20.000 fps) Size: Discrete 1280x1024 Interval: Discrete 0.167s (6.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps)
Example
With the information obtained from the previous section you can use the video device ID and the video format and resolution.
import cv2 # Open the device at the ID 0 # Use the camera ID based on # /dev/videoID needed cap = cv2.VideoCapture(0) #Check if camera was opened correctly if not (cap.isOpened()): print("Could not open video device") #Set the resolution cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) # Capture frame-by-frame while(True): ret, frame = cap.read() # Display the resulting frame cv2.imshow("preview",frame) cv2.imwrite("outputImage.jpg", frame) #Waits for a user input to quit the application if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyAllWindows()