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

OpenCV视频I/O(8)从视频源中读取一帧图像函数read()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

抓取、解码并返回下一个视频帧。
cv::VideoCapture::read() 是 VideoCapture 类的一个成员函数,用于从视频源中读取一帧图像.

该方法/函数将 VideoCapture::grab()VideoCapture::retrieve() 结合在一个调用中。这是读取视频文件或从解码中捕获数据最方便的方法,并返回刚刚获取的帧。如果没有获取到帧(摄像头已断开连接,或者视频文件中没有更多的帧),该方法返回 false 并且函数返回空图像(使用 cv::Mat 时,可以通过 Mat::empty() 测试)。

注意
在 C API 中,函数 cvRetrieveFrame()cv.RetrieveFrame() 返回存储在视频捕获结构内部的图像。不允许修改或释放该图像!你可以使用 cvCloneImage 复制帧,然后对副本做任何你想做的事情。

函数原型


virtual bool cv::VideoCapture::read	
(	OutputArray 	image
)	

参数

  • 参数[out] image 这里返回视频帧。如果没有获取到帧,则图像将是空的。

返回值

类型: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.read( frame ) ){std::cout << "No frame grabbed." << 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;
}

运行结果

输出的是摄像头的实时视频画面

相关文章:

  • CDGA|数据治理:策略与价值的深度融合
  • CentOS 修改服务器登录密码的完整指南
  • 60.【C语言】内存函数(memset,memcmp函数)
  • 剖解环形链表1
  • 【nrm】npm 注册表管理器
  • STM32精确控制步进电机
  • 2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点
  • Java面试:ArrayList 和 LinkedList 的区别是什么?谈谈你对ArrayList和LinkedList的理解
  • 基于深度学习的学情智能监测系统设计与实现(PYQT+YOLOv8+训练数据集+论文+部署文档)
  • we3.0里的钱包是什么?
  • 基于python+flask+mysql的音频信息隐藏系统
  • Llama 3.2 90B刚开源就被Molmo-72B全面击败!
  • SpringCloud入门
  • Java Web应用升级故障案例解析
  • 高效处理大规模数据:MATLAB实践指南
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • CentOS从零开始部署Nodejs项目
  • cookie和session
  • ES6系列(二)变量的解构赋值
  • HTTP--网络协议分层,http历史(二)
  • HTTP中的ETag在移动客户端的应用
  • Terraform入门 - 3. 变更基础设施
  • Vue 2.3、2.4 知识点小结
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 彻底搞懂浏览器Event-loop
  • 翻译--Thinking in React
  • 高程读书笔记 第六章 面向对象程序设计
  • 记一次删除Git记录中的大文件的过程
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 你不可错过的前端面试题(一)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 用简单代码看卷积组块发展
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​Java并发新构件之Exchanger
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # 数据结构
  • #DBA杂记1
  • #Ubuntu(修改root信息)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $(function(){})与(function($){....})(jQuery)的区别
  • $forceUpdate()函数
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Java入门)学生管理系统
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (计算机网络)物理层
  • (简单) HDU 2612 Find a way,BFS。
  • (离散数学)逻辑连接词
  • (转)EXC_BREAKPOINT僵尸错误
  • *1 计算机基础和操作系统基础及几大协议
  • .DFS.