OpenCV基础:视频的采集、读取与录制

从摄像头采集视频

相关接口 - VideoCapture

VideoCapture 用于从视频文件、摄像头或其他视频流设备中读取视频帧。它可以捕捉来自多种源的视频。

主要参数:
cv2.VideoCapture(source):

source: 这是一个整数或字符串,表示视频的来源。

  • 如果是整数(如0、1等),表示打开对应的摄像头(0通常是默认摄像头)。
  • 如果是字符串,表示视频文件的路径,或者RTSP流、HTTP流等视频流地址。

常用方法:
cap.read():

  • 返回两个值:ret(布尔值,表示是否成功读取)和 frame(当前帧图像)。

cap.set(prop_id, value):

  • 设置视频捕获设备的属性。prop_id是属性标识符,value是设置的值。

常见的 prop_id 参数:

  • cv2.CAP_PROP_FPS:帧率(每秒帧数)。
  • cv2.CAP_PROP_FRAME_WIDTH:视频宽度。
  • cv2.CAP_PROP_FRAME_HEIGHT:视频高度。
  • cv2.CAP_PROP_BRIGHTNESS:亮度。
  • cv2.CAP_PROP_CONTRAST:对比度。

代码:

以下代码的作用是打开摄像头,将采集到的视频流显示到窗口中。

import cv2#创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#获取视频设备
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#将视频帧在窗口中显示cv2.imshow('video', frame)#等待键盘事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#释放 videocapture
cap.release()
cv2.destroyAllWindows()

 读取视频文件

只需要修改 VideoCapture 接口参数即可:

import cv2#创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#读取视频文件
cap = cv2.VideoCapture('D:\\resource\\D026网络购物互联网科技.mov')while True:ret, frame = cap.read()#将视频帧在窗口中显示cv2.imshow('video', frame)#等待键盘事件key = cv2.waitKey(40)if (key & 0xFF == ord('q')):break#释放 videocapture
cap.release()
cv2.destroyAllWindows()

其中 waitKey 设置为40ms,由于当前播放的视频帧率是25fps,然后1000/25 = 40,于是将waitkey等待间隔设置为了40ms。 

运行后:

视频录制

相关接口 - videoWrite

VideoWriter 用于将视频帧写入视频文件。可以设置视频格式、编解码器、帧速率等。

主要参数:
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
filename: 输出视频文件的路径或文件名。这个文件将存储捕捉到的视频。
fourcc: 编解码器代码(FourCC)。这指定了视频的编码格式。常见的 fourcc 编码器包括:

  • cv2.VideoWriter_fourcc(*'XVID'):XVID编码。
  • cv2.VideoWriter_fourcc(*'MJPG'):MJPEG编码。
  • cv2.VideoWriter_fourcc(*'MP4V'):MP4编码。
  • cv2.VideoWriter_fourcc(*'H264'):H.264编码。

fps: 帧率(每秒帧数)。例如,30 表示每秒30帧。
frameSize: 视频帧的尺寸,通常是一个元组 (width, height),如 (640, 480)。
isColor: 布尔值,指示是否保存为彩色视频。True 表示彩色视频(默认),False 表示灰度视频。


常用方法:
writer.write(frame): 将视频帧写入输出文件。
writer.release(): 释放视频写入对象,确保文件正确关闭。

代码:

以下代码的作用是从摄像头采集视频,显示到窗口中,同时保存到本地。

import cv2#创建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#获取视频设备
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#将视频帧在窗口中显示cv2.imshow('video', frame)#写数据到多媒体文件vw.write(frame)#等待键盘事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#释放 videocapture
cap.release()#释放VideoWriter
vw.release()cv2.destroyAllWindows()

查看输出视频属性:

代码优化:

  • 增加摄像头开启判断
  • 增加采集视频失败处理
import cv2#创建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#获取视频设备
cap = cv2.VideoCapture(0)while cap.isOpened:ret, frame = cap.read()if ret == False :break;#将视频帧在窗口中显示cv2.imshow('video', frame)cv2.resizeWindow('video', 640, 480)#写数据到多媒体文件vw.write(frame)#等待键盘事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#释放 videocapture
cap.release()#释放VideoWriter
vw.release()cv2.destroyAllWindows()

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

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

相关文章

解读Linux Bridge中的东西流向与南北流向

解读Linux Bridge中的东西流向与南北流向 在现代云计算和虚拟化环境中,网络流量的管理和优化变得越来越重要。Linux Bridge作为Linux内核提供的一个强大的二层交换机工具,在虚拟化和容器化应用中扮演着至关重要的角色。本文将深入探讨Linux Bridge中的两…

在线实用工具 json格式化,base64转码,正则表达式测试工具

1、在线json格式化工具: https://json.openai2025.com/ 2、在线base64转码工具 https://base64.openai2025.com/ 3、在线正则表达式测试工具 https://reg.openai2025.com/ 4、在线去水印工具 https://watermark.openai2025.com

java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志

pom 依赖&#xff1a; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手&#xff1f; 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC&#xff0c;想必现目前多数通信工程师们都已经搞的差不多了&#xff08;不要再问FvM了&#xff09;&#xff1b;…

RuoYi Cloud项目解读【四、项目配置与启动】

