opencv学习笔记5-opencv读取视频并进行处理保存

一、视频处理方法:

(1)VideoWriter 类概述:

  VideoWriter 类提供了一个 C++ API,用于将视频帧写入视频文件或图像序列,这个类在不同的操作系统上使用不同的后端进行视频编码:

  • Linux:使用 FFMPEG。
  • Windows:使用 FFMPEG、MSWF 或 DSHOW。
  • MacOSX:使用 AVFoundation。
(2)构造函数和初始化:
  • 默认构造函数不执行任何操作,需要手动调用 open 方法初始化。
  • 带参数的构造函数创建 VideoWriter 对象时初始化视频写入器,需要提供输出文件名、编解码器的 FourCC 码、帧率、帧大小和颜色标志。
(3)重要参数说明:
  • filename:输出视频文件的名称。
  • fourcc:用于压缩帧的编解码器的四字符代码。例如,使用 VideoWriter::fourcc('P', 'I', 'M', '1') 表示 MPEG-1 编解码器。
  • fps:创建的视频流的帧率。
  • frameSize:视频帧的大小。
  • isColor:如果非零,编码器将期望并编码彩色帧,否则将处理灰度帧。
(4)编解码器和容器提示
  • 某些后端(如 FFMPEG 与 MP4 容器)使用不同的 FourCC 值。在这种情况下,OpenCV 可能会显示一个关于 FourCC 码转换的警告消息。
(5)打开和关闭视频流:
  • open 方法:根据提供的参数打开视频流。
  • isOpened:检查视频写入器是否成功初始化。
  • release:关闭视频写入器,释放资源。
(6)写入帧:
  • operator <<:重载的运算符,用于写入下一帧。
  • write 方法:将指定的图像写入视频文件。
(7)设置和获取属性:
  • set 方法:设置 VideoWriter 的属性。
  • get 方法:获取 VideoWriter 的属性。
(8)附加说明:
  • 某些编解码器可能需要特定的文件扩展名和/或特定的 FourCC 码。
  • 为了获得无损压缩视频,需要使用无损编解码器。
  • 通过设置 fourcc=-1,可以在某些后端中弹出系统编解码器选择对话框。
  • 使用 apiPreference 参数可以指定要使用的 API 后端。
  • params 参数允许指定额外的编码器参数。

二、示例代码 

#include <opencv2/core/utils/logger.hpp>//隐藏日志
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;

int main() {
    //隐藏日志,不写也可以
	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);
	cout << "-----------start to read Video-------------" << endl;

    //也可以使用capVideo.open("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");
	VideoCapture capVideo("C:\\Users\\86173\\Desktop\\TI\\cat.mp4");

	//保存文件初始化,VideoWriter为OpenCV中定义的视频保存类
	VideoWriter writer;

	int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');//选择编码方式
	
    // 输出的视频地址及名字
	string filename = "C:\\Users\\86173\\Desktop\\TI\\cat1.mp4";


	cout << "输出的视频地址:" << filename << endl;//地址及名字
	//VideoWriter::fourcc;
	double fps = capVideo.get(CAP_PROP_FPS);//定义帧率

	Size vSize;//保存的视频的尺寸,此处尺寸缩小一半
	vSize.width = capVideo.get(CAP_PROP_FRAME_WIDTH) / 2;
	vSize.height = capVideo.get(CAP_PROP_FRAME_HEIGHT) / 2;

	//打开视频流 CAP_PROP_FOURCC
	writer.open(filename, codec, fps, vSize);

	Mat frame;
	Mat resizeFrame;
	Mat grayFrame;

	while (1) {
		//视频流中读取图像
		capVideo >> frame;

		if (frame.empty()) {
			cout << "Unable to read frame!" << endl;
			destroyAllWindows();
			return -1;
		}

		//保存到视频流,由于视频文件尺寸降为1/2,frame尺寸也要减半
		resize(frame, resizeFrame, vSize);
		writer.write(resizeFrame);

		//可以接各种处理
		cvtColor(frame, grayFrame, CV_RGB2GRAY);

		imshow("frame", frame);//原视频
		imshow("resizeFrame", resizeFrame);//尺寸减半视频
		imshow("gray", grayFrame);//灰度视频

		//显示图片,延时30ms,必须要加waitKey(),否则无法显示图像
		//等待键盘相应,按下ESC键退出
		if (waitKey(30) == 27) {
			destroyAllWindows();
			break;
		}
	}

	destroyAllWindows();
	return 0;
}

三、运行结果

 运行程序保存的视频cat1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值