参考:基于python opencv-python 的录制并保存USB摄像头视频(无声版)
主要用到:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
#设置视频格式, *'mp4v'\ *'flv1' \*'XVID' 分别对应 .mp4 .flv .avi
out = cv2.VideoWriter('output.mp4',fourcc, 60.0, (640,480))
#帧率, 大小
out.write(mat)#写入视频
out.release()#释放视频
测试发现如果没经过release()直接关闭程序, 视频文件会出错
完整代码
from dvp import *
import numpy as np
import cv2
#将帧信息转换为numpy的矩阵对象,后续可以通过opencv的cvtColor转换为特定的图像格式
def frame2mat(frameBuffer):
frame, buffer = frameBuffer
bits = np.uint8 if(frame.bits == Bits.BITS_8) else np.uint16
shape = None
convertType = None
if(frame.format >= ImageFormat.FORMAT_MONO and frame.format <= ImageFormat.FORMAT_BAYER_RG):
shape = 1
elif(frame.format == ImageFormat.FORMAT_BGR24 or frame.format == ImageFormat.FORMAT_RGB24):
shape = 3
elif(frame.format == ImageFormat.FORMAT_BGR32 or frame.format == ImageFormat.FORMAT_RGB32):
shape = 4
else:
return None
mat = np.frombuffer(buffer, bits)
mat = mat.reshape(frame.iHeight, frame.iWidth, shape) #转换维度
return mat
#定义主函数
def main():
cameraInfo = Refresh(); #刷新并获取相机列表
if(len(cameraInfo) == 0): #没有任何设备则退出
print(u"没有找到设备")
return
for k, v in enumerate(cameraInfo): #打印相机索引和名称
print(k, "->", v.FriendlyName)
while(True): #循环直到打开一台相机
str = input("请选定将要打开的相机索引号(0,1,2...):")
index = (int)(str) #输入的索引号字符串转换为整数
camera = Camera(index) #以索引号的方式打开相机
print(camera); #打印相机信息
break
camera.TriggerState = False #从触发模式切换到连续出图模式
camera.Start() #启动视频流
fourcc = cv2.VideoWriter_fourcc(*'mp4v')#设置视频格式, *'mp4v'\ *'flv1' \*'XVID' 分别对应 .mp4 .flv .avi
out = cv2.VideoWriter('output.mp4',fourcc, 60.0, (640,480))#帧率, 大小
while (cv2.waitKey(1) != 27): #按ESC键则退出循环
print(camera.FrameCount) #打印帧统计信息
frame = camera.GetFrame(3000) #从相机采集图像数据,超时时间为3000毫秒
mat = frame2mat(frame) #转换为标准数据格式
cv2.imshow(u"Preview (Press ESC exit)", mat) #显示图像数据
out.write(mat)#写入视频
out.release()#释放视频
cv2.destroyAllWindows() #销毁窗口
camera.Stop() #停止视频流
camera.Close() #关闭相机
#执行主函数
main()