《opencv实用探索·十四》VideoCapture播放视频和视像头调用

2023-12-12 06:30

本文主要是介绍《opencv实用探索·十四》VideoCapture播放视频和视像头调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、VideoCapture播放视频

#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;int main()
{// 定义相关VideoCapture对象VideoCapture capture;// 打开视频文件capture.open("1.avi");//  判断视频流读取是否正确if (!capture.isOpened()){std::cout << "fail to open video!" << std::endl;return -1;}// 获取视频相关信息-帧像素宽高 int  frameWidth = capture.get(cv::CAP_PROP_FRAME_WIDTH);int  frameHeight = capture.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "视频中图像的宽度为:" << frameWidth << std::endl;std::cout << "视频中图像的高度为: " << frameHeight << std::endl;// 获取视频相关信息-帧率double FrameRate = capture.get(cv::CAP_PROP_FPS);std::cout << "视频帧率为:" << FrameRate << std::endl;// 获取视频相关信息-帧数long nTotalFrame = capture.get(cv::CAP_PROP_FRAME_COUNT);std::cout << "视频总帧数为:" << nTotalFrame << std::endl;// 如果视频读取成功则创建视频流cv::Mat frameImg;long nCount = 1;while (true){capture >> frameImg;//获取当前帧图像// 显示当前帧if (!frameImg.empty()){imshow("frameImg", frameImg);if (char(waitKey(int(1000 / FrameRate)) == 'q')) // 按下键盘上q键退出break;}else{break;}nCount++;}// 视频释放capture.release();return 0;
}

waitKey(int(1000 / FrameRate)) 是用于在每一帧显示后等待一定时间的语句。它的作用是在视频播放时限制帧率,以使视频以正常速度播放。

具体来说:

FrameRate 是视频的帧率,表示每秒播放的帧数。
1000 / FrameRate 计算出每一帧需要显示的时间(以毫秒为单位),即每帧之间的间隔时间。
waitKey 是一个 OpenCV 函数,它等待用户在键盘上按键的时间。如果在指定的时间内按下键盘上的键,它会返回按键的 ASCII 值,否则返回 -1。
因此,waitKey(int(1000 / FrameRate)) 的作用是等待足够的时间,以保持视频的实际帧率接近指定的 FrameRate。这有助于以正常速度播放视频,而不是以计算机能够处理的最大速度。
如果把waitKey 换成Sleep延时会导致视频卡死,因为Sleep仅仅只是简单的延时,延时期间直接阻塞当前线程,而waitKey在延时的同时能够使当前线程保持持续的响应,类似Qt中QCoreApplication::processEvents();防止界面假死操作。
当我们等待的时间小于int(1000 / FrameRate)能实现视频快放的效果,当我们等待的时间大于int(1000 / FrameRate)能实现视频慢放的效果。

2、VideoCapture调用摄像头

#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;int main()
{// 定义相关VideoCapture对象VideoCapture capture(0);//  判断摄像头是否打开if (!capture.isOpened()){std::cout << "fail to open video!" << std::endl;return -1;}// 获取摄像头相关信息-帧像素宽高 int  frameWidth = capture.get(cv::CAP_PROP_FRAME_WIDTH);int  frameHeight = capture.get(cv::CAP_PROP_FRAME_HEIGHT);std::cout << "摄像头中图像的宽度为:" << frameWidth << std::endl;std::cout << "摄像头中图像的高度为: " << frameHeight << std::endl;// 获取摄像头相关信息-帧率double FrameRate = capture.get(cv::CAP_PROP_FPS);std::cout << "摄像头帧率为:" << FrameRate << std::endl;// 如果摄像头打开成功则创建视频流cv::Mat frameImg;long nCount = 1;while (true){capture >> frameImg;//获取当前帧图像// 显示当前帧if (!frameImg.empty()){imshow("frameImg", frameImg);if (char(waitKey(30) == 'q')) // 按下键盘上q键退出break;}else{break;}nCount++;}// capture释放capture.release();return 0;
}

上面代码中获取的摄像头的帧率为0,可能的远因如下:
摄像头不支持帧率查询:
不是所有的摄像头都支持通过 cv::CAP_PROP_FPS 查询帧率。在这种情况下,OpenCV 可能无法正确获取帧率信息,返回0。

帧率信息尚未初始化:
在有些摄像头中,帧率信息可能在摄像头开始捕获帧之前不可用。在你的代码中,你可以尝试在开始捕获帧之后再获取帧率信息。

摄像头不支持固定帧率:
有些摄像头可能不以固定的帧率工作,因此 OpenCV 无法准确地获取帧率信息。

如果无法获取摄像头的帧率,那么waitKey需要设置一个固定的等待时间,一般为30Ms

在这里插入图片描述

这篇关于《opencv实用探索·十四》VideoCapture播放视频和视像头调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483559

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场