视频基础操作

1.1. 例子

读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例

import cv2

try:
    cap=cv2.VideoCapture("CatCloth.mp4")
    if not cap.isOpened():
        print("Video can't be opened")
        raise IOError
    
    # 获取视频的宽度、高度和帧率
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    delay=int(1000/(fps)) #计算每帧视频播放延时

    # 创建 VideoWriter 对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    output_path="OutPut.mp4"
    out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

    while True:
        ret,frame=cap.read() #读取一帧数据
        if not ret:
            break
        #对每一帧图像进行处理
        # 转换为灰度图像
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 打上水印
        cv2.putText(gray_frame, "WaterMark", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        # 写入输出文件
        out.write(gray_frame)

        # 显示处理后的帧
        cv2.imshow("Processed Video", gray_frame)

        #此处延迟FPS计算出来的时间,按照视频原有速度播放视频 按q键退出
        if(cv2.waitKey(delay)&0xff==ord('q')):
            break

    # 释放 VideoCapture 和 VideoWriter 对象及所有窗口资源
    cap.release() 
    out.release()
    cv2.destroyAllWindows() 
except IOError as e:
    print(f'IOError:{e}')
except Exception as e:
    print(f"Error: {e}")

1.2. 常见操作补充说明

1.2.1. 读取视频文件或摄像头

使用 cv2.VideoCapture() 可以读取视频文件或摄像头。

cv2.VideoCapture 是一个用于捕获视频的类,可以从视频文件、摄像头或网络视频流中读取视频帧。它的构造函数和方法支持多种参数和重载形式,以便灵活地处理不同的视频源。

  1. 默认构造函数
cap = cv2.VideoCapture()
    • 创建一个空的 VideoCapture 对象,通常用于后续调用 open() 方法打开视频源。
  1. 从视频文件或摄像头打开
cap = cv2.VideoCapture(filename, apiPreference=CAP_ANY)
    • filename:视频文件路径或摄像头索引(整数,如 0 表示默认摄像头)。
    • apiPreference:指定使用的后端 API(如 cv2.CAP_ANYcv2.CAP_FFMPEG 等)。默认值为 cv2.CAP_ANY,表示自动选择合适的后端。
  1. 从视频文件或摄像头打开(带参数)
cap = cv2.VideoCapture(filename, apiPreference, params)
    • params:一个参数列表,用于指定额外的配置(如分辨率、帧率等)。参数以 (paramId, paramValue) 的形式传递。

常用参数解释:

  • filename
    • 可以是视频文件路径(如 'video.mp4')。
    • 可以是摄像头索引(如 0)。
    • 可以是网络视频流的 URL(如 'http://192.168.1.100:8080/video')。
  • apiPreference
    • 指定使用的后端 API,例如:
      • cv2.CAP_ANY:自动选择后端。
      • cv2.CAP_FFMPEG:使用 FFmpeg 后端。
      • cv2.CAP_MSMF:使用 Microsoft Media Foundation 后端(Windows)。
      • cv2.CAP_V4L:使用 Video4Linux 后端(Linux)。
  • params
    • 一个参数列表,用于指定额外的配置。例如:
      • cv2.CAP_PROP_FRAME_WIDTH:设置帧宽度。
      • cv2.CAP_PROP_FRAME_HEIGHT:设置帧高度。
      • cv2.CAP_PROP_FPS:设置帧率。

# 读取视频文件 自动选择后端,且无其他设置
cap = cv2.VideoCapture("example.mp4")

# 读取摄像头
# cap = cv2.VideoCapture(0)  # 默认摄像头(索引0)

#检查视频是否正确读取
if not cap.isOpened():
    print("Video can't be opened")
    return

1.2.2. 获取视频属性

可以通过 cap.get() 获取视频的各种属性,例如宽度、高度、帧率等。

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 帧宽
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 帧高
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
print(f"Width: {width}, Height: {height}, FPS: {fps}")

1.2.3. 逐帧读取视频

通过循环逐帧读取视频,并处理每一帧。



while cap.isOpened():
    ret, frame = cap.read()  # 读取一帧
    if not ret:
        break  # 视频结束

    #
    # 显示当前帧
    cv2.imshow("Frame", frame)

    # 按下 'q' 键退出
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()  # 释放视频流
cv2.destroyAllWindows()

1.2.4. 保存视频

使用 cv2.VideoWriter() 可以将处理后的视频保存为文件。

cv2.VideoWriter() 是 OpenCV 库中用于创建视频写入对象的函数,可以将一组图像帧保存为视频文件。

#函数参数介绍
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor])

