OpenCv:采集摄像头视频、读取视频帧与视频录制

目录

一、涉及OpenCv函数

二、什么是帧、帧的大小代表什么

三、摄像头获取视频数据

四、录制视频并保存


一、涉及OpenCv函数

从设备,可以是摄像头可以是本地视频,获取视频的函数 cv.VideoCapture()。本函数作用在于创建一个VideoCapture或者VideoWriter对象,真正的读取和写入是通过创建的对象进行read和write的调用的。视频可以采用不同的格式,如AVI,MP4,MOV等,这些格式定义了视频文件的编码方式、分辨率、帧率等参数。

  • 视频写入函数 cv.VideoWriter()
  • 读取视频/打开摄像头 cv.VideoCapture()
  • 写入视频 cv.VideoWriter()
  • 打开,判断是否打开isOpened () open()
  • 获取参数,更改参数 cv.VideoCapture.get(propId) cv.VideoCapture.set(propId, value)
  • 释放视频 cv.VideoCapture.release()

二、什么是帧、帧的大小代表什么

视频的基本组成部分是帧(frame), 即一系列静态图像,这些图像在一定速率下以连续的方式播放,形成动态图像,例如30帧/秒。视频每秒的帧数被称为帧率(Frame Rate),通常用"fps" (Frames Per Second)表示。例如,30fps表示视频每秒钟包含30帧图像。帧率决定了视频的流畅度和真实感。较高的帧率可以使视频看起来更加流畅,因为它们可以更快地刷新图像。例如,60fps的视频比30fps的视频看起来更加流畅。此外,较高的帧率还可以减少视频中的模糊和颤动,因为它们可以更好地捕捉运动。但较高的帧率会导致文件变大和编解码更复杂,因为需要处理更多的帧图像。30帧即代表一秒展现30张图片

三、摄像头获取视频数据

代码:

python 复制代码
import cv2 as cv

# 创建VideoCapture对象,用创建的对象去做之后的操作
cap = cv.VideoCapture(0)
# 检测有无摄像头正常使用
# 这是一个必要的验证,当cap为空的时候,后续调用会报错。
if not cap.isOpened():
    print("Cannot open camera")
    exit()

# 获取视频流是一个连续的循环过程,一直在获取,不是说获取到一帧就可以了
while True:
    # 通过创建的VideoCapture对象逐帧获取视频,会返回两个参数,ret返回true和false代表是否正常获取到帧,以及视频是否结束
    # frame代表获取到的帧
    ret, frame = cap.read()
    # if frame is read correctly ret is True
    if not ret:
        print("不能正常读取视频帧")
        break
    # 将获取到的视频帧,也就是一幅幅图像,转为灰度图
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 展示
    cv.imshow('frame', gray)
    # q退出获取视频流
    if cv.waitKey(1) == ord('q'):
        break
# 释放资源
cap.release()
cv.destroyAllWindows()

四、录制视频并保存

代码如下:

python 复制代码
import cv2


# 视频的本质上就是由一幅一幅的图片组成
# 24帧 60帧(表示一秒显示60张图片)


# 创建一个窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',640,480)

# 打开摄像头
cap = cv2.VideoCapture(0)
# 打开视频
# cap = cv2.VideoCapture('1.mp4')
# 保存视频
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
vw = cv2.VideoWriter('123.mp4',fourcc,30,(640,480))



# 循环读取摄像头的每一帧
while True:
    # 读一帧数据,返回标记,True表示读到了数据,False表示没读到数据
    ret,frame = cap.read()

    #可以根据ret做个判断
    if not ret:
        #没读到数据,直接退出
        break
    vw.write(frame)
#     显示数据
    cv2.imshow('video',frame)

    key = cv2.waitKey(1000 // 30)
    if key & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
vw.release()
cv2.destroyAllWindows()
相关推荐
一 铭35 分钟前
AI领域新趋势:从提示(Prompt)工程到上下文(Context)工程
人工智能·语言模型·大模型·llm·prompt
顾道长生'2 小时前
(Arxiv-2025)通过动态 token 剔除实现无需训练的高效视频生成
计算机视觉·音视频·视频生成
麻雀无能为力4 小时前
CAU数据挖掘实验 表分析数据插件
人工智能·数据挖掘·中国农业大学
时序之心4 小时前
时空数据挖掘五大革新方向详解篇!
人工智能·数据挖掘·论文·时间序列
.30-06Springfield5 小时前
人工智能概念之七:集成学习思想(Bagging、Boosting、Stacking)
人工智能·算法·机器学习·集成学习
说私域6 小时前
基于开源AI智能名片链动2+1模式S2B2C商城小程序的超级文化符号构建路径研究
人工智能·小程序·开源
永洪科技6 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi
shangyingying_16 小时前
关于小波降噪、小波增强、小波去雾的原理区分
人工智能·深度学习·计算机视觉
书玮嘎7 小时前
【WIP】【VLA&VLM——InternVL系列】
人工智能·深度学习
猫头虎7 小时前
猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
运维·人工智能·gpt·开源·自动化·文心一言·ai编程