计算机视觉全系列实战教程 (十五):使用opencv对视频进行基本处理

视频处理基本介绍

  • 1、基本概述
    • (1)opencv中视频处理的两个基础类
    • (2)视频的属性:获取属性和设置属性
  • 2、VideoCapture的介绍
    • (1)Why( VideoCapture类的作用)
    • (2)How( 如何使用VideoCapture)
      • A.播放视频文件函数
      • B.播放视频文件并实现暂停和继续
  • 3、VideoWriter类的介绍
    • (1)Why(VideoWriter类的作用)
    • (2)How(如何使用VideoWriter保存视频)
  • 4、总结

1、基本概述

(1)opencv中视频处理的两个基础类

初学者使用opencv对视频进行处理时,应该首先关注两个类:VideoCapture类和VideoWriter类

  • VideoCapture类:用于视频的读操作
  • VideoWriter类:用于视频的写操作

(2)视频的属性:获取属性和设置属性

  • 视频文件的当前播放位置:以毫秒为单位 -----------------------属性id:propId = 0
  • 帧索引:视频序列中帧的索引(以0为起始索引)-------------属性id:propId = 1
  • 帧宽度/高度:像素为单位--------------------------------------------属性id:propId = 3 / 4
  • 帧率:每一秒的所放映的帧数 --------------------------------------属性id:propId = 5
  • 帧数:视频文件的帧数(总数)------------------------------------属性id:propId = 7
  • 图像的亮度:仅适用于相机------------------------------------------属性id:propId = 10
  • 图像的对比度:仅适用于相机---------------------------------------属性id:propId = 11
  • 图像的饱和度:仅适用于相机---------------------------------------属性id:propId = 12
  • 图像的色调:仅适用于相机------------------------------------------属性id:propId = 13
  • 图像的增益:仅适用于相机------------------------------------------属性id:propId = 14
  • 图像的曝光:仅适用于相机------------------------------------------属性id:propId = 15

A.获取视频的属性:

double dRes = vidObj.get(propId);

B.设置视频的属性:

int propId = 4;
double dValue =100;
vidObj.set(propId, dValue);

2、VideoCapture的介绍

(1)Why( VideoCapture类的作用)

获取视频文件或摄像头视频

(2)How( 如何使用VideoCapture)

A.播放视频文件函数

视频播放函数如下(可直接使用):

/*@author @还下着雨ZG
* @brief 播放指定的视频文件
* @param[in] strVideo, 视频文件所在路径
* @return int, 正表示播放成功,负数表示播放视频文件失败
*/
int VideoPlay(const std::string& strVideo)
{//创建VideoCapture对象cv::VideoCapture capture;//打开视频文件capture.open(strVideo);//判断是否打开成功if (!capture.isOpened()){std::cerr << "Failed to open video!" << std::endl;return -1;} //获取视频的帧率FPSdouble rate = capture.get(cv::CAP_PROP_FPS);//播放视频cv::Mat frame;while (1){capture >> frame;if (frame.empty()){std::cout<<"播放完毕!"<<std::endl;break;}cv::imshow("Playing video...", frame);cv::waitKey(rate);}
}

B.播放视频文件并实现暂停和继续

视频播放和暂停函数如下(可直接使用):

/*@author @还下着雨ZG
* @brief 播放指定的视频文件并实现了暂停和继续
* @param[in] strVideo, 视频文件所在路径
* @return int, 正表示播放成功,负数表示播放视频文件失败
*/
int VideoPlayAndStop(const std::string& strVideo)
{//读取视频文件cv::VideoCapture capture(strVideo, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//显示每一帧(视频自带帧率)cv::Mat imFrame;double dRate = capture.get(cv::CAP_PROP_FPS);int iDelay = 1000 / dRate;bool bStop = false;while (!bStop){capture >> imFrame;if (imFrame.empty()) {bStop = true;return 0;}else{imshow("MyFrame", imFrame);}int iKeyInput = cv::waitKey(iDelay);if (char(iKeyInput) == 27 ){bStop = true;}if (iKeyInput >= 0){cv::waitKey(0);}}capture.release();return 1;
}

3、VideoWriter类的介绍

(1)Why(VideoWriter类的作用)

保存修改后的视频文件、保存摄像头获取的视频序列、对待保存的视频格式进行设置等

(2)How(如何使用VideoWriter保存视频)

视频保存,该函数一般是用于对视频文件编辑之后的视频进行保存,或保存摄像头获取的视频序列(可根据实际需求做少量更改后使用):

int VideoSave(const std::string& strVideoSrc, const std::string& strVideoDst)
{//获取视频cv::VideoCapture capture;capture.open(strVideoSrc, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//创建视频录制对象cv::VideoWriter writer;int iFourcc = writer.fourcc('M','J','P','G'); //视频编码格式double dFps = 25.0;cv::Mat imFrame;capture >> imFrame;if(imFrame.empty()) return -2;cv::Size SzFrame = imFrame.size();bool bIsColor = true; //彩色视频(false表示灰色视频)writer.open(strVideoDst,iFourcc, dFps, SzFrame, bIsColor);writer.write(imFrame);//将第一帧写入到writer对象中int iRate = 1000/capture.get(cv::CAP_PROP_FPS); //获取原始视频的帧率//遍历每一帧图像while(1){if(!capture.read(imFrame)) break;writer.write(imFrame);cv::imshow("Frame", imFrame);if(cv::waitKey(iRate)>=0) break;}writer.release();capture.release();return 1;
}

注意:如果是需要保存摄像头的视频序列,应将该函数的第一个参数转换为摄像头的索引(0,1, …),函数内部做一定的修改即可

