草庐IT

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

Miles强 2023-07-24 原文

使用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

有关OpenCV录制视频并保存最新的10秒钟的更多相关文章

  1. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  2. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  3. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  4. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  5. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  6. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  7. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  8. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  9. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  10. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

随机推荐