视频基础操作

news2025/2/13 23:34:27

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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在本地校验密码或弱口令 (windows)

# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD&#xff0…

【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)

接着上一篇文章;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询(2)Filter【结果过滤】(3)term(4)Aggregation(执行聚合) (1) bool用来做复合查询 复合语…

游戏引擎学习第96天

讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…

(Xshell 8 + Xftp 8)下载安装miniconda至服务器指定目录+配置虚拟环境

一一一一 Xshell 8 Xftp 8均已登录,miniconda.sh安装包已经放在服务器指定目录中 二二二二 赋予脚本执行权限 chmod x Miniconda3-latest-Linux-x86_64.sh安装miniconda ./Miniconda3-latest-Linux-x86_64.sh -p /data1/huyan/zhangyifeng/miniconda3一直Enter…

多机器人系统的大语言模型:综述

25年2月来自 Drexel 大学的论文“Large Language Models for Multi-Robot Systems: A Survey”。 大语言模型 (LLM) 的快速发展为多机器人系统 (MRS) 开辟新的可能性,从而增强通信、任务规划和人机交互。与传统的单机器人和多智体系统不同,MRS 带来独特…

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架,可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序,比如 控制台工具和服务器。Qt是面向对象的框架,使用特殊的代…

MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32

MT6835 21位 磁编码器 SPI 平台无关通用驱动框架 STM32 1. 获取代码:2. 加入你的项目2.1 以 STM32 为例:2.2 以 ESP-IDF 为例: 3. 对接 API3.1 以 STM32 为例: 4. 更多函数说明5. 写入 EEPROM 示例 MT6835 Framework 纯C语言实现,跨平台&…

嵌入式WebRTC压缩至670K,目标将so动态库压缩至500K,.a静态库还可以更小

最近把EasyRTC的效果发布出去给各大IPC厂商体验了一下,直接就用EasyRTC与各个厂商的负责人进行的通话,在通话中,用户就反馈效果确实不错! 这两天有用户要在海思hi3516cv610上使用EasyRTC,工具链是:gcc-2024…

Rhel Centos环境开关机自动脚本

Rhel Centos环境开关机自动脚本 1. 业务需求2. 解决方法2.1 rc.local2.2 rc.d2.3 systemd2.4 systemd附着的方法2.5 tuned 3. 测试 1. 业务需求 一台较老的服务器上面业务比较简单,提供一个简单的网站,但已经没有业务的运维人员. 想达到的效果: 由于是非标准的apache或者nginx…

phpipam1.7安装部署

0软件说明 phpipam是一个开源Web IP地址管理应用程序(IPAM) phpipam官网:https://www.phpipam.net/ 1安装环境 操作系统:Rocky Linux9.5x86_64 phpipam版本:1.7 php版本:8.0.30 数据库版本&#xff1a…

正泰中间电磁继电器【8脚10A】DC24V 待机功率

需求:继电器能耗测试。 1.连接24V2A的电源, 2. 稳定功率为 1.4W 3. 正泰中间电磁继电器【8脚10A】直流DC24V 注:联通时电磁继电器会轻微发热 4.电磁继电器的工作原理基于电流的磁效应 电磁激励:电磁继电器主要由线圈、铁芯、衔…

Mac上搭建宝塔环境并部署PHP项目

安装Docker Desktop》搭建Centos版本的宝塔环境》部署PHP项目 1. 下载Docker for mac 软件:https://www.docker.com/ 或使用终端命令:brew install --cask --appdir/Applications docker 2. 使用命令安装宝塔环境的centos7系统: docker pul…

win11 终端乱码导致IDE 各种输出也乱码

因为 win11 终端乱码导致IDE 各种输出也乱码导致作者对此十分头大。所以研究了各种方法。 单独设置终端编码对 HKEY_CURRENT_USER\Console 注册表进行修改对 HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processo 注册表进行修改使用命令[Console]::OutputEncoding [Syst…

LabVIEW用户界面(UI)和用户体验(UX)设计

作为一名 LabVIEW 开发者,满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代,为 LabVIEW 应用程序设计直观且具有美学感的界面,同样是不容忽视的关键任务。一个优秀的界面设计,不仅能提升用户对程序的…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候,其实我们重点还是学习的是他们的正向怎么传播,以及反向怎么传递的。 如下图所示: 第一:relu函数的正向传播函数是:当输入值(隐藏层)值大于了,就输出…

【matlab优化算法-16期】基于遗传算法的电热气及储能综合优化项目实践

电热气及储能综合优化项目实践 一、前言 随着能源转型和可持续发展的推进,综合能源系统的优化逐渐成为研究热点。本文介绍了一个电热气及储能综合优化项目,旨在通过优化算法实现多能源系统的协同运行,提高能源利用效率,降低运行…

springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

DeepSeek系统崩溃 | 极验服务如何为爆火应用筑起安全防线?

引言 极验服务让您的产品站在风口之时,不必担心爆红是灾难的开始,而是期待其成为驱动持续创新的全新起点。 01现象级狂欢背后,你的业务安全防线抗得住吗? “近期DeepSeek线上服务受到大规模恶意攻击,注册可能繁忙&am…

java后端开发day15--字符串(一)

(以下内容全部来自上述课程) 1.API (Application Programming Interface 应用程序编程接口) 1.简单理解 简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可。 Java API&…

vue项目 Axios创建拦截器

Axios 1. Axios 和 Ajax 简介2. Axios 和 Ajax 的区别3. 从 按钮 到 Axios请求后端接口的 大致顺序 1. Axios 和 Ajax 简介 Ajax(Asynchronous JavaScript and XML) 不是一种技术,而是一个编程技术概念,核心是通过 XMLHttpReques…