C++ opencv视频处理与保存

2023-10-27

1.视频属性类型

视频有很多的属性,有时长,分辨率,帧宽度,帧高度,帧速率等

视频属性中,由于国内互联网视频网站的定义,我们对分辨率的区分有些误区。
所以这里重新介绍一下视频的分辨率,至于其他属性,一般不会有什么误区。

  • 分辨率

通常国际标准,我们把视频分辨率分为三类

SD—— 标清
HD——高清
UD——超高清

简要介绍如下:

标清(Standard Definition)
是物理分辨率在720p以下的一种视频格式。

高清(High Definition)
将“高清”定义为720p、1080i与1080p三种标准形式
而1080P又有另外一种称呼—全高清(FullHigh Definition)。
关于高清标准,国际上公认的有两条:

视频垂直分辨率超过720p或1080i
视频宽纵比为16:9。

超高清(Ultra High-Definition)
来自国际电信联盟 (International Telecommunication Union)最新批准的信息显示,
“4K分辨率 (3840×2160 像素)” 的正式名称被定为“超高清 Ultra HD(UltraHigh-Definition)”。
同时,这个名称也适用于“8K分辨率 (7680×4320像素)”。

CEA要求,所有的消费级显示器和电视机必须满足以下几个条件之后,才能 贴上“超高清 Ultra HD” 的标签:

首先屏幕最小的像素必须达到800 万有效像素(3840×2160)
在不改变屏幕分辨率的情况下,至少有一路传输端可以传输 4K视频,4K内容的显示必须原生,
不可上变频,纵横比至少为16:9。
Ps:

720p格式,分辨率为1280×720p/60Hz,行频为45kHz 。
4K分辨率是1080p的4倍 3840×2160 =1920×2×1080×2 。
8K分辨率是4K的4倍 7680×4320 = 3840×2×2160×2

虽然介绍了分辨率,但本文主要演示一些帧相关的属性,具体如下

  • 帧宽度——frame_width
  • 帧高度——frame_height
  • 总帧数——frame_count
  • 帧速率—— FPS(Frames Per Second)

2.视频属性获取

在opencv中,我们如果要获取视频的属性,就要用到VideoCapture类的一个方法

.get

get
    返回指定VideoCapture属性
        共1个参数
            第1个参数 指定的属性


VideoCapture属性,有很多很多,具体可查阅文档

本文只用到4种属性

CAP_PROP_FRAME_WIDTH - 视频流中帧的宽度
CAP_PROP_FRAME_HEIGHT - 视频流中帧的高度
CAP_PROP_FRAME_COUNT - 视频文件中的帧数
CAP_PROP_FPS - 帧率
 

实例代码

获取视频属性

void QuickDemo::video_demo(Mat& image) {

	VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件

	int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);
	int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);
	int frame_count = cap.get(CAP_PROP_FRAME_COUNT);
	double fps = cap.get(CAP_PROP_FPS);

	std::cout << "frame_width:" << frame_width << std::endl;
	std::cout << "frame_height:" << frame_height << std::endl;
	std::cout << "frame_count:" << frame_count << std::endl;
	std::cout << "fps:" << fps << std::endl;

	Mat frame;
	while (true) {

		cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame

		//对视频读取时,同图像一样会有判空操作
		if (frame.empty()) {
			break;
		}

		imshow("frame", frame);

		int c = waitKey(1);
		if (c == 27) {
			break;
		}
	}
	cap.release();
}

注:

这里有一点要提

既然有get,那就有对应的set。但是我们使用set会涉及很多的问题

比如上一课中摄像头

当我们使用set对摄像头传来的视频操作时
如果超出了摄像头硬件的范围,即使设置的再好也不会显示

3.视频保存 

在opencv中,关于视频的写操作是通过VideoWriter类来实现的。

在进行图像保存的时候,我们一般要三步

  • 通过 VideoWriter创建一个视频写入对象。(创建时,我们要传入各种写入要求)
  • 再通过writer写入。
  • 释放