参数介绍:

  • filename (str): 输出视频文件的路径。
  • fourcc (int): 指定编码器的四字符代码(FourCC)。
    • 例如:
    • - FFmpeg 使用:
        • cv2.VideoWriter_fourcc(*'mp4v')
        • cv2.VideoWriter_fourcc(*'XVID')
    • Windows 开发版 上编译的 OpenCV 使用
      • cv2.VideoWriter_fourcc(*'MJPG')
  • fps (float): 视频的帧率(每秒帧数)。
  • frameSize (tuple): 视频帧的尺寸(宽,高)。
  • isColor (bool, optional): 指示视频是否为彩色。默认为 True(彩色)。如果设置为 False,输出视频将为灰度。
# 设置视频编码器和帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 使用 XVID 编码器
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))  # 文件名、编码器、帧率、尺寸

# 写入帧
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    out.write(frame)  # 写入帧
    cv2.imshow("Frame", frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
out.release()  # 关闭视频写入
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968325.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从深入理解 netty——》AI

想了很久,准备写一个系列从深入理解 netty——》AI。 先说下为啥要从netty开始,看看netty的重要性 rocketmq异步消息组件nacos微服务注册中心spring cloud gateway网关redission分布式缓存es全文检索sentinel流量控制,服务保护seata分布式…

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页:chian-ocean 前言: 随着人工智能技术的迅速发展,大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司,凭借其高效的 AI 模型和开源的优势,吸引了越来越多的开发者和企业关注。为了更好地…

在anaconda环境中构建flask项目的exe文件

一、创建并激活虚拟环境 conda create -n flask_env python3.9 # python版本根据项目需求安装 conda activate flask_env # 激活环境二、安装必要依赖 推荐使用conda,pip没尝试过,但是deepseek给出了命令 conda install flask …

腾讯云服务器中Ubuntu18.04搭建python3.7.0与TensorFlow1.15.0与R-4.0.3环境

所有踩过的坑,都化成了这条平坦的路 云服务器配置 基础配置选择竞价实例(便宜/需求小) 选择地区(距离自己近的就行) 实例配置选择异构计算(能力较强,性价比高)根据GPU显存需求选择…

金融风控项目-1

文章目录 一. 案例背景介绍二. 代码实现1. 加载数据2. 数据处理3. 查询 三. 业务解读 一. 案例背景介绍 通过对业务数据分析了解信贷业务状况 数据集说明 从开源数据改造而来,基本反映真实业务数据销售,客服可以忽略账单周期,放款日期账单金…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…

基于Spring Boot的医院挂号就诊系统【免费送】

基于Spring Boot的医院挂号就诊系统 效果如下: 系统登陆页面 系统主页面 挂号页面 客服页面 挂号管理页面 公告信息管理页面 审核页面 在线咨询管理页面 研究背景 随着医疗技术的不断发展和人们健康意识的提高,医院作为提供医疗服务的核心机构&#x…

玩转适配器模式

文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…

栈的简单介绍

一.栈 栈是一种先进后出的结构:(先出来的是45,要出12就必须先把前面的数据全部出完。) 2.实例化一个栈对象: 3.入栈: 4.出栈:(当走完pop就直接弹出45了。) 5.出栈的…

【Java】-【面试】-【Java进阶】

一、分布式 1、分布式锁 2、分布式ID 3、分布式事务

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数,然后…

kafka了解-笔记

文章目录 kafka快速上手Kafka介绍Kafka快速上手理解Kafka的集群工作机制Kafka集群的消息流转模型 Kafka客户端小型流转流程客户端工作机制 kafka快速上手 Kafka介绍 MQ的作用 MQ:MessageQueue,消息队列,是一种FIFO先进先出的数据结构&#…

支持向量机原理

支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示: 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

Word成功接入DeepSeek详细步骤

原理 原理是利用Word的VBA宏,写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key,有一些免费的额度可以使用。大概就是这个公司提供token,我们使用这个公司的模型调用deepsee…

【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed

1. 问题描述 VScode使用remote ssh 远程服务器,报错类似: [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…

系统思考—双环学习

前几天,一个企业高管向我提到:“我们调整了N次方案,市场策略、团队激励、管理制度,能改的全改了,怎么还是不见起色?” 这让我想到典型的单环学习,简单来说就是:发现问题 → 采取行动…

2.11寒假

今天复习了深搜和广搜然后做了作业中的一个题目。 解析&#xff1a;外层 for 循环&#xff1a;for (int i 1; i < n; i)&#xff0c;循环变量 i 从 1 递增到 n&#xff0c;表示要依次将数字 1 到 n 分配到数组 a 中。内层 for 循环&#xff1a;for (int j 1; j < 2; j)…

使用 AlexNet 实现图片分类 | PyTorch 深度学习实战

前一篇文章&#xff0c;CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 使用 AlexNet 实现图片分类…