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

2023-12-08 23:28

本文主要是介绍《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/471666

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文