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;
}
}
}