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

server/2024/10/21 3:31:37/
  • 操作系统: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 

http://www.ppmy.cn/server/126394.html

相关文章

【C++】——vector深度剖析模拟实现

低头赶路&#xff0c;敬事如仪 目录 1、模拟vector 1.1底层结构 1.2构造析构 1.3尾插扩容 1.4迭代器 1.5增删查改 1.6模拟中的注意事项 2、vector模拟补充 2.1迭代器区间构造问题 2.2memcpy深浅拷贝问题 2.3动态二维数组的模拟及遍历 1、模拟vector 想要模拟实现自…

【rCore OS 开源操作系统】Rust 字符串(可变字符串String与字符串切片str)

【rCore OS 开源操作系统】Rust 语法详解: Strings 前言 这次涉及到的题目相对来说比较有深度&#xff0c;涉及到 Rust 新手们容易困惑的点。 这一次在直接开始做题之前&#xff0c;先来学习下字符串相关的知识。 Rust 的字符串 Rust中“字符串”这个概念涉及多种类型&…

gRPC基础讲解

一、gRPC原理 1、什么是RPC RPC 即远程过程调用协议&#xff08;Remote Procedure Call Protocol&#xff09;&#xff0c;可以让我们像调用本地函数一样发起远程调用。RPC 凭借其强大的治理功能&#xff0c;成为解决分布式系统通信问题的一大利器。 gRPC是一个现代的、高性能…

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化 阿里 MySQL 命名规范MySQL8 DDL的原子化 阿里 MySQL 命名规范 【强制】表名、字段名必须使用小写字母或数字&#xff0c;禁止出现数字开头&#xff0c;禁止两个下划线中间只出现数字。数据库字段名的修改代价…

初识C语言(五)

前言 本文章就代表C语言介绍以及了解正式完成&#xff0c;后续进行具体分析和详细解析学习。知识根深蒂固才可以应付后来的学习&#xff0c;地基要打好&#xff0c;后续才会轻松。 十四、结构体 结构体是C语言中最最重要的知识点&#xff0c;使得C语言有能力描述复杂的类型。 …

OpenCV库 详细常见操作

在PyCharm中使用OpenCV时&#xff0c;可以访问OpenCV库提供的丰富函数来进行图像处理和计算机视觉任务。以下是一些常用的OpenCV库函数及其简要说明&#xff1a; 一、图像读取与显示 cv2.imread()&#xff1a;读取图像文件。cv2.imshow()&#xff1a;在一个窗口中显示图像。c…

vuepress 浏览器加载缓存,总是显示旧页面,无法自动刷新数据的解决方法

vuepress 采用多页面形式&#xff0c;每个md文件在打包时&#xff0c;都会被转为一个html页面&#xff1b;而浏览器默认会缓存页面&#xff0c;导致更新的页面必须手动刷新才行 对于更新较为频繁的文档 全局可在config.js里设置 参考文档: https://vuepress.github.io/zh/ref…

闯关训练一:Linux基础

闯关任务&#xff1a;完成SSH连接与端口映射并运行hello_world.py 1.创建开发机 2.SSH连接 3. VS-Code 连接 选择 Linux 平台 &#xff0c;输入密码 &#xff0c;选择进入文件夹 4.端口映射 按照下文安装Docs pip install gradio 运行server.py import gradio as grdef …