openCV视频的读写操作

openCV视频的读写操作

视频和摄像头的打开操作

在opencv当中视频的打开主要依靠一个类VideoCapture,在构造对象时,打开视频和摄像头主要区别就是初始的参数

如下列

VideoCapture cap = VideoCapture("1.mp4");//打开当前文件夹中名为1.mp4的视频
VideoCapture cap = VideoCapture(0);//打开摄像头

显然我们不难看出,如果你想要打开摄像头,那么你的初始化参数就应该是0;

如果你要打开视频文件的时候,那么就应该是你当前视频的路径+名字

用来检测视频或者摄像头是否打开成功的函数是VideoCapture 类中的成员函数isOpened();

if (!cap.isOpened())
	{
		cout << "摄像头打开失败" << endl;
		return;
	}
	else
	{
		cout << "摄像头打开成功" << endl;
	}

显然我们可以知道当摄像头打开成功时会返回true,失败时就会返回false,我们常常用这个函数来检测摄像头或者视频是否打开成功,可以用这个函数来寻找到错误。

视频转图片保存

视频的保存主要用到一个类 VideoWriter 。

首先我们要了解到视频的本质其实就是一张又一张的图片组成的。因此视频转图像保存我们只需要将视频的每一帧都拆成图片,然后把图片分别保存就行了。

在下面代码中名字我写成缺省的。

void Video::GetVideo(string Name)//打开视频
{
	cap = VideoCapture(Name);
	if (!cap.isOpened()) 
	{
		cout << "视频打开失败"<<endl;
	};
}
void Video::SaveToImg(string Name)
{
	Mat img;//构建一个对象
	int index = 0;
	while (true) 
	{
		cap >> img;//将视频进行拆分,流向图片
		if (img.empty()) //如果img为空说明流完了
		{
			break;
		};
		imshow("图片",img);//把每一次的图片显示出来
		string name = Name + to_string(index++)+"jpg";
		imwrite(name,img);//保存每一次的图片
	}
}

摄像头转录像保存

在上面我们了解到了视频的本质,因此如果想要把摄像头采集到的画面转成录像,我们只需要将摄像头采集到的每一帧画面都保存在一起就行了。

void Video::Camera(string Name)
{
	cap = VideoCapture(0);//打开摄像头
	if (!cap.isOpened())//检测摄像头是否打开
	{
		cout << "视频打开失败" << endl;
		return;
	};
	int h = cap.get(CAP_PROP_FRAME_HEIGHT);//获取摄像头图像的高
	int w = cap.get(CAP_PROP_FRAME_WIDTH);//获取摄像头图像的宽
	save.open(Name, VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, Size(w, h), true);//打开,如何保存
	Mat img;
	while (true)
	{
		cap >> img;//将摄像头采集到的每一帧画面转成图片
		imshow("摄像头",img);//把每一帧都显示出来
		save << img;//将图片流到save中去
		if (waitKey(10) == 27) //检测,按ESC键退出
		{
			break;
		}
	}
}

视频另存

视频另存的方式其实和摄像头转录像保存的方法差不多,就是打开方式不一样而已。

void Video::GetVideo(string Name)//打开视频
{
	cap = VideoCapture(Name);
	if (!cap.isOpened()) 
	{
		cout << "视频打开失败"<<endl;
	};
}
void Video::SaveVideo(string Name)
{
	int h = cap.get(CAP_PROP_FRAME_HEIGHT);
	int w = cap.get(CAP_PROP_FRAME_WIDTH);
	int fps = cap.get(CAP_PROP_FPS);
	save.open(Name, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(w,h),true);
	Mat img;
	while (true) 
	{
		cap >> img;
		if (img.empty()) 
		{
			break;
		};
		imshow("视频",img);
		save << img;
	}
}

综合代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<string>
using namespace std;
using namespace cv;
class Video
{
public:
	Video();
	~Video();
	void GetVideo(string Name="1.mp4");
	void SaveVideo(string Name="out.avi");
	void SaveToImg(string Name="1/img");
	void Camera(string Name="录像.avi");
protected:
	VideoCapture cap;
	VideoWriter save;
};
Video::Video()
{
}
Video::~Video()
{
	cap.release();
	save.release();
}
void Video::GetVideo(string Name)
{
	cap = VideoCapture(Name);
	if (!cap.isOpened()) 
	{
		cout << "视频打开失败"<<endl;
	};
}
void Video::SaveVideo(string Name)
{
	int h = cap.get(CAP_PROP_FRAME_HEIGHT);
	int w = cap.get(CAP_PROP_FRAME_WIDTH);
	int fps = cap.get(CAP_PROP_FPS);
	save.open(Name, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(w,h),true);
	Mat img;
	while (true) 
	{
		cap >> img;
		if (img.empty()) 
		{
			break;
		};
		imshow("视频",img);
		save << img;
	}
}
void Video::SaveToImg(string Name)
{
	Mat img;
	int index = 0;
	while (true) 
	{
		cap >> img;
		if (img.empty()) 
		{
			break;
		};
		imshow("图片",img);
		string name = Name + to_string(index++)+"jpg";
		imwrite(name,img);
	}
}
void Video::Camera(string Name)
{
	cap = VideoCapture(0);
	if (!cap.isOpened())
	{
		cout << "视频打开失败" << endl;
		return;
	};
	int h = cap.get(CAP_PROP_FRAME_HEIGHT);
	int w = cap.get(CAP_PROP_FRAME_WIDTH);
	save.open(Name, VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, Size(w, h), true);
	Mat img;
	while (true)
	{
		cap >> img;
		imshow("摄像头",img);
		save << img;
		if (waitKey(10) == 27) 
		{
			break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/m0_68715820/article/details/126209989