- 操作系统: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
复制帧,然后对副本做任何你想做的事情。
函数原型
cpp
virtual bool cv::VideoCapture::read
(
OutputArray image
)
参数
- 参数[out] image 这里返回视频帧。如果没有获取到帧,则图像将是空的。
返回值
类型: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.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;
}
运行结果
输出的是摄像头的实时视频画面