当前位置: 首页 > news >正文

《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当子组件只有一个根元素时&#xf…...

爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发

一、前言 AI 视觉是为了让计算机利用摄像机来替代人眼对目标进行识别&#xff0c;跟踪并进一步完成一些更加复杂的图像处理。这一领域的学术研究已经存在了很长时间&#xff0c;但直到 20 世纪 70 年代后期&#xff0c;当计算机的性能提高到足以处理图片这样大规模的数据时&am…...

Pytest+Allure生成自动化测试报告!

前言 在自动化测试中&#xff0c;有unittestHTMLTestRunner自动化测试报告&#xff0c;但是生成的测试报告不够美观详细&#xff0c;今天我们来学习一下PytestAllure生成自动化测试报告。 一&#xff1a;安装python中的allure依赖库 在dos窗口中&#xff0c;输入下面三个命令…...

HTMLTestRunner

HTMLTestRunner是Python的标准库unittest单元测试框架的一个扩 展&#xff0c;用于生成HTML测试报告 下载地址&#xff1a; http://tungwaiyip.info/software/HTMLTestRunner.html HTML测试结果 HTMLTestRunner.py下载地址http://tungwaiyip.info/software/HTMLTestRunner.htm…...

ELK架构监控MySQL慢日志

目录 一、架构概述 二、安装部署 三、Filebeat配置 四、Logstash配置 一、架构概述 本文使用将使用filebeat收集mysql日志信息&#xff0c;发送到redis中缓存&#xff0c;由logstash从redis中取出&#xff0c;发送es中存储&#xff0c;再从kibana中展示。 二、安装部署 ELK…...

Linux命令---关机

介绍 使用命令关闭linux服务器或计算机 命令 立即关机&#xff1a; shutdown -h now指定十分钟后关机&#xff1a; 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 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练&#xff0c;并使用该模型对数据进行 多分类预测。 二分类算法&#xff1a;是指待预测的 label 标签的取值只有两种&#xff1b;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…...

Java之时间类2(JDK8新增)

一、Date类 &#xff08;一&#xff09;、ZoneId&#xff1a;时区 1、概述 ZoneId是Java 8中处理时区的类。它用于表示时区标识符&#xff0c;例如“America/New_York”或“Asia/Tokyo”。一共有600个时区。 2、常用方法: static Set<String> getAvailableZoneIds()获…...

MySQL InnoDB Replication部署方案与实践

1. 概述 MySQL Innodb ReplicaSet 是 MySQL 团队在 2020 年推出的一款产品&#xff0c;用来帮助用户快速部署和管理主从复制&#xff0c;在数据库层仍然使用的是主从复制技术。 ReplicaSet 主要包含三个组件&#xff1a;MySQL Router、MySQL Server 以及 MySQL Shell 高级客户…...

进程的同步和异步、进程互斥

一、进程同步和异步 同步&#xff08;Synchronous&#xff09;&#xff1a; 同步指的是程序按照顺序执行&#xff0c;一个操作完成后才能进行下一个操作。在多进程或多线程的环境中&#xff0c;同步意味着一个进程&#xff08;或线程&#xff09;在执行某个任务时&#xff0c;…...

搞定课件录制,新手必备指南!

“有人知道课件怎么录制吗&#xff1f;学校要求我们师范专业的学生出去实习&#xff0c;现在需要录制一个课件视频&#xff0c;以便在课堂上播放&#xff0c;可是我不会录制教学视频&#xff0c;真的很头疼&#xff0c;有人能帮帮我吗。” 随着在线教育的崛起&#xff0c;课件…...

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…...

十指波课堂:让学习编程不再是难事

十指波课堂是一家致力于发展线上私教平台的教育机构&#xff0c;主要的科目是计算机编程相关语言。由于学习编程的过程较为困难&#xff0c;学习者没有具体的学习方向&#xff0c;将要达到的就业水平不明&#xff0c;总会因为一些小问题困扰几个小时&#xff0c;这样会严重的影…...

IDEA卡顿,进行性能优化设置(亲测有效)——情况二

问题背景与现象 IDEA今天突然显示到期&#xff0c;于是从同事那边搞到一个很好用的破解方式&#xff0c;说实话&#xff0c;非常方便&#xff08;后续在安前码后中分享&#xff09; 破解之后呢&#xff0c;香了一阵子&#xff0c;但是突然显示开始卡顿&#xff0c;界面几乎是…...

利用Python和OpenCV实现将图像识别为Excel表格的便捷方法

当今社会&#xff0c;图像识别技术的发展为我们提供了许多便利&#xff0c;比如将图像中的文本信息转化为可编辑的电子表格。在本文中&#xff0c;我们将介绍如何利用Python结合OpenCV和pytesseract库&#xff0c;来实现将图像识别为Excel表格的过程。 首先&#xff0c;我们需…...

mysql:查看一个表的索引信息

可以使用命令SHOW INDEX FROM table_name;查看一个表的索引信息&#xff0c;例如&#xff1a;...

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…...

HTTP协议在Linux上进行数据库访问代码示例

在Linux上使用HTTP协议进行数据库访问通常涉及到使用库如requests来进行HTTP请求&#xff0c;以及使用json或类似的库来处理返回的数据。下面是一个使用Python的简单示例&#xff0c;展示如何通过HTTP协议在Linux上访问数据库。 首先&#xff0c;你需要确保你的Linux系统上已经…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...