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

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

相关文章:

  • Java面试常见问题总结
  • L8打卡学习笔记
  • [数据集][目标检测]猪数据集VOC-2856张
  • 开放式蓝牙耳机哪个品牌更靠谱?5款高性价比开放式耳机推荐
  • RHCS认证-Linux(RHel9)-Ansible
  • 元宇宙的未来趋势:Web3的潜在影响
  • 集成MinIO实现文件存储管理:文件上传、文件下载、文件删除、获取文件访问地址、获取文件访问地址
  • ESP32 Bluedroid 篇(1)—— ibeacon 广播
  • Error和Exception
  • html TAB、table生成
  • 【MWORKS专业工具箱系列教程】控制系列工具箱第四期:时域分析
  • ARCGIS PRO SDK MapProjectItem 地图项目类
  • Flutter路由
  • JavaEE: 深入探索TCP网络编程的奇妙世界(五)
  • 基于SpringBoot+Vue的仓库管理系统
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2017届校招提前批面试回顾
  • Flex布局到底解决了什么问题
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Mysql优化
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • React-flux杂记
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SQLServer之创建显式事务
  • vue的全局变量和全局拦截请求器
  • 程序员最讨厌的9句话,你可有补充?
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 排序算法之--选择排序
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​configparser --- 配置文件解析器​
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(智能家居界面-界面切换)
  • #Z0458. 树的中心2
  • #面试系列-腾讯后端一面
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #职场发展#其他
  • (5)STL算法之复制
  • (CPU/GPU)粒子继承贴图颜色发射
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (编译到47%失败)to be deleted
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计高校学生选课系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (力扣)循环队列的实现与详解(C语言)
  • (七)Flink Watermark