四、项目配置与启动 当上面环境全部准备好之后&#xff0c;接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 1 后端配置 1.1 数据库 创建数据库ry-cloud并导入数据脚本ry_2024xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…

C#对象池

一、资源管理的困境与破局 在软件开发的征程中&#xff0c;我们时常陷入资源管理的泥沼。以一个繁忙餐厅为例&#xff0c;每个顾客都急需一个盘子盛美食&#xff0c;可盘子数量有限&#xff0c;如果每次顾客用完盘子后&#xff0c;都不假思索地去清洗一个全新的盘子来供下一位…

Vue.js组件开发-如何使用moment.js

在Vue.js组件开发中&#xff0c;需要处理日期和时间&#xff0c;moment.js 是一个非常有用的库。moment.js 提供了丰富的API来解析、验证、操作和显示日期和时间。 步骤&#xff1a; 1. 安装moment.js 首先&#xff0c;需要通过npm或yarn安装moment.js。在项目根目录下运行以…

微信小程序mp3音频播放组件,仅需传入url即可

// index.js // packageChat/components/audio-player/index.js Component({/*** 组件的属性列表*/properties: {/*** MP3 文件的 URL*/src: {type: String,value: ,observer(newVal, oldVal) {if (newVal ! oldVal && newVal) {// 如果 InnerAudioContext 已存在&…

要避免除数绝对值远远小于被除数绝对值的除法

要避免除数绝对值远远小于被除数绝对值的除法 用绝对值小的数作除数&#xff0c;舍人误差会增大&#xff0c;如计算 x y \frac xy yx​,若 0 < ∣ y ∣ < ∣ x ∣ 0<|y|<|x| 0<∣y∣<∣x∣&#xff0c;则可能对计算结果带来严重影响&#xff0c;应尽量避免…

深入了解OpenStack中的隧道网络

在OpenStack环境中&#xff0c;隧道网络是一项关键技术&#xff0c;它确保了虚拟机之间以及虚拟机与外部网络之间的安全通信。通过隧道机制&#xff0c;我们可以有效地隔离不同租户的流量&#xff0c;并支持多租户环境下的复杂网络需求。之前我们介绍了隧道网络&#xff0c;下面…

4. scala高阶之隐式转换与泛型

背景 上一节&#xff0c;我介绍了scala中的面向对象相关概念&#xff0c;还有一个特色功能&#xff1a;模式匹配。本文&#xff0c;我会介绍另外一个特别强大的功能隐式转换&#xff0c;并在最后介绍scala中泛型的使用 1. 隐式转换 Scala提供的隐式转换和隐式参数功能&#…

pandas与sql对应关系【帮助sql使用者快速上手pandas】

本页旨在提供一些如何使用pandas执行各种SQL操作的示例&#xff0c;来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid&#xff0c;数组由 正整数 组成。 你的任务是以 之字形 遍历 grid&#xff0c;同时跳过每个 交替 的单元格。 之字形遍历的定义如下&#xff1a; 从左上角的单元格 (0, 0) 开始。在当前行中向…

《探索鸿蒙Next上开发人工智能游戏应用的技术难点》

在科技飞速发展的当下&#xff0c;鸿蒙Next系统为应用开发带来了新的机遇与挑战&#xff0c;开发一款运行在鸿蒙Next上的人工智能游戏应用更是备受关注。以下是在开发过程中可能会遇到的一些技术难点&#xff1a; 鸿蒙Next系统适配性 多设备协同&#xff1a;鸿蒙Next的一大特色…

Harry技术添加存储(minio、aliyun oss)、短信sms(aliyun、模拟)、邮件发送等功能

Harry技术添加存储&#xff08;minio、aliyun oss&#xff09;、短信sms&#xff08;aliyun、模拟&#xff09;、邮件发送等功能 基于SpringBoot3Vue3前后端分离的Java快速开发框架 项目简介&#xff1a;基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…

Vue2: el-table为每一行添加超链接,并实现光标移至文字上时改变形状

为表格中的某一列添加超链接 一个表格通常有许多列,网上许多教程都可以实现为某一列添加超链接,如下,实现了当光标悬浮在“姓名”上时,改变为手形,点击可实现跳转。 <el-table :data="tableData"><el-table-column label="姓名" prop=&quo…

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…

A3. Springboot3.x集成LLama3.2实战

本文将介绍集成ollama官网提供的API在Springboot工程中进行整合。由于没找到java-llama相关合适的sdk可以使用,因此只好对接官方给出的API开发一套RESTFull API服务。下面将从Ollama以下几个API展开介绍,逐渐的了解其特性以及可以干些什么。具体llama API说明可参数我前面写的…

面试:类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?

1、概述 类模版中函数声明在.h&#xff0c;定义在.cpp中&#xff0c;其他cpp引用引入这个头文件&#xff0c;会有什么错误?报编译错误&#xff1a;error C2512: Demo<int>: no appropriate default constructor available 举例如下代码&#xff1a;demo.h 声明模版类 …

记一次学习skynet中的C/Lua接口编程解析protobuf过程

1.引言 最近在学习skynet过程中发现在网络收发数据的过程中数据都是裸奔&#xff0c;就想加入一种数据序列化方式&#xff0c;json、xml简单好用&#xff0c;但我就是不想用&#xff0c;于是就想到了protobuf&#xff0c;对于protobuf C/C的使用个人感觉有点重&#xff0c;正好…