23 视频处理与保存

Posted 柒月的风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23 视频处理与保存相关的知识,希望对你有一定的参考价值。

23 视频处理与保存

个人资料,仅供学习使用
修改时间——2022年1月26日 00:49:43
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚

opencv知识点:

  • VideoWriter类
  • 获取视频属性 - VideoWriter::get
  • 视频保存 - VideoWriter::write

本课所解决的问题:

  • 分辨率都有哪几个等级?
  • 如何获取视频的属性?
  • 如何保存视频?

1.视频属性

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

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

分辨率

引用文章:视频画质标清、高清、超清,各是多大分辨率啊?

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

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

简要介绍如下

  • 标清(Standard Definition

是物理分辨率在720p以下的一种视频格式

  • 高清(High Definition

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

  • 视频垂直分辨率超过720p1080i
  • 视频宽纵比为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分辨率是4K47680×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写入。

对它们的介绍如下

VideoWriter

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();
	

4.视频处理注意事项

最后有两点要提

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

本课所用API查阅

1.VIdeoCapture::get

2.VideoCaptureProperties

以上是关于23 视频处理与保存的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程 300篇252.视频文件的读取与保存

OpenCV 例程 300篇252.视频文件的读取与保存

OpenCV 例程 300篇252.视频文件的读取与保存

快手视频怎么下载和保存?使用快手视频下载工具

使用多线程处理和保存图像

Python图像处理图像与视频处理基础