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