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

news2025/1/14 9:55:11

从摄像头采集视频

相关接口 - 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.coloradmin.cn/o/2276418.html

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

相关文章

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放,导致系统内存逐渐耗尽,最终可能造成程序崩溃或性能下降。在C中,内存泄漏通常发生在使用new或malloc等分配内存的操作时,但没有正确地使用delete或free来释放这块内存。 在日常开发过程…

Golang 简要概述

文章目录 1. Golang 的学习方向2. Golang 的应用领域2.1 区块链的应用开发2.2 后台的服务应用2.3 云计算/云服务后台应用 1. Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 2. Golang 的应用领域 2.1 区块链的应用开发 2.2 后台的服务应用 2.3 云计算/云服…

51c自动驾驶~合集46

我自己的原文哦~ https://blog.51cto.com/whaosoft/13050104 #世界模型会是L3自动驾驶的唯一解吗 三维空间占有率(3D Occupancy)预测的目的是预测三维空间中的每个体素是否被占有,如果被占有,则对应的体素将被标记。3D Semant…

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言: 在我们之前的文章中,我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天,我们将继续这个系列,重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统(OpenAnolis&#…

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…

Docker Search失败,但是Pull成功的解决方法(环境:腾讯云服务器CentOS7系统安装Docker)

Docker Search失败,但是Pull成功的解决方法(环境:腾讯云服务器CentOS7系统安装Docker) 背景解决思路 背景 在安装完成Docker后,成功启动Docker(Systemctl start Docker),使用搜索镜像命令(Dock…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了,Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件,发明各种的解决方案技术栈,一方面确实帮助很多用户解决了问题,但另一方面因为繁杂的技术栈与高昂的维护成本&…

慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)

3.UI模板 当我们选择一条已经建好的业务对象点击功能按钮【UI模板】进入该业务对象的UI显示配置界面。 右边填写的是UI模板的编码以及对应名称;菜单界面配置以业务对象UI模板编码获取显示界面。 3.1【列表-按钮】 展示的对应业务对象界面的功能按钮配置&#xff1…

TCL小蓝翼新风空调亮相CES2025,斩获智慧新风技术创新大奖

1月7日-11日,被称为“科技界春晚”的CES 2025(国际消费类电子产品展览会)在美国拉斯维加斯举行。 本届CES,TCL小蓝翼新风空调更是惊艳亮相TCL展区,以领先的健康新风及AI技术,斩获CES2025 智慧新风技术创新…

【I/O编程】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用(运行中的程序)的角度。外部特指文件。 这里的文件是泛指,并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

【计算机网络】深入浅出计算机网络

第一章 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成一种重要的信息服务基础设施 CNNIC 中国互联网网络信息中心 因特网概述 网络、互联网和因特网 网络(Network)由若干结点(Node)和连接这些结点的链路…

在IDEA上运行Java项目

新建一个项目,下面创建模块,然后在src下新建包名,最后见类(class) 设置主题 settings>apparence 设置字体 Editor> Font 设置注释 Editor>Color Scheme>Language Defaults>Comments 设置自动导包 …

ASO优化之应用程序本地化的类型和策略

应用程序本地化是进入全球移动电话用户市场的关键一步。但它到底是什么?应用程序本地化是指定制您的应用程序以适应多种语言、文化、语言和区域设置。这不仅仅是翻译,它考虑了地区法规、文化细微差别和当地偏好。本地化良好的应用程序可以引起用户的共鸣…

gcc编译过程中-L和-rpath的作用

前言 今天记录一下,在gcc编译过程中-L和-rpath的区别 -L是程序链接过程中指定链接动态库的路径,-rpath是程序运行过程中指定链接动态库的路径。(官方话术) 其实就是当gcc编译生成可执行文件的时候需要指定-L参数,才能找…

3D目标检测数据集——kitti数据集

KITTI官网网址:The KITTI Vision Benchmark Suite 下载数据集:The KITTI Vision Benchmark Suite KITTI数据集论文:CMSY9 github可视化代码:GitHub - kuixu/kitti_object_vis: KITTI Object Visualization (Birdview, Volumetric …

AI大模型赋能!移远通信打造具有“超能力”的AI智能玩具解决方案

随着无线通信、先进算法以及AI大模型等前沿技术的蓬勃发展,许多玩具已经从简单的互动设备进化为集教育、陪伴和娱乐功能于一身的AI智能玩具,在儿童群体中日渐风靡。不仅如此,因其能提供满满的情绪价值,在成年人和老年人市场中也展…

LED灯按键调光芯片、PWM调光IC、发光灯控制调光芯片

按键调光芯片,特别是LED灯使用PWM调光的芯片IC,是一种用于控制LED灯具亮度的集成电路,常用于台灯、壁灯、吊灯等照明设备中。这种芯片通过脉冲宽度调制(PWM)技术来调节LED的亮度,可以实现从最亮到最暗的平滑…

【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下,节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…

what?ngify 比 axios 更好用,更强大?

文章目录 前言一、什么是ngify?二、npm安装三、发起请求3.1 获取 JSON 数据3.2 获取其他类型的数据3.3 改变服务器状态3.4 设置 URL 参数3.5 设置请求标头3.6 与服务器响应事件交互3.7 接收原始进度事件3.8 处理请求失败3.9 Http Observables 四、更换 HTTP 请求实现…