当前位置: 首页 > article >正文

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 

http://www.kler.cn/news/330729.html

相关文章:

  • HKMG工艺为什么要用金属栅极?
  • 【Android】浅析六大设计原则
  • C++中的类型推导:auto 和 decltype 介绍
  • 如何理解矩阵的复数特征值和特征向量?
  • 【60天备战2024年11月软考高级系统架构设计师——第35天:系统安全设计——安全设计模式】
  • quiz: python网络爬虫之规则1
  • 【H2O2|全栈】关于CSS(8)CSS3扩充了哪些新鲜的东西?
  • ISP下载,IAP,ICP,USB转TTL下载SWIM、DAP-link、CMSIS-DAP、ST-LINK,SPI(通信方式),
  • 计算机视觉学习--目标检测Java开发案例
  • 【ios】---swift开发从入门到放弃
  • 【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点
  • 【MySQL 07】内置函数
  • Pikachu-Sql Inject-搜索型注入
  • Python对数据库(MySQL,redis、MongoDB)的操作
  • 24.2.29蓝桥杯|单位换算--8道题
  • 【4.7】图搜索算法-DFS和BFS解根到叶子节点数字之和
  • Linux中的软硬链接和动静态库
  • 大模型压缩3种方式;模型大小的计算;知识蒸馏:利用教师的输入输出,训练调整学生的小模型
  • Linux 中的 Makefile 伪目标详解
  • 【Spring Boot 入门三】Spring Boot与数据库集成 - 构建数据驱动的应用