API


VideoWriter 类

  • fourcc 指定编码器(cv2.VideoWriter_fourcc(*'mp4v')XVID:avi的
VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)
	视频写入对象
		共5个参数
			第1个参数 视频文件路径
			第2个参数 视频编码方式(我们可以通过VideoCapture::get(CAP_PROP_FOURCC)获得)
			第3个参数 fps
			第4个参数 size
			第5个参数 是否为彩色

write

write
	写入下一个视频帧
		共1个参数
			第1个参数 输入的视频帧

这里提一句(对象都要释放)

同VideoCapture类对象一样,VideoWirter对象也要在末尾写上release
演示如下

示例代码

视频保存 

void QuickDemo::video_demo(Mat& image) {

	VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件

	int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);
	int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);
	int frame_count = cap.get(CAP_PROP_FRAME_COUNT);
	double fps = cap.get(CAP_PROP_FPS);

	std::cout << "frame_width:" << frame_width << std::endl;
	std::cout << "frame_height:" << frame_height << std::endl;
	std::cout << "frame_count:" << frame_count << std::endl;
	std::cout << "fps:" << fps << std::endl;

	VideoWriter wri("D:/WorkSpace/Opencv/videos/wri.mp4", cap.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);

	Mat frame;
	while (true) {

		cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame

		//对视频读取时,同图像一样会有判空操作
		if (frame.empty()) {
			break;
		}

		wri.write(frame);

		imshow("frame", frame);

		int c = waitKey(1);
		if (c == 27) {
			break;
		}
	}
	cap.release();
	wri.release();
	
}

在这里插入图片描述

视频处理注意事项

最后有两点要提

  • opencv,只专注于视频画面的处理,没有声音,不处理音频,如果想处理音频,要涉及其他领域
  • opencv保存视频是有一定限制的,理论上说单个视频不要超过2G

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ opencv视频处理与保存 的相关文章

