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

发布于:2024-10-09 ⋅ 阅读:(174) ⋅ 点赞:(0)
  • 操作系统: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 

网站公告

今日签到

点亮在社区的每一天
去签到