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

server/2025/1/15 10:49:34/

从摄像头采集视频

相关接口 - 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.ppmy.cn/server/158104.html

相关文章

JS进阶--JS听到了探囊的回响

深浅拷贝 深拷贝 开发中我们经常需要复制一个对象,如果直接用赋值会有下面的问题 深浅拷贝只针对引用类型,深拷贝拷贝的是对象,不是地址 常见方法: 1. 通过递归实现深拷贝 2. lodash/cloneDeep 3. 通过JSON.stringify()实现…

C语言的循环实现

C语言的循环实现 在计算机编程中,循环是一种基本的控制结构,它使得程序能够反复执行某一段代码,直至满足特定条件。在C语言中,循环主要有三种形式:for循环、while循环和do...while循环。每种循环都有其独特的特点和使…

2025年01月11日Github流行趋势

项目名称:xiaozhi-esp32 项目地址url:https://github.com/78/xiaozhi-esp32项目语言:C历史star数:2433今日star数:321项目维护者:78, MakerM0, whble, nooodles2023, Kevincoooool项目简介:构建…

【Linux】编辑器之神vim使用教程

什么是Vim? Vim是从vi发展而来的文本编辑器,代码补全、编译以及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用,下图为Vim的键盘图 Vim的使用 基本上vi/vim共分为三种模式:命令模式(Command Mode&…

一学就废|Python基础碎片,文件读写

文件处理是指通过编程接口对文件执行诸如创建、打开、读取、写入和关闭等操作的过程。它涉及管理程序与存储设备上的文件系统之间的数据流,确保数据得到安全高效的处理。 Python 中的文件模式 打开文件时,我们必须指定我们想要的模式,该模式…

Kotlin 协程基础十 —— 协作、互斥锁与共享变量

1、协程间的协作与等待 本节将介绍在协程间如果有先后执行、互相等待的需求时,应该怎样去处理这种等待和协作的工作。更会与 Java 的线程的协作工作对比,从而说明,在线程中通常不太简单的协作操作,在协程中很容易实现。 从运行角…

CPU缓存架构详解与Disruptor高性能内存队列实战

引言 现代计算机系统的性能很大程度上取决于CPU与内存之间的交互效率。随着处理器技术的发展,CPU的速度远超主内存,为了弥补这种速度差异,引入了多级高速缓存(Cache)。然而,在多核环境下,缓存一…

C#中的Null注意事项

一、开启 C# 的 null 探险之旅 在 C# 编程的奇妙世界里,null 就像是一个神秘莫测的幽灵,时不时冒出来给我们制造一些意想不到的 “惊喜”。它看似简单,仅仅表示 “没有值”,却常常在不经意间引发各种让人头疼的错误,让…