随机推荐

  • 电脑老是安装一些来路不明的软件(如何解决)?

    目录 先解决自身可能出现的问题 上四大方法 先解决自身可能出现的问题 1 自行百度下载软件 没有到官网那去下载 进入一些假官网下载软件会附带一些流氓软件 看好官网地址再下载或者用安全软件那去下载 2 电脑的浏览器被劫持了 浏览器会有小广告
  • 智能指针与引用计数详解(二)

    在智能指针与引用计数详解 一 当中讲了智能指针还有改进的地方 下面具体问题具体分析 一 智能指针的赋值方法改进 上一章的赋值方法中只要是赋值都是右操作数引用计数加一 左操作数引用计数减一 没有考虑过引用计数对象自赋值的情况 比如按照上一章代
  • Windows键盘对应苹果的Option键

    用mini mac的用户 如果用的是windows的键盘 那么开发时功能键或多或少会有一些不适应 特别是在xCode4中 我就一直没有找到option对应的windows键 苹果有介绍 http support apple com kb H
  • Matlab学习——求解微分方程(组)

    介绍 1 在 Matlab 中 用大写字母 D 表示导数 Dy 表示 y 关于自变量的一阶导数 D2y 表示 y 关于自变量的二阶导数 依此类推 函数 dsolve 用来解决常微分方程 组 的求解问题 调用格式为 X dsolve eqn1
  • 自定义指令 v-loading

    1 在src下创建directive文件夹 2 在directive文件夹下创建loading文件夹 3 loading文件夹内创建index js和loading vue 目录图 4 index js src directive load
  • QtCreator 快捷键问题记录

    我目前用的QtCreator Mac版8 0 0 具体信息如下 一般来说QtCreator的快捷键和设置项在windows下也是一样的 在QtCreator gt Options gt Environment gt Keyboard中可以找
  • SpringBoot整合office转换与预览

    文章目录 一 介绍 1 简介 2 aspose简介 3 jodconverter简介 二 springboot整合aspose实战 1 前期依赖准备 1 1 介绍 1 2 项目直接引入jar包 1 3 maven添加本地包 2 office
  • 使用Retrofit上传实体类到服务端(笔记)

    一 服务端 1 需要对参数用 RequestBody这个注解进行修饰 SpringBoot会自动将前端传过来的JSON数据反序列化成Java对象 登录 param requestVo return PostMapping value log
  • DOTA数据集标签txt文件转为xml文件

    文章目录 1 txt文件格式 2 xml文件格式 3 一般的txt到xml的转换思路 4 最终使用的txt到xml转换的脚本 5 之后可能用到的xml转换到txt的脚本 1 txt文件格式 DOTA数据集的txt文件格式如下 其中 每一行的
  • Springboot整合SpringSecurity

    使用Basic认证模式 1 maven依赖
  • 26.JavaWeb-SpringSecurity安全框架

    1 SpringSecurity安全框架 Spring Security是一个功能强大且灵活的安全框架 它专注于为Java应用程序提供身份验证 Authentication 授权 Authorization 和其他安全功能 Spring S
  • csv反序列化_序列化与反序列化

    toc 定义 序列化 将对象或数据结构转换成约定格式数据的过程 反序列化 将约定格式的数据转换成对象或数据结构的过程 通常我们将这种 约定格式的数据 称之为序列化协议 根据协议的特点序列化协议可以细分为文本序列化协议 以下简称文本协议 和二
  • 网线直连NUC调试并使用VSCode实现X11转发(Jetson,树莓派适用)

    1 场景描述 此种场景下 NUC与PC机通过一根网线进行连接 网线负责PC与NUC进行通信 SSH连接 同时可以将NUC的图形界面转发到PC 远程桌面或X11窗口转发均可 方便战队成员在没有显示器的场景下对NUC进行调试 配置示例如下图所示
  • springboot微服务前端传参数至后端的几个方式,@RequestBody如何传入多个参数@RequestParam

    一 问题 在接口测试工具中 常常要传入参数 初学者 也就是我菜鸡经常传错参数 不明白在Query还是Body里面传参 以及测试工具 AxxPoxx 测试下载接口的时候为什么发送数据成功却没有下载文档下来 后端参数传输方式 二 解决 quer
  • JNDI 资源

    第 6 章 JNDI 资源 Java 命名和目录接口 Java Naming and Directory Interface JNDI 是一种应用编程接口 application programming interface API 用于访问
  • "NO 3D support is available from the host"

    https forums opensuse org showthread php 494522 No 3d Support or graphics accelleration http askubuntu com questions 537
  • 【项目设计】高并发内存池 (四)[pagecache实现]

    C 学习历程 入门 博客主页 一起去看日落吗 持续分享博主的C 学习历程 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 也许你现在做的事情 暂时看不到成果 但不要忘记 树 成长之前也要扎根 也要在漫长的时光 中沉淀养
  • 解决出现“raw.githubusercontent.com (raw.githubusercontent.com)

    服务器安装软件的时候出现 正在连接 raw githubusercontent com raw githubusercontent com 0 0 0 0 443 失败 拒绝连接 是因为改网址是被墙的 但是还是需要安装软件怎么办 打开多个地
  • 固态U盘量产:群联PS3111主控开卡量产工具使用教程

    PS3111开卡量产工具是一款专门用来进行量产的软件工具 下面将为大家提供使用教程 以帮助大家更加顺利地进行U盘量产 1 下载PS3111开卡量产工具 首先 需要在量产部落官网下载该工具并解压到电脑上 2 连接U盘 将需要进行量产的固态U盘
  • C++ opencv视频处理与保存

    1 视频属性类型 视频有很多的属性 有时长 分辨率 帧宽度 帧高度 帧速率等 视频属性中 由于国内互联网视频网站的定义 我们对分辨率的区分有些误区 所以这里重新介绍一下视频的分辨率 至于其他属性 一般不会有什么误区 分辨率 通常国际标准 我