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

OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用

  • 操作系统: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 复制帧,然后对复制的图像做任何你想做的事情。

函数原型


virtual bool cv::VideoCapture::retrieve	
(
	OutputArray 	image,
	int 	flag = 0 
)		

参数

  • 参数[out] image 视频帧在此处返回。如果没有抓取到帧,则图像将是空的。
  • 参数flag 它可以是帧索引或特定于驱动程序的标志。

返回值

类型:bool
描述:返回值指示是否成功从视频源中检索了一帧图像。如果返回 true,则表示成功检索;如果返回 false,则表示检索失败,这可能是因为已经到达视频末尾或者出现了其他错误。

代码示例


#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;
}

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

相关文章:

  • 如何使用 DomCrawler 进行复杂的网页数据抓取?
  • 正则表达式(补充)
  • 基于SSM+微信小程序的校园二手数码交易平台系统(二手3)(源码+sql脚本+视频导入教程+文档)
  • Windows 环境搭建 CUDA 和 cuDNN 详细教程
  • 大数据毕业设计选题推荐-重庆旅游景点数据分析系统-Python-Hive-Hadoop-Spark
  • Git 与 GUI 工具
  • STM32的ADC技术详解
  • 龙芯1B开发板自检程序
  • 828华为云征文|部署在线论坛网站 Flarum
  • 【STM32单片机_(HAL库)】4-3-1【定时器TIM】串口打印功能打开
  • MongoDB mongoose 的 save、insert 和 create 方法的比较
  • 算力共享系统中数据平面和控制平面
  • 富格林:正确指引远离欺诈黑幕
  • JAVASE总结
  • 学习threejs,添加环境光和点光源
  • 工具介绍---效率高+实用
  • 优化Mysql
  • [C++] 剖析AVL树功能的实现原理
  • 滚雪球学MySQL[11.2讲]:MySQL未来学习方向:大数据、云计算与迁移路径
  • [极客大挑战 2019]RCE ME1
  • Spring Security中自定义cors配置
  • 【算法篇】回溯算法类(1)(笔记)
  • 虚拟机U盘启动
  • 使用 Git 帮助文档
  • 养老院管理系统(含源码+sql+视频导入教程+文档)
  • 图解C#高级教程(四):协变、逆变
  • JSR303微服务校验
  • docker-compose 快速部署clickhouse集群
  • Springboot项目在win系统开发部署到linux服务器出现上传文件编码问题
  • 如何改善网站的核心网络生命力