4、总结

  • VideoCapture类的基本介绍:该类的作用、视频属性、对视频每一帧进行处理、视频播放和暂停等
  • VideoWriter类的基本介绍:该类的作用、保存处理后的视频序列、保存相机获取的视频序列等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CJSON库

目录 一、介绍 1、JSON是什么 2、为什么使用CJSON 3、JSON格式 二、使用CJSON构造JSON 1、创建对象 2、添加字段 3、转换格式 4、释放对象 三、使用CJSON解析JSON 1、解析数据 2、 获取字段 3、释放对象 一、介绍 1、JSON是什么 JSON是什么呢&#xff1f;JSON全称…

折半查找详解

一&#xff1a;折半查找概念 折半查找&#xff08;也称为二分查找&#xff09;是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是目标值&#xff0c;则搜索过程结束&#xff1b;如果目标值大于或小于中间元素&#x…

OceanBase 4.2.1 离线安装

OceanBase 4.2.1 离线安装 4.2 版本的OceanBase支持一键安装&#xff0c;所以在线版本的安装简单了很多&#xff0c;但在无法连接网络的情况下安装就只能手动离线安装。 注&#xff1a;如下安装过程都是在同一台机器上面进行&#xff0c;也就是只有一个节点&#xff0c;多个节…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

Oracle、MySQL、PostGreSQL、SQL Server-查询每秒事务数

Oracle、MySQL、PostGreSQL、SQL Server-查询每秒事务数 在做 db benchmarks 时&#xff0c;qps、tps 是衡量数据库性能的关键指标,TPS : Transactions Per Second 是每秒事务数&#xff0c;即数据库服务器在单位时间内处理的事务数。 横向对比计划几类数据库计算tps的方法。 …

微信小程序毕业设计-垃圾分类系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

AI产品哲学深探:从Perplexity CEO视角看搜索引擎的智慧启示

一、开篇:历史的分岔路口 在科技史的长河中,有些对话悄然决定了行业的走向。回溯至互联网搜索的黎明时期,一场未被充分重视的会谈在两位科技巨擘之间展开。谷歌联合创始人Larry Page与昔日搜索引擎巨头Excite的CEO坐在了谈判桌两端,他们的对话不仅关乎一次潜在的并购,更预…

elasticsearch的查询原理

数据结构 在 Elasticsearch 中,数据结构分布如下: 索引(Index) 索引是 Elasticsearch 中存储数据的基本单元,相当于关系型数据库中的数据库。一个 Elasticsearch 集群中可以包含多个索引。 类型(Type) (从 Elasticsearch 7.0 开始已经被弃用): 在较早版本的 Elasticsearch…

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中&#xff0c;我们已经梳理了Plot的画图用法&#xff0c;今天就详细梳理一下其他的画图函数用法&#xff1b; 1. 画一条直线 2. Circle(圆) 3. Disk&#xff08;圆盘&#xff09; 4. 画出一个矩形 5. 箭头

c-前缀平方和序列(牛客小白月赛97)

题目&#xff1a; 假如一个长度为 n的正整数序列满足所有前缀和 都是平方数&#xff0c;那么称这种序列为前缀平方序列。 条件1<si<x 取模1e97 首先找出小于x的平方数有几个。 然后用二项式定理 算出小于x的平方数中取n个的种数。 #include<bits/stdc.h> using…

大数据可视化实验(六)——ECharts与pyecharts数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1、ECharts可视化制作.. 1 1&#xff09;使用ECharts绘制折线图显示一周的天气变换。... 1 2&#xff09;使用ECharts绘制柱状图显示商品销量的变化。... 4 2、pyecharts可视化制作.. 7 1&#xff09;使用…

beautifulSoup库

是什么? Beautiful Soup(简称BS4)是一种强大而灵活的HTML和XML解析库,广泛用于Python爬虫和数据采集中。相比正则表达式更加简洁. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的…

【知识学习】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一个强大的可视化Shader编辑工具&#xff0c;它允许用户通过拖拽和连接节点的方式来创建Shader&#xff0c;而不是通过传统的编写代码的方式。Shader Graph使得Shader的创建过程更加直观和易于理解&#xff0c;特别是对于那些不熟悉Shader语言编程的美…

Java中的性能调优技巧与工具推荐

Java中的性能调优技巧与工具推荐 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨Java中的性能调优技巧与工具推荐。Java作为一门广泛应用的编程语…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程&#xff0c;并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

IDEA中Maven配置依赖和排除依赖

目录 依赖配置 添加依赖的几种方式&#xff1a; 1.利用中央仓库搜索的依赖坐标 2.利用IDEA工具搜索依赖 3.熟练上手maven后&#xff0c;快速导入依赖 排除依赖 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&am…

python r”, b”, u”, f” 前缀详解

1、r前缀 一般来说&#xff0c;\n’是一个换行符&#xff0c;是一个字符串&#xff1b;而加上r为前缀后&#xff0c;不会以任何特殊方式处理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的双字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知识测试-工作机制

Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中&#xff0c;go test 命令的实现主要在 src/cmd/go/internal…

Java面试题:解释反应式编程的概念,并讨论如何在Java中使用RxJava或Project Reactor实现

反应式编程&#xff08;Reactive Programming&#xff09;是一种基于异步数据流和变化传播的编程范式。它强调通过声明式编程来处理异步事件流和数据流&#xff0c;简化了复杂的异步操作和并发编程。反应式编程适用于处理异步事件、多线程处理、大量数据流、用户交互等场景。 …