OpenCV录制视频并保存最新的10秒钟

使用opencv保存视频需要用到VideoWriter对象

VideoWriter(filename, fourcc, fps, frame_size[, isColor])

参数:

  • filename:文件路径

  • fourcc:Four-Character Codes,四字符代码,该编码由四个字符组成
    设置fourcc有两种写法:
    1、cv2.VideoWriter_fourcc(‘O’,‘O’,‘O’,‘O’)
    2、cv2.VideoWriter_fourcc(*‘OOOO’)
    O代表一个字符,英文要么全部大写,要么全部小写

      I420,YUV编码,视频格式为.avi
      PIM1,MPEG-1编码,视频格式为.avi
      XVID,MPEG-4编码,视频格式为.avi
      THEO,Ogg Vorbis,视频格式为.ogv
      FLV1,Flash视频,视频格式为.flv
      AVC1,H264编码
      DIV3,MPEG-4.3编码
      DIVX,MPEG-4编码
      MP42,MPEG-4.2编码
      MJPG,motion-jpeg编码
      U263,H263编码
      I263,H263I编码
      MP4V,视频格式为.mp4
    

例如:

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  • fps:被创建视频流的帧率
  • frame_size:视频流的大小
  • isColor:如果为True则每一帧为彩色图,否则为灰度图,默认为True

录制视频代码:

import cv2
# 0表示从摄像投中读取视频,如果是视频文件直接写地址就好
vc = cv2.VideoCapture(0)
# 设置FPS为60帧
vc.set(cv2.CAP_PROP_FPS, 60)
# 获取FPS 每秒多少张图片
FPS = int(vc.get(cv2.CAP_PROP_FPS))
# 设置编码类型为mp4
FOURCC = cv2.VideoWriter_fourcc(*'mp4v')
# 录制avi的视频
# vc.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# FOURCC = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# 可以指定图像的宽高,但要与写入时一致,这里直接得到摄像头拍摄的视频的宽和高
WIDTH = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建VideoWriter对象,用于视频保存
videoWrite = cv2.VideoWriter('test.mp4', FOURCC, FPS, (WIDTH, HEIGHT))


while vc.isOpened():
    ret, frame = vc.read()
    frame = cv2.flip(frame, -1)
    if not ret:
        break
    cv2.imshow('frame', frame)
    videoWrite.write(frame)
    if cv2.waitKey(10) & 0xFF == 27:
        break

# 释放   
videoWrite.release()
vc.release()
vc.destroyAllWindows()

录制只保存最新的10秒钟视频:

对于有些项目而言不需要将视频全部保存下来,只需要保存最新录制的一段视频,这里我采用使用队列的方式保存视频帧,当超过一定的帧数是,先入队的队头出队,后入对的队尾入队。

在录制视频的代码上做出修改:

先创建队列类:

class Queue:
    def __init__(self):
        # 初始化队列
        self.items = []

    def isEmpty(self):
        # 清空队列
        return self.items == []

    def enqueue(self, item):
    	# 队尾入队
        self.items.insert(0,item)

    def dequeue(self):
    	# 队头出队
        return self.items.pop()

    def size(self):
    	# 队列长度
        return len(self.items)
        
# 初始化队列 
q=Queue()
q.isEmpty()

以30帧录制并保存最新10秒的视频:


# 0表示从摄像投中读取视频,如果是视频文件直接写地址就好
vc = cv2.VideoCapture(0)
# 设置FPS为30帧
vc.set(cv2.CAP_PROP_FPS, 30)
# 获取FPS 每秒多少张图片
FPS = int(vc.get(cv2.CAP_PROP_FPS))
# 设置编码类型为mp4
FOURCC = cv2.VideoWriter_fourcc(*'mp4v')
# 录制avi的视频
# vc.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# FOURCC = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# 可以指定图像的宽高,但要与写入时一致,这里直接得到摄像头拍摄的视频的宽和高
WIDTH = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建VideoWriter对象,用于视频保存
videoWrite = cv2.VideoWriter('test.mp4', FOURCC, FPS, (WIDTH, HEIGHT))

# 保存300帧
FRAME_NUM = 300
while vc.isOpened():
    ret, frame = vc.read()
    frame = cv2.flip(frame, -1)
    if not ret:
        break
    cv2.imshow('test', frame)
    # 队尾入队
    q.enqueue(frame)
    # 当录制帧数大于设定帧数,则队尾入队
    if(q.size() > FRAME_NUM):
        q.dequeue()

    # 手动按q关闭,关闭时保存视频
     if cv2.waitKey(33) & 0xFF == ord('q'):
        for i in range(q.size()):
            videoWrite.write(q.items[i])
        break

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值