opencv视频文件的读取,处理与保存

这篇具有很好参考价值的文章主要介绍了opencv视频文件的读取,处理与保存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv视频文件的读取,处理与保存

一、视频文件的读取:
1、cv::VideoCapture是OpenCV库中用于处理视频输入的类,它提供了一种简单的方法来从摄像头,视频文件、或图像序列中读取帧;
(1)打开摄像头:
cv::VideoCapture capture(int index)

参数解释:
index:打开指定编号的摄像头,编号0表示默认摄像头,如果你的计算机连接了多个摄像头,你可以使用不同的编号来选择不同的摄像头;

(2)打开视频文件:
cv::VideoCapture capture(const std::string& filename)

参数解释:
filename:打开指定的视频文件,你需要提供视频文件的路径和名称作为参数;

(3)打开网络摄像头:
cv::VideoCapture capture(const std::string& apiKey, const std::string& deviceId)

参数解释:
用于打开网络摄像头,需要提供相应的API密钥和设备ID;

(4)打开图像序列:
cv::VideoCapture capture(const std::string& pattern, int api)

参数解释:
用于打开图像序列,需要提供文件名模式(通配符)和相应的API;

2、cv::VideoCapture类的常用方法:
(1)capture.get():用于获取视频的属性,比如帧数、帧率等:
capture.get(int propId)

参数解释:
propId:是一个整数参数,用于指定你想获取的属性类型(
    	cv::CAP_PROP_FRAME_COUNT:获取视频的帧数;
    	cv::CAP_PROP_FPS:获取视频的帧率(每秒帧数);
	cv::CAP_PROP_FRAME_WIDTH:视频帧的宽度;
	cv::CAP_PROP_FRAME_HEIGHT:视频帧的高度;
)

示例:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 初始化一个cv::VideoCapture对象,打开视频文件
	VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");
	if (!capture.isOpened()) {
		std::cerr << "Error: 无法打开视频文件." << std::endl;
		return -1;
	}
	// 调用cv::VideoCapture类的get()方法,获取视频宽度,高度,帧数,帧率
	int frameWidth = capture.get(cv::CAP_PROP_FRAME_WIDTH);
	int frameHeight = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
	int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT);
	double fps = capture.get(cv::CAP_PROP_FPS);

	std::cout << "frame width:" << frameWidth << std::endl;
	std::cout << "frame height:" << frameHeight << std::endl;
	std::cout << "Number of Frames:" << frameCount << std::endl;
	std::cout << "FPS:" << fps << std::endl;

	capture.release(); // 释放VideoCapture对象
}

(2)capture.set(int propId, double value):用于设置视频的属性,比如设置视频的帧率、帧大小等属性;
capture.set(int propId, double value)

参数解释:
propId:指定了你想设置的属性类型;
value:要设置的值;

示例:

cv::VideoCapture capture(0); // 打开默认摄像头

if (!capture.isOpened()) {
    std::cerr << "Error: 无法打开摄像头." << std::endl;
    return -1;
}

capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
capture.set(cv::CAP_PROP_FPS, 30);

capture.release(); // 释放VideoCapture对象

(3)capture.read(cv::Mat& frame):用于读取视频的一帧,将其存储在 cv::Mat 对象中;

示例:

cv::VideoCapture capture("video_file.mp4");

if (!capture.isOpened()) {
    std::cerr << "Error: 无法打开视频文件." << std::endl;
    return -1;
}

cv::Mat frame;
capture.read(frame);

// 在这里可以对 frame 进行处理

capture.release(); // 释放VideoCapture对象

(4)capture.release():用于释放 VideoCapture 对象所占用的资源,一般在你已经完成了对视频流的操作后调用它;
二、对视频帧进行处理:

循环遍历视频的每一帧,可以在循环内部对每一帧进行处理在这里,我注释掉了处理部分,你可以根据需要添加各种图像处理操作,比如滤波、边缘检测等;

代码示例:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	// 打开视频文件
	VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");

	// 检查视频是否成功打开
	if (!capture.isOpened()) {
		std::cerr << "Error: 无法打开视频文件." << std::endl;
		return -1;
	}

	// 获取视频的帧数和帧率
	int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT);
	double fps = capture.get(cv::CAP_PROP_FPS);

	// 创建一个VideoWriter对象来保存处理后的视频
	cv::VideoWriter outVideo("outVideo.mp4", capture.get(CAP_PROP_FOURCC), fps, cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT)));

	// 循环处理视频的每一帧
	for (int i = 0; i < frameCount; ++i) {
		cv::Mat frame;
		capture >> frame; // 读取一帧

		if (frame.empty()) {
			break;
		}

		// 在这里可以对frame进行处理,比如进行滤波、边缘检测等
		// 例如:cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);

		// 将处理后的帧写入输出视频文件
		outVideo << frame;
	}

	// 释放VideoCapture和VideoWriter对象
	capture.release();
	outVideo.release();

	std::cout << "视频处理完成." << std::endl;
}

