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

news/2024/12/21 23:39:14/
  • 操作系统: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;
}

运行结果

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


http://www.ppmy.cn/news/1534637.html

相关文章

一次解决Go编译问题的经过

用Go语言编写了一个小的项目&#xff0c;项目开发环境是在本地的Windows环境中&#xff0c;一切单元测试和集成测试通过后&#xff0c;计划将项目部署到VPS服务器上自动运行&#xff0c;但在服务器上执行go run运行时&#xff0c;程序没有任何响应和回显&#xff0c;甚至main函…

linux第二课:常用命令

Kali Linux&#xff0c;黑客必备神器。跟着我&#xff0c;带你从入门到入狱&#xff01; 第二课&#xff0c;常用命令。 1.whoami 翻译为中文&#xff1a;我是谁 用途&#xff1a;输出现在自己的用户身份(用户名) 参数&#xff1a;无参数 好吧&#xff0c;这透明度一调都不…

springboot项目配置部分依赖从私服拉取,部分从阿里云拉取

在Java项目中&#xff0c;配置部分依赖从私服拉取&#xff0c;部分从阿里云拉取&#xff0c;可以在Maven的配置文件settings.xml中设置多个镜像&#xff0c;Maven会根据镜像的顺序尝试下载依赖。 ‌配置私服镜像‌&#xff1a;首先配置你的私服镜像&#xff0c;例如Nexus私服&…

Linux学习笔记(五):shell脚本,强大的文本处理工具awk,sed

Linux学习笔记&#xff08;五&#xff09;&#xff1a;shell脚本&#xff0c;awk&#xff0c;sed&#xff0c;服务管理 1. Shell 脚本 Shell 脚本是一种使用 Shell 编写的脚本&#xff0c;它可以在 Linux 系统中执行各种任务。 1.1 变量 声明变量&#xff1a; 使用 export 命令…

828华为云征文|部署敏捷项目管理系统工具 ZenTao

828华为云征文&#xff5c;部署敏捷项目管理系统工具 ZenTao 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 ZenTao3.1 ZenTao 介绍3.2 ZenTao 部署3.3 ZenTao 使用 四、总…

如何保护自己电脑以及服务器的ip地址

保护你的电脑和服务器的IP地址&#xff0c;可以采取以下措施&#xff1a; 1. 使用代理服务器 HTTP/HTTPS代理&#xff1a;通过代理服务器访问网络&#xff0c;隐藏真实IP地址。SOCKS代理&#xff1a;提供更高级的网络流量转发&#xff0c;可以更好地处理各种网络协议。 2. 配…

Spring(学习笔记)

<context:annotation-config/>是 Spring 配置文件中的一个标签&#xff0c;用于开启注解配置功能。这个标签可以让 Spring 容器识别并处理使用注解定义的 bean。例如&#xff0c;可以使用 Autowired 注解自动装配 bean&#xff0c;或者使用 Component 注解将类标记为 bea…

掌握 C# 中的 LINQ(语言集成查询)

LINQ&#xff08;Language Integrated Query&#xff0c;语言集成查询&#xff09;是 C# 中的一项强大功能&#xff0c;它使得我们能够使用查询语法处理不同的数据源&#xff0c;如对象、XML、数据库等。LINQ 通过提供统一的查询语法&#xff0c;使开发者能够更加简洁、高效地操…