- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
解码并返回已抓取的视频帧。
cv::VideoCapture::retrieve() 是 VideoCapture 类的一个成员函数,用于从视频流中检索一帧图像。
retrieve() 函数的主要作用是从视频源中检索一帧图像,并将其存储到指定的目标矩阵中。通常情况下,retrieve() 与 grab() 配合使用,先使用 grab() 函数抓取视频帧,再使用 retrieve() 函数来实际获取该帧。这样可以在多线程环境中提高效率,因为 grab() 可以在后台提前准备下一帧,而主线程可以继续处理当前帧。
使用场景
- 当需要从视频流中检索一帧图像时,可以调用 retrieve() 函数。
- 通常与 grab() 函数配合使用,先调用 grab() 函数抓取视频帧,然后再调用 retrieve() 函数来实际获取该帧。
- 当不需要提前准备下一帧图像时,可以直接使用 read() 函数,它内部会调用 grab() 和 retrieve()。
注意
在 C API 中,函数 cvRetrieveFrame() 和 cv.RetrieveFrame() 返回存储在视频捕获结构内的图像。不允许修改或释放该图像!你可以使用 cvCloneImage 复制帧,然后对复制的图像做任何你想做的事情。
函数原型
cpp
virtual bool cv::VideoCapture::retrieve
(
OutputArray image,
int flag = 0
)
参数
- 参数[out] image 视频帧在此处返回。如果没有抓取到帧,则图像将是空的。
- 参数flag 它可以是帧索引或特定于驱动程序的标志。
返回值
类型:bool
描述:返回值指示是否成功从视频源中检索了一帧图像。如果返回 true,则表示成功检索;如果返回 false,则表示检索失败,这可能是因为已经到达视频末尾或者出现了其他错误。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个 VideoCapture 对象
cv::VideoCapture cap;
// 定义摄像头设备索引
int cameraIndex = 0; // 第一个摄像头设备
// 尝试打开摄像头设备
if ( !cap.open( cameraIndex, cv::CAP_ANY ) )
{
std::cout << "Failed to open camera at index: " << cameraIndex << std::endl;
return -1;
}
// 检查是否成功打开了摄像头设备
if ( !cap.isOpened() )
{
std::cout << "Error opening camera at index: " << cameraIndex << std::endl;
return -1;
}
// 循环读取并显示视频帧
while ( true )
{
// 创建一个 Mat 对象来存储视频帧
cv::Mat frame;
// 先抓取一帧
if ( !cap.grab() )
{
std::cout << "Failed to grab frame." << std::endl;
break;
}
// 再从视频流中检索出该帧
if ( !cap.retrieve( frame ) )
{
std::cout << "Failed to retrieve frame." << std::endl;
break;
}
// 检查是否成功读取到了帧
if ( frame.empty() )
{
std::cout << "Frame is empty." << std::endl;
break;
}
// 显示视频帧
cv::imshow( "Camera Stream", frame );
// 按 'q' 键退出循环
if ( cv::waitKey( 1 ) == 'q' )
{
break;
}
}
// 释放资源
cap.release();
cv::destroyAllWindows();
return 0;
}