目标
学习如何读取、显示、保存视频。
学习如何读取摄像头并显示。
学习如何使用cv2.VideoCapture()和cv2.VideoWriter()函数。
从摄像头捕获视频
创建一个VideoCapture对象捕获视频。它的参数是一个设备索引号或视频文件的名称。设备索引号代表了特定摄像头。建立好对象后,可以一帧一帧地进行捕获。用完后要释放掉这个对象。
获得摄像头的视频并播放。
# coding: utf-8
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Our operations on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# Display the resulting frame
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
cap.read()返回一个布尔值。如果成功读取1帧,返回True。所以,可以通过检查这个返回值判断视频是否已经结束。
有时候,cap可能没有初始化摄像头。这种情况,会显示代码错误。可以通过cap.IsOpened()检查是否已经初始化。返回True就是成功的,否则用cap.open()函数打开。
你还可以通过函数cap.get(propId)获得一些视频的属性。propId的取值范围是0-18。每个值的定义可以通过查看 cv::VideoCapture::get()。其中的一些属性可以通过cap.set(propId,value)设置。
例如:你可以通过get函数获得帧的宽度和高度,cap.get(cv2.CAP_PROP_FRAME_WIDTH) / cap.get(cv2.CAP_PROP_FRAME_HEIGHT),默认返回的是640x480。也可以通过set函数设置宽度和高度,ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320) and ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)。
播放视频文件
将参数改为视频文件,就可以播放一个文件。cv2.waitKey()决定了每1帧之间的间隔,如果太小视频就非常快,如果太大就非常慢,25毫秒通常比较合适。
# coding: utf-8
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('01.mp4')
while cap.isOpened():
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
保存视频
创建一个VideoWriter对象。指定输出的文件名。指定FourCC编码。指定每秒帧数和帧大小。指定彩色还是灰度。
FourCC是一个4位编码用来指定视频编码器。
- In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID is more preferable. MJPG results in high size video. X264 gives very small size video)
- In Windows: DIVX (More to be tested and added)
- In OSX: MJPG (.mp4), DIVX (.avi), X264 (.mkv).
获得摄像头的视频,翻转图像,保存成avi格式的文件。
# coding: utf-8
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'DIVX')
# 需要保证VideoWriter的size和摄像头的size一致,否则无法保存
frame_width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
frame_height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
print("frame size:%fx%f", frame_width, frame_height)
frame_size = (int(frame_width), int(frame_height))
out = cv.VideoWriter('output.avi', fourcc, 20.0, frame_size)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()
网友评论