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

news/2024/10/7 20:35:22/
  • 操作系统: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/news/1535850.html

相关文章

OpenGL笔记十九之相机系统

OpenGL笔记十九之相机系统 —— 2024-10-02 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十九之相机系统1.运行1.1.游戏相机1.2.轨迹球相机 2.游戏相机与轨迹球相机切换3.博主笔记本要运行需要更改的文件更改1:28_OpenGL_CameraSystem/applicat…

设计模式-生成器模式/建造者模式Builder

构建起模式&#xff1a;将一个复杂类的表示与其构造分离&#xff0c;使得相同的构建过程能够得出不同的表示。&#xff08;建造者其实和工厂模式差不多&#xff09; 详细的UML类图 图文说明&#xff1a;距离相同的构建过程 得出不同的展示。此时就用两个类&#xff08;文本生成…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…

软件验证与确认实验三-数据驱动测试

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …

Pikachu-unsafe upfileupload-getimagesize

什么是getimagesize()&#xff1f; getimagesize()是PHP中用于获取图像的大小和格式的函数。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。 由于返回的这个类型可以被伪造&#xff0c;如果用这个函数来获取图片类型&#xff0c;从而判断是否时图片的话&#xff…

分享国产RISC-V单片机通用

开源已经成为构建新技术生态的主流趋势。基于开源指令集 RISC-V 的软硬件生态正在飞速扩增&#xff0c;并且已经迅速扩展至个人 PC、服务器和人工智能等领域。RISC-V 的灵活性和可扩展性使其能够在应用处理器和AI加速领域迅速发展。 RAMSUN提供的RISC-V单片机&#xff0c;开源…

仿RabbitMQ实现消息队列三种主题的调试及源码

文章目录 开源仓库和项目上线广播交换模式下的测试直接交换模式下的测试主题交换模式下的测试 开源仓库和项目上线 本项目已开源到下面链接下的仓库当中 仿RabbitMQ实现消息队列 广播交换模式下的测试 消费者客户端 在进行不同测试下&#xff0c;消费者客户端只需要改变交换机…

数据揭秘:分类与预测技术在商业洞察中的应用与实践

分类与预测&#xff1a;数据挖掘中的关键任务 在数据挖掘的广阔天地中&#xff0c;分类与预测就像是一对互补的探险家&#xff0c;它们携手深入数据的丛 林&#xff0c;揭示隐藏的宝藏。 一、分类&#xff1a;数据的归类大师 分类是一种将数据点按照特定的属性或特征划分到不…