《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播放视频和视像头调用
1、VideoCapture播放视频 #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main() {// 定义相关VideoCapture对象VideoCapture capture;// 打开视频文件capture.open("1.avi");// 判断视频流读取是否正…...
Vue中$props、$attrs和$listeners的使用详解
文章目录 透传属性如何禁止“透传属性和事件”多根节点设置透传访问“透传属性和事件” $props、$attrs和$listeners的使用详解 透传属性 透传属性和事件并没有在子组件中用props和emits声明透传属性和事件最常见的如click和class、id、style当子组件只有一个根元素时…...
爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发
一、前言 AI 视觉是为了让计算机利用摄像机来替代人眼对目标进行识别,跟踪并进一步完成一些更加复杂的图像处理。这一领域的学术研究已经存在了很长时间,但直到 20 世纪 70 年代后期,当计算机的性能提高到足以处理图片这样大规模的数据时&am…...
Pytest+Allure生成自动化测试报告!
前言 在自动化测试中,有unittestHTMLTestRunner自动化测试报告,但是生成的测试报告不够美观详细,今天我们来学习一下PytestAllure生成自动化测试报告。 一:安装python中的allure依赖库 在dos窗口中,输入下面三个命令…...
HTMLTestRunner
HTMLTestRunner是Python的标准库unittest单元测试框架的一个扩 展,用于生成HTML测试报告 下载地址: http://tungwaiyip.info/software/HTMLTestRunner.html HTML测试结果 HTMLTestRunner.py下载地址http://tungwaiyip.info/software/HTMLTestRunner.htm…...
ELK架构监控MySQL慢日志
目录 一、架构概述 二、安装部署 三、Filebeat配置 四、Logstash配置 一、架构概述 本文使用将使用filebeat收集mysql日志信息,发送到redis中缓存,由logstash从redis中取出,发送es中存储,再从kibana中展示。 二、安装部署 ELK…...
Linux命令---关机
介绍 使用命令关闭linux服务器或计算机 命令 立即关机: shutdown -h now指定十分钟后关机: shutdown -h 10...
点云从入门到精通技术详解100篇-基于拓扑约束的3D点云实例分割(续)
目录 3.6实验结果与分析 3.6.1实验数据集 3.6.2实验设置 3.6.3定量结果 3.6.4定性评价...
java版Spring Cloud+Spring Boot+Mybatis之隐私计算 FATE - 多分类神经网络算法测试
一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…...
Java之时间类2(JDK8新增)
一、Date类 (一)、ZoneId:时区 1、概述 ZoneId是Java 8中处理时区的类。它用于表示时区标识符,例如“America/New_York”或“Asia/Tokyo”。一共有600个时区。 2、常用方法: static Set<String> getAvailableZoneIds()获…...
MySQL InnoDB Replication部署方案与实践
1. 概述 MySQL Innodb ReplicaSet 是 MySQL 团队在 2020 年推出的一款产品,用来帮助用户快速部署和管理主从复制,在数据库层仍然使用的是主从复制技术。 ReplicaSet 主要包含三个组件:MySQL Router、MySQL Server 以及 MySQL Shell 高级客户…...
进程的同步和异步、进程互斥
一、进程同步和异步 同步(Synchronous): 同步指的是程序按照顺序执行,一个操作完成后才能进行下一个操作。在多进程或多线程的环境中,同步意味着一个进程(或线程)在执行某个任务时,…...
搞定课件录制,新手必备指南!
“有人知道课件怎么录制吗?学校要求我们师范专业的学生出去实习,现在需要录制一个课件视频,以便在课堂上播放,可是我不会录制教学视频,真的很头疼,有人能帮帮我吗。” 随着在线教育的崛起,课件…...
DevOps搭建(九)-Jenkins实现基础CI、CD详细操作
1、创建可运行SpringBoot项目 1.1、创建一个新工程 在idea里创建一个项目,这里叫devops-test,如下图: String Boot版本要选择2.x的,依赖直选中Spring Web选项即可: 修改pom.xml文件,在build标签中增加如下内容,目的是简化jar包名称。 <finalName>devops-test&l…...
十指波课堂:让学习编程不再是难事
十指波课堂是一家致力于发展线上私教平台的教育机构,主要的科目是计算机编程相关语言。由于学习编程的过程较为困难,学习者没有具体的学习方向,将要达到的就业水平不明,总会因为一些小问题困扰几个小时,这样会严重的影…...
IDEA卡顿,进行性能优化设置(亲测有效)——情况二
问题背景与现象 IDEA今天突然显示到期,于是从同事那边搞到一个很好用的破解方式,说实话,非常方便(后续在安前码后中分享) 破解之后呢,香了一阵子,但是突然显示开始卡顿,界面几乎是…...
利用Python和OpenCV实现将图像识别为Excel表格的便捷方法
当今社会,图像识别技术的发展为我们提供了许多便利,比如将图像中的文本信息转化为可编辑的电子表格。在本文中,我们将介绍如何利用Python结合OpenCV和pytesseract库,来实现将图像识别为Excel表格的过程。 首先,我们需…...
mysql:查看一个表的索引信息
可以使用命令SHOW INDEX FROM table_name;查看一个表的索引信息,例如:...
12月11日作业
完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配…...
HTTP协议在Linux上进行数据库访问代码示例
在Linux上使用HTTP协议进行数据库访问通常涉及到使用库如requests来进行HTTP请求,以及使用json或类似的库来处理返回的数据。下面是一个使用Python的简单示例,展示如何通过HTTP协议在Linux上访问数据库。 首先,你需要确保你的Linux系统上已经…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