三、保存处理后的视频:
1、cv::VideoWriter 是opencv中用于将图像帧序列保存为视频文件的类,它可以将处理过的帧写入一个视频文件,也可以将视频流输出到摄像头或网络;
(1)创建一个 cv::VideoWriter 对象:

函数原型:

cv::VideoWriter writer(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true)

参数解释:
filename:要保存的视频文件名或者设备地址;
fourcc:FourCC编码,指定视频编解码器的类型(
	cv::VideoWriter::fourcc('X','V','I','D'):Xvid编解码器;
	cv::VideoWriter::fourcc('M','J','P','G'):MJPEG编解码器;
	cv::VideoWriter::fourcc('M','P','4','V'):MPEG-4编解码器;
	cv::VideoWriter::fourcc('H','2','6','4'):H.264编解码器;
);
fps:帧率,即每秒显示的帧数;
frameSize:帧的大小,可以通过cv::Size类指定;
isColor:指定保存的视频是否为彩色,默认为true
2、cv::VideoWriter类的常用方法:
(1)cv::VideoWriter::open():用于打开一个视频文件或设备以便写入视频帧;
cv::VideoWriter::open(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true)

参数解释:参数和构造函数类似;
filename:要保存的视频文件名或者设备地址;
fourcc:FourCC编码,指定视频编解码器的类型(
	cv::VideoWriter::fourcc('X','V','I','D'):Xvid编解码器;
	cv::VideoWriter::fourcc('M','J','P','G'):MJPEG编解码器;
	cv::VideoWriter::fourcc('M','P','4','V'):MPEG-4编解码器;
	cv::VideoWriter::fourcc('H','2','6','4'):H.264编解码器;
);
fps:帧率,即每秒显示的帧数;
frameSize:帧的大小,可以通过cv::Size类指定;
isColor:指定保存的视频是否为彩色,默认为true
(2)cv::VideoWriter::write():用于将一帧图像写入视频文件;
cv::VideoWriter::write(const Mat& image)

参数解释:
image:要写入视频的帧,通常是一个cv::Mat对象;

(3)cv::VideoWriter::isOpened():用于检查VideoWriter对象是否成功打开,如果成功打开了视频文件或者设备,该方法将返回true,否则返回false;
(4)cv::VideoWriter::release():用于释放VideoWriter对象所占用的资源,一般在你已经完成了对视频的写入操作后调用它;

示例:

我们首先创建了一个 VideoWriter 对象,指定了视频文件的名称、FourCC编码、帧率和帧大小。接着,我们检查是否成功打开了文件。然后,我们创建了一个红色的帧(640x480 大小的纯红色图像)并将其写入视频文件10次。最后,我们释放了 VideoWriter 对象。

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {

	Demo demo;
	// 初始化一个cv::VideoCapture对象,打开视频文件
	VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");
	// 调用cv::VideoCapture类的get()方法,获取视频宽度,高度,帧数,帧率
	int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);
	int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
	int count = capture.get(CAP_PROP_FRAME_COUNT);
	double fps = capture.get(CAP_PROP_FPS);
	std::cout << "frame width:" << frame_width << std::endl;
	std::cout << "frame height:" << frame_height << std::endl;
	std::cout << "FPS:" << fps << std::endl;
	std::cout << "Number of Frames:" << count << std::endl;
	// 初始化一个cv::VideoWriter 对象,保存处理后的视频文件
	// capture.get(CAP_PROP_FOURCC):获取原视频的编解码器
	// Size(frame_width, frame_height):原视频的宽高
	VideoWriter writer("C:\\cpp\\image\\test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);
	Mat frame;
	while (true) {
		// 读取视频的一帧,将其存储在frame对象中
		capture.read(frame);
		// TODO: do something...
		// 对读取到的这帧图像,做flip()翻转处理
		flip(frame, frame, 1);
		if (frame.empty()) {
			break;
		}
		// 显示这帧图像
		imshow("frame", frame);
		// 对这帧图像,做色彩空间转换
		demo.colorSpace(frame);
		// 将这帧图像写入视频文件
		writer.write(frame);

		int c = waitKey(1);
		if (c == 27) { // 退出
			break;
		}
	}

	// release
	capture.release();
	writer.release();
}

