OpenCV视频I/O(13)视频采集类VideoCapture之等待多个视频流中的任意一个变为可用状态函数waitAny()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

等待来自 VideoCapture 的可用帧。
cv::VideoCapture::waitAny 是一个静态成员函数,用于等待多个视频流中的任意一个变为可用状态。这个函数可以用于同步多个视频流,直到其中一个流准备好为止。

异常
在流错误时抛出异常(检查 .isOpened() 以过滤掉格式错误的流)或不支持 VideoCapture 类型
该函数的主要用途是在多摄像头环境中。该方法填充准备状态向量,并在摄像头准备好时抓取视频帧。

在此次调用之后,使用 VideoCapture::retrieve() 来解码并获取帧数据。

函数原型


static bool cv::VideoCapture::waitAny
(
	const std::vector< VideoCapture > & 	streams,
	std::vector< int > & 	readyIndex,
	int64 	timeoutNs = 0 
)

参数

  • 参数streams (const std::vectorcv::VideoCapture&):
    • 描述:一个包含多个 VideoCapture 对象的向量,这些对象代表不同的视频流。
    • 作用:用于指定等待的视频流集合。
  • 参数readyIndex (std::vector&):
    • 描述:一个整型向量的引用,用于返回准备好的视频流的索引。
    • 作用:函数结束后,此向量将包含一个或多个索引,指示哪些视频流已经准备好。
  • 参数timeoutNs (int64):
    • 描述:超时时间(纳秒),指定等待的时间上限。
    • 默认值:0 表示无限期等待。
    • 作用:如果在指定时间内没有视频流准备好,则函数返回 false。

返回值

bool:
描述:如果至少有一个视频流准备好,则返回 true;否则,如果超时或没有视频流准备好,则返回 false。

代码示例


#include <chrono>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
    // 创建多个 VideoCapture 对象
    std::vector< cv::VideoCapture > streams;
    streams.push_back( cv::VideoCapture( 0 ) );  // 第一个摄像头设备
    streams.push_back( cv::VideoCapture( 2 ) );  // 第二个摄像头设备
    // 可以添加更多摄像头设备

    // 用于存储准备好的视频流索引
    std::vector< int > readyIndex;

    // 设置异常处理模式为抛出异常
    for ( auto& stream : streams )
    {
        stream.setExceptionMode( true );
    }

    // 设置超时时间为 5 秒
    int64 timeoutNs = 5 * 1000 * 1000 * 1000;  // 5 秒

    // 等待任意一个视频流准备好
    bool result = cv::VideoCapture::waitAny( streams, readyIndex, timeoutNs );

    if ( result )
    {
        std::cout << "Ready streams indices: ";
        for ( int index : readyIndex )
        {
            std::cout << index << " ";
        }
        std::cout << std::endl;
    }
    else
    {
        std::cout << "No stream became ready within the timeout." << std::endl;
    }

    // 关闭所有 VideoCapture 对象
    for ( auto& stream : streams )
    {
        if ( stream.isOpened() )
        {
            stream.release();
        }
    }

    return 0;
}

运行结果

Ready streams indices: 0 
OpenCV,你可以使用`cv2.VideoCapture()`函数来读取摄像头捕捉的实时视频流,并通过`cv2.VideoWriter()`函数将其保存到文件。下面是一个简单的示例函数,展示了如何实现这个功能: ```python import cv2 def capture_and_save_video(camera_index=0, output_filename='output.mp4', fps=30): # 创建VideoCapture对象,传入相机设备索引 cap = cv2.VideoCapture(camera_index) # 检查是否成功打开摄像头 if not cap.isOpened(): print(f"无法打开摄像头 {camera_index}") return # 设置帧率 cap.set(cv2.CAP_PROP_FPS, fps) # 创建VideoWriter对象,传入输出文件名、编码器(默认为MPEG4)、帧大小(从摄像头获取),以及帧率 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 或者 'XVID' out = cv2.VideoWriter(output_filename, fourcc, fps, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))) try: while True: # 读取一帧 ret, frame = cap.read() # 如果读取成功,处理并写入帧 if ret: processed_frame = process_frame(frame) # 这里替换为你的视频处理代码 out.write(processed_frame) else: break # 当达到文件结尾或者读取失败时退出循环 # 输出完成信息 print(f"视频已成功保存至 {output_filename}") finally: # 关闭文件和摄像头资源 cap.release() out.release() # 自定义处理每一帧的函数(这里仅做简单展示) def process_frame(frame): gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) return gray # 调用函数 capture_and_save_video() ``` 在这个例子,`process_frame(frame)`是你自定义的函数,可以对每一帧进行滤波、裁剪、增强等各种操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值