VideoCapture() 虚拟采集器,一般设备号从0开始
cap.read() 读取视频帧
返回值有两个,第一个为状态值,读到帧为true
第二个值为视频帧
cap.release() 释放资源
示例程序:
import cv2 #引入CV库
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300) #设置窗口大小
#获取视频设备
cap = cv2.VideoCapture(0)
while True:
#从摄像头读视频帧
ret,frame = cap.read()
#将视频帧在窗口中显示
cv2.imshow('video',frame)
key = cv2.waitKey(1) #不能为0,0为等待中断,只能读取到一帧的数据
if(key & 0xFF == ord('q')):
break
#释放资源
cap.release() #释放视频资源
cv2.destroyAllWindows() #释放窗口资源
运行结果:
读取视频文件
从视频文件中读取视频帧
cap = cv2.VideoCapture("文件地址") #从文件获取视频
只处理视频,不处理音频,所以读取到的视频没有声音
播放速度设置
key = cv2.waitKey(40)
将视频数据录制成多媒体文件
VideoWriter()
write()
1秒多少帧,视频的像素(宽和高)
release() 释放资源,将磁盘中的数据输出
VideoWriter() 参数:
参数1:为输出文件位置
参数2:多媒体文件格式(VideoWriter_fourcc),fourcc所用编码器,Windows系统采用DIVX编码器
参数3:帧率
参数4:分辨率大小,应为摄像头实际分辨率
示例程序:
import cv2
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))
#
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300) #设置窗口大小
#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址") 从文件获取视频
while True:
#从摄像头读视频帧
ret,frame = cap.read()
#将视频帧在窗口中显示
cv2.imshow('video',frame)
#写数据到多媒体文件
vw.write(frame)
key = cv2.waitKey(1) #不能为0,0为等待中断,只能读取到一帧的数据
if(key & 0xFF == ord('q')):
break
#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows() #释放窗口资源
代码优化
问题1:显示窗口为什么变大了?
在视频帧在窗口显示时重新设置一下窗口大小。
问题2:使用isOpened()判断摄像头是否已打开
问题3:采集数据时要判断数据是否获取到了
优化过的程序:
import cv2
#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300) #设置窗口大小
#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址") 从文件获取视频
while cap.isOpened(): #判断摄像头是否已打开,若打开返回值则为True
#从摄像头读视频帧
ret,frame = cap.read()
if ret ==True : #判断是否读取到数据
#将视频帧在窗口中显示
cv2.imshow('video',frame)
cv2.resizeWindow('video',300,300) #重新设置窗口大小
#写数据到多媒体文件
vw.write(frame)
key = cv2.waitKey(1) #不能为0,0为等待中断,只能读取到一帧的数据
if(key & 0xFF == ord('q')):
break
else:
break
#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows() #释放窗口资源