做色彩空间转换 demo.colorSpace()函数如下:文章来源地址https://www.toymoban.com/news/detail-764864.html

void Demo::colorSpace(Mat &image) {

	Mat gray, hsv;
	// 转hsv
	cvtColor(image, hsv, COLOR_BGR2HSV);
	// 转灰度
	cvtColor(image, gray, COLOR_BGR2GRAY);

	// 显示这两张图
	imshow("HSV",hsv);
	imshow("GARY", gray);

	// 保存这两张图
	imwrite("C:\\cpp\\vs\\opencv\\hsv.png", hsv);
	imwrite("C:\\cpp\\vs\\opencv\\gray.png", gray);

}

到了这里,关于opencv视频文件的读取,处理与保存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • gocv读取gif多帧图像,mp4视频图像,opencv,VideoCaptureFile,opencv_ffmpeg

    读取GIF图像 opencv中无法读取gif图像,这是由于license原因。转而使用 videocapture 或者第三方的 PIL 库(Python),但是其实Golang的基础库 image 中就有读取gif图像的。于是一个简单的示例如下 这里只会播放一遍gif图像,我们还可以解析gif中的LoopCount来增加循环播放的逻辑。 读取

    2024年02月12日
    浏览(54)
  • python opencv 读取文件夹下所有MP4文件并解析成jpg图像

    你可以使用Python的OpenCV库来读取文件夹中的所有MP4文件,并将其解析为JPG图像。以下是一个示例代码,演示了如何实现这个功能,并设置解析间隔为3帧: 请确保你已经安装了OpenCV库(可以使用pip install opencv-python进行安装)。将代码中的\\\"path/to/input/folder\\\"替换为包含MP4文件的实

    2024年01月19日
    浏览(64)
  • 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4

    本文主要介绍如何使用ffmpeg批量下载视频到本地并保存成指定格式。 当我们希望将网页上的视频下载到本地的时候,我们可能获取到的视频地址是指向 .m3u8 格式的,当视频多的时候,手动下载并使用工具转换格式就显得工作量过大。 ffmpeg 是一个强大的音视频处理工具,具体

    2024年02月16日
    浏览(78)
  • android opencv 调用硬编码mediacodec保存mp4

    目录 c++ opencv部分 java 编码部分 Java jni声明: java调用: 获取类函数签名:

    2024年02月11日
    浏览(55)
  • Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

    用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22) Invalid argument,

    2024年04月11日
    浏览(58)
  • opencv从视频文件读取视频内容,从摄像头读取保存视频内容

    (1)argparse模块使编写用户友好的命令行接口变得容易。 (2)程序定义了它需要的参数,而argparse将找出如何从sys.argv中解析这些参数。 (3)argparse模块还会自动生成帮助和使用消息,并在用户给程序提供无效参数时发出错误信息。 import argparse # 导入库 parser = argparse.Argume

    2024年02月22日
    浏览(57)
  • C# 使用ffmpeg将图片保存为mp4视频

    使用 FFmpeg 这个强大的多媒体处理工具,可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务: 命令参数说明: -framerate 25 :设置输入图像序列的帧率,这里表示每秒25帧。 -i image-%03d.jpg :指定输入文件格式,这里的  %03d  是一个

    2024年04月27日
    浏览(47)
  • python opencv 读取mp4,上一帧,下一帧

    目录 安装pynput: python opencv 读取mp4, 有上一帧,下一帧的功能 队列 缓存最新版,有帧号 队列封装成类版本: pip install pynput 这个每次读取self.cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index),后退读取稍微有点慢,

    2024年02月07日
    浏览(54)
  • uniapp - 【全端兼容】实现保存视频到手机相册功能,将 mp4 在线视频下载并存储到用户的手机中,uniapp App h5 小程序将视频文件下载保存(详细示例源码及注释一键复制,开箱即用!)

    在uniapp开发中,实现安卓苹果app、h5网页网站、小程序保存视频到相册功能,点击保存按钮后下载视频并将其存储到用户的手机相册中,完整示例源码及注释,新手小白开箱即用! 直接复制代码,稍微改下就能用到你的项目中去了(保证可用)。 可复制运行,或按需复制。

    2024年02月09日
    浏览(185)
  • Qt/C++音视频开发46-音视频同步保存到MP4

    用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可。最难的是在播放过程中不断随机的切换播放进度,而且还会暂停播放、暂停录制的情况出现,这

    2024年02